![](https://img-blog.csdnimg.cn/20210909114620822.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Spring
文章平均质量分 77
Spring
码上得天下
这个作者很懒,什么都没留下…
展开
-
AopContext.currentProxy()
原来在springAOP的用法中,只有代理的类才会被切入,我们在controller层调用service的方法的时候,是可以被切入的,但是如果我们在service层 A方法中,调用B方法,切点切的是B方法,那么这时候是不会切入的,解决办法就是如上所示,在A方法中使用((Service)AopContext.currentProxy()).B() 来调用B方法,这样一来,就能切入了!转载 2024-05-27 00:02:35 · 59 阅读 · 0 评论 -
Spring的FactoryBean多例问题
FactoryBean默认创建是多例的,这里以mybatis的Mapper接口为例,原创 2024-05-21 15:30:28 · 397 阅读 · 0 评论 -
Spring 单例bean 不被 GC 的真正原因
传统项目是通过把ioc容器设置到tomcat的应用上下文来保证不会被gc的,而springBoot项目是通过注册一个钩子函数,使IOC容器和根类加载器加载的类Runtime的静态属性关联从而不被gc。另外springboot项目也会像传统项目那样把ioc容器设置到tomcat应用上下文,为啥这个不能保证不被gc呢?这是因为内嵌tomcat是ioc容器的一个属性,它是随ioc生而生,随ioc死而死的。如下:另外多例bean是会被回收的,因为它不像单例那样会用一个Map保存起来,而是用的时候新建。原创 2024-05-19 00:53:05 · 439 阅读 · 0 评论 -
八种常见Bean加载方式
关于bean的加载方式,spring提供了各种各样的形式。已知类通过(类名.class)交给spring管理已知类名通过(类名字符串)并交给spring管理。两种形式内部其实都一样,都是通过spring的BeanDefinition对象初始化spring的bean。bean的定义由前期xml配置逐步演化成注解配置,本质是一样的,都是通过反射机制加载类名后创建对象,对象就是spring管控的bean。转载 2023-10-26 10:07:52 · 757 阅读 · 0 评论 -
Spring Bean加载顺序的控制
最终测试结果为:一般情况下会按照SPring类的书写的顺序去创建,但是也不一定,最终其实得看你的编译出来的文件,的Class文件到底是什么样子的,包括操作系统文件的排序规则等一系列的因素。此时这里使用@Component是不起作用的,但是上面的@Order注解就不会有影响,无聊是使用@Configurantion还是@Component都是一个效果。以上三个注解在同包和不同包都是不起作用的,和@Order是一样的也是通过书写顺序去创建的。对这两个类不是很熟悉的同学可以去下载Spring源码简单的阅读一下。转载 2023-09-23 12:36:46 · 196 阅读 · 0 评论 -
一文详解Spring如何控制Bean注入的顺序
控制bean的加载顺序的方法构造方法依赖@DependsOn 注解3BeanPostProcessor 扩展Bean初始化顺序与类加载顺序基本一致:静态变量/语句块=> 实例变量或初始化语句块=> 构造方法=> @Autowirebean注入的顺序。转载 2023-06-12 18:55:08 · 1718 阅读 · 0 评论 -
Spring AOP 中 AbstractAdvisorAutoProxyCreator、AbstractAdvisingBeanPostProcessor的区别
在分析 @Aspect 和 @Transactional 的实现时,我们发现,Spring AOP 代理类都是通过 AutoProxyCreator(通常是: AnnotationAwareAspectJAutoProxyCreator)来产生的。而在分析 @Async 时,则发现,Spring AOP 代理类是通过 AsyncAnnotationBeanPostProcessor 来生成的。这两种方式有什么相同点和不同点呢?下面我们就来分析一下。转载 2023-05-24 17:02:44 · 244 阅读 · 0 评论 -
为什么@Async标记的bean循环依赖时会报错?
那么,为什么同样是 AOP 代理 bean,差别就这么大呢?转载 2023-05-24 16:47:31 · 112 阅读 · 0 评论 -
@Lazy原理分析——它为什么可以解决特殊的循环依赖问题?
前面分析循环依赖问题时,我们遇到了一些 Spring 无法解决的循环依赖问题,最终都通过@Lazy解决了。那@Lazy是什么原理呢?它为什么可以解决这种特殊的循环依赖问题?下面我们就来探索一下!转载 2023-05-24 14:19:22 · 850 阅读 · 0 评论 -
哪些循环依赖问题Spring解决不了?
大家都知道 Spring 解决了循环依赖的问题,网上也可以搜到 Spring 是使用三级缓存来解决循环依赖的。但有些时候循环依赖问题还是会导致启动报错。也就说明,在某些情况下,Spring 是没有办法解决循环依赖问题的。我们就来探究一下,哪些循环依赖场景是 Spring 没办法解决的?转载 2023-05-24 14:06:15 · 1014 阅读 · 0 评论 -
为什么要用三级缓存来解决循环依赖问题?二级缓存行不行?一级缓存行不行?
如果在 initializeBean 的时候记录缓存,那么碰到循环依赖的情况,需要在 populateBean(第二阶段) 的时候再去注入循环依赖的 bean,此时,缓存中是没有循环依赖的 bean 的,就会导致 bean 重新创建实例。假设 bean 是需要 AOP 增强的,那么最终放到缓存中的应该是一个代理 bean。再利用上面的反例来分析一遍,放入一级缓存的 bean 与暴露到容器中的 bean (不管是否有代理)始终是同一个 bean,看似好像是没有问题的,好像是可以解决循环依赖的问题。转载 2023-05-23 16:40:12 · 1094 阅读 · 3 评论 -
Spring 是怎样解决循环依赖问题的?
举个例子,A依赖B,B依赖A和C和D,C和D又依赖A,创建A的时候初始化需要B,创建B的时候初始化需要A,拿到A的ObjectFactory后调用接口方法获取对象,B还需要C和D,它们又需要去调用A的ObjectFactory,所以就重复调用了getObject方法,其实只要getEarlyBeanReference方法实现保证同一个beanName返回同一个对象,就不需要第二级缓存。相信这样的文档会很让使用者很困惑:这两个方法都会执行,而且第一个方法的返回值为优先,所以我实现第二个方法干嘛呢?转载 2023-05-23 01:33:14 · 160 阅读 · 0 评论 -
springboot启动流程源码解析(带流程图)
版权声明:本文为CSDN博主「wuweixianzheng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/zkr1234562/article/details/128053698。转载 2023-05-22 21:06:35 · 730 阅读 · 0 评论 -
Spring 的 @Autowired 三种注入方式
今天使用Idea写代码的时候,看到之前的项目中显示有warning的提示,去看了下,是如下代码。转载 2023-05-18 16:55:53 · 855 阅读 · 0 评论 -
Spring中的@Qualifier,你真的会用么?
通常有 4 种用法,第 1 种比较常见,会另外 3 种的都是高手了,下面来细看下。转载 2023-03-27 10:59:21 · 3955 阅读 · 0 评论 -
Spring MVC 原理与源码专栏
Spring MVC 实现原理与源码解析系统 —— 精品合集 | 芋道源码 —— 纯源码解析博客摘要: 原创出处 http://www.iocoder.cn/Spring-MVC/good-collection/ 「芋道源码」欢迎转载,保留摘要,谢谢!1. 【芋艿】精尽 Spring MVC 原理与源码专栏2. 【zhisheng】Spring MVC 源码解析3. 【相见欢】Sprihttps://www.iocoder.cn/Spring-MVC/good-collection/?title...转载 2021-11-25 15:43:45 · 104 阅读 · 0 评论 -
SpringBoot项目启动时初始化操作的几种方式
前言通常的我们的项目开发中,经常会遇到那种在服务一启动就需要自动执行一些业务代码的情况。比如将数据库中的配置信息或者数据字典之类的缓存到redis,或者在服务启动的时候将一些配置化的定时任务开起来。关于spring mvc或者springboot如何在项目启动的时候就执行一些代码,方法其实有很多,我这边介绍一下我使用过的三种。1、@PostConstruct 注解从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDest转载 2021-11-20 10:19:52 · 11509 阅读 · 1 评论 -
Spring手动注册/销毁Bean
package org.demo.spring;import lombok.extern.slf4j.Slf4j;import org.example.rest.User;import org.springframework.beans.factory.support.BeanDefinitionBuilder;import org.springframework.beans.factory.support.DefaultListableBeanFactory;import org.sprin.原创 2021-10-27 18:59:15 · 3119 阅读 · 0 评论 -
Spring手动注册/销毁多数据源
package org.demo.spring.mysql;import com.alibaba.druid.pool.DruidDataSource;import lombok.extern.slf4j.Slf4j;import org.apache.commons.collections.CollectionUtils;import org.demo.spring.mysql.dto.DataSourceDTO;import org.demo.spring.mysql.dto.Data...原创 2021-10-27 16:39:56 · 506 阅读 · 0 评论 -
SpringMVC源码分析之——处理请求核心流程之视图解析及全局异常处理
1.视图渲染前面讲到在返回值解析的时候,返回返回值并没有@ResponseBody注解修饰,那么代表的是一个视图的名称,存放在ModelAndView对象中,由springmvc进行转发接下来看看源码是怎么响应视图的创建了一个View对象,从之前配置的页面前缀+视图名称+配置的后缀组成一个完成的地址把响应数据设置到request对象中最后用Servlet中的RequestDispatcher进行转发2.全局异常处理在项目中,后台处理请求之后返回的数据都会.转载 2021-10-20 15:33:35 · 143 阅读 · 0 评论 -
SpringMVC源码分析之——处理请求核心流程之拦截器的调用
DispatchServlet处理请求核心流程:1. getHandler(processedRequest) 获取具体要执行的HandlerExecutionChain2. getHandlerAdapter 获取处理适配器3. mappedHandler.applyPreHandle 调用前置拦截器4. 执行controller.method方法5. mappedHandler.applyPostHandle 调用中置拦截器6. processDispatchResult 视图的渲染7转载 2021-10-20 15:17:27 · 137 阅读 · 0 评论 -
SpringMVC源码分析之——处理请求核心流程之controller_method的调用
DispatchServlet处理请求核心流程:1. getHandler(processedRequest) 获取具体要执行的HandlerExecutionChain2. getHandlerAdapter 获取处理适配器3. mappedHandler.applyPreHandle 调用前置拦截器4. 执行controller.method方法5. mappedHandler.applyPostHandle 调用中置拦截器6. processDispatchResult 视图的渲染.转载 2021-10-20 11:56:40 · 558 阅读 · 0 评论 -
SpringMVC源码分析之——处理请求核心流程之HandlerExecutionChain的获取
接下来就是请求处理的核心流程了1. getHandler(processedRequest) 获取具体要执行的HandlerExecutionChain2. getHandlerAdapter 获取处理适配器3. mappedHandler.applyPreHandle 调用前置拦截器4. 执行controller.method方法5. mappedHandler.applyPostHandle 调用中置拦截器6. processDispatchResult 视图的渲染7. 调用后置拦截器转载 2021-10-19 17:26:03 · 364 阅读 · 0 评论 -
SpringMVC源码分析之——controller方法和url的映射
前面讲到:在配置类引发的WebMvcConfigurationSupport类会用@Bean的方式,创建RequestMappingHandlerMapping对象,然后里面有拦截器,跨域配置等一系列配置信息,其中一个最重要的东西就是controller类中方法和请求url的映射关系也被保存在这个类中。后续DispatchServlet会根据请求的路径匹配到对应的方法,执行处理方法。RequestMappingHandlerMapping类继承结构可以看到RequestMappingHand转载 2021-10-19 16:26:50 · 1209 阅读 · 0 评论 -
SpringMVC源码分析之——DispatchServlet初始化工作
其实这篇没啥讲的, 上一篇讲的是springmvc组件放到spring容器中了接下来就是DispatchServlet中一些组件从spring容器中获取,然后放在他这个类里面。核心方法是在这里那么是如何被调到的呢?查看他的父类FrameworkServlet其中有一个内部类继承了ApplicationListener<ContextRefreshedEvent>, 所以onApplicationEvent方法会在spring容器加载完成之后被调到接下来转载 2021-10-19 16:12:20 · 178 阅读 · 0 评论 -
SpringMVC源码分析之——SpringMVC 源码分析之 FrameworkServlet
很多小伙伴都知道 SpringMVC 的核心是 DispatcherServlet,而 DispatcherServlet 的父类就是 FrameworkServlet,因此我们先来看看 FrameworkServlet,这有助于我们理解 DispatcherServlet。1.FrameworkServletFrameworkServlet 继承自 HttpServletBean,而 HttpServletBean 继承自 HttpServlet,HttpServlet 就是 JavaEE 里边的转载 2021-10-19 16:05:28 · 1383 阅读 · 0 评论 -
SpringMVC源码分析之——SpringMVC组件如何注册到Spring容器
上一篇讲到1.spring容器和spirngmvc容器都已经启动了2.DispatchServlet也在servlet容器加载了接下来看下springmvc是如何加载我们配置类中的信息的大体流程 :1.WebMvcConfigurationSupport 作为组件配置工厂 1.1 @bean HandlerMapping 1.1.1 加入拦截器 1.1.2 加入跨域配置 ......转载 2021-10-19 16:00:34 · 365 阅读 · 0 评论 -
SpringMVC源码分析之——Spring容器和SpringMVC子容器的启动
三个容器:1. servletContext tomcat的servlet容器2. AnnotationConfigWebApplicationContext spring上下文3. AnnotationConfigWebApplicationContext springmvc上下文总流程梳理:1. tomcat的spi调到META-INF/services/javax.servlet.ServletContainerInitializer文件中的ServletContainerIni转载 2021-10-19 15:38:58 · 500 阅读 · 0 评论 -
SpringMVC获取所有的controller和url映射关系
package org.demo.spring;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import org.springframework.web.bind.annotation.RequestMethod;import org.springfr...原创 2021-10-18 17:39:20 · 535 阅读 · 0 评论 -
利用PropertyPlaceholderHelper实现配置化的Param动态获取Value
package org.example;import org.junit.Test;import org.springframework.util.PropertyPlaceholderHelper;import java.util.Objects;import java.util.Properties;public class PropertyPlaceholderHelperTest { PropertyPlaceholderHelper helper = new Prope.原创 2021-09-24 17:53:12 · 232 阅读 · 0 评论 -
SpringMVC是否可以配置两个相同路径?
最近接触到若依这个框架,发现里面增删改的Controller层是这样写的:剛看到的时候很诧异,为啥@PostMapping和@PutMapping都没添加value属性并赋值呢,前端发起请求是怎么区分这两个映射呢,难道是根据方法名生成了system/user/add和system/user/edit两个url(在我的理解里是不会有相同的两个url出现在controller里的,于是开启想象力),翻了一遍代码也没看到哪里做了处理,于是直接打开项目操作了一下用户新增和编辑,发现请求路径都是system/原创 2021-09-30 16:05:52 · 1256 阅读 · 0 评论 -
Spring中11个最常用的扩展点
前言最近越来越多的读者认可我的文章,还是件挺让人高兴的事情。有些读者私信我说希望后面多分享spring方面的文章,这样能够在实际工作中派上用场。正好我对spring源码有过一定的研究,并结合我这几年实际的工作经验,把spring中我认为不错的知识点总结一下,希望对您有所帮助。一 如何获取spring容器对象1.实现BeanFactoryAware接口@Servicepublic class PersonService implements BeanFactoryAware { p转载 2021-10-13 15:24:19 · 1122 阅读 · 0 评论 -
Spring如何解决循环依赖?
1.由同事抛的一个问题开始最近项目组的一个同事遇到了一个问题,问我的意见,一下子引起的我的兴趣,因为这个问题我也是第一次遇到。平时自认为对spring循环依赖问题还是比较了解的,直到遇到这个和后面的几个问题后,重新刷新了我的认识。我们先看看当时出问题的代码片段:作者:苏三说技术链接:https://www.zhihu.com/question/438247718/answer/1730527725来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。@Se.转载 2021-10-12 11:48:41 · 676 阅读 · 0 评论 -
玩转Spring中强大的spel表达式!
Spel概述Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与Spring功能完美整合,如能用来配置Bean定义。表达式语言给静态Java语言增加了动态功能。SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用。Spel能干什么?表达式语言一般是用最简单的形式完成最主要的工作,减少我们的工作量。转载 2021-10-12 11:12:17 · 1936 阅读 · 0 评论 -
@Transactional 注解是如何实现的?
@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object oldProxy = null; boolean setProxyContext = false; Class<?> targetClass = null; Object target = null; try .转载 2021-09-16 18:45:33 · 1081 阅读 · 0 评论 -
Servlet监听器Listener实现在线人数统计
1.工作目录结构包含监听器类和jsp页面2.session监听器首先利用session监听器来实现对访问网站时的session计数,当有session创建+1,有session销毁-1。2.jsp页面沿用之前写的静态html页面代码(用HTML+CSS实现一个计科院网站首页静态页面 - zStao - 博客园),改成写jsp成页面,从servletcontext取“num”的值,在左上角显示人数3.运行效果客户端1(Sogou)客户端2(Firefox).转载 2021-09-15 19:30:10 · 589 阅读 · 0 评论 -
Spring采用@Autowired注入HttpServletRequest是线程安全的吗?
1213转载 2021-09-09 15:16:24 · 4351 阅读 · 6 评论 -
spring中过滤器(filter)、拦截器(interceptor)和切面(aop)的执行顺序
1.程序执行的顺序是先进过滤器,再进拦截器,最后进切面。注意:如果拦截器中preHandle方法返回的为false时,则无法进入切面,例子如下@RestController@RequestMapping("/user")public class UserController { @GetMapping("/{id:\\d+}") @JsonView(User.UserDetailView.class) public User getInfo(@PathVariable String转载 2021-09-08 17:32:30 · 4058 阅读 · 0 评论 -
Spring AOP无法拦截内部方法调用—— exposeProxy=true用法
假设一个接口里面有两个方法:package demo.long;public interface CustomerService { public void doSomething1(); public void doSomething2(); } 接口实现类如下:package demo.long.impl;import demo.long.CustomerService; public class CustomerServiceImpl imp转载 2021-09-09 11:20:38 · 1754 阅读 · 0 评论 -
Spring Bean的生命周期
Spring Bean的生命周期是Spring面试热点问题。这个问题即考察对Spring的微观了解,又考察对Spring的宏观认识,想要答好并不容易!本文希望能够从源码角度入手,帮助面试者彻底搞定Spring Bean的生命周期。只有四个!是的,Spring Bean的生命周期只有这四个阶段。把这四个阶段和每个阶段对应的扩展点糅合在一起虽然没有问题,但是这样非常凌乱,难以记忆。要彻底搞清楚Spring的生命周期,首先要把这四个阶段牢牢记住。实例化和属性赋值对应构造方法和setter方法的注入,初始化转载 2020-07-07 22:16:29 · 208 阅读 · 0 评论