spring
北纬@叶枫
这个作者很懒,什么都没留下…
展开
-
Spring 中的bean 是线程安全的吗?
Java虚拟机栈是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。原创 2020-10-29 16:22:11 · 1218 阅读 · 1 评论 -
@Configuration注解的类的加载(注意不是处理@Configuration注解处理)实现原理
概述这里主要分析@Configuration注解的类自身的加载的实现,即生成该类对应的BeanDefinition,注册到BeanFactory,此时该类就跟一个普通使用了如@Component注解的类一样,是在创建和初始化BeanFactory的过程中完成的。而@Configuration注解的处理是通过ConfigurationClassPostProcessor来完成的,ConfigurationClassPostProcessor是一个BeanFactoryPostProcessor接口实现类。转载 2020-07-02 15:08:27 · 1518 阅读 · 0 评论 -
Spring基于@Configuration的类配置的内部源码实现
概述 Spring容器启动时,即ApplicationContext接口实现类的对象实例执行refresh方法时,主要是通过执行ConfigurationClassPostProcessor这个BeanFactoryPostProcessor,来开启整个@Configuration注解的系列类的加载的,即开启基于@Configuration的类配置代替beans标签的容器配置的相关bean的加载。 而ConfigurationClassPostProcessor注册到Spring容器的Bea转载 2020-07-02 14:49:43 · 162 阅读 · 0 评论 -
Spring基于@Configuration的类配置的用法
使用@Configuration来注解类,在类里面包含多个@Bean注解的方法。这些使用@Bean注解的方法,会被加载为BeanFactory里面的BeanDefinition,其中beanName默认为方法名,并且默认会创建对应的bean对象实例,其中bean默认的热加载和单例的。其实@Configuration注解的类,就相当于一个xml配置文件的beans标签。 使@Configuration注解的类生效方式,即被spring容器ApplicationContext感知并加载。 使用Annota.转载 2020-07-02 14:43:50 · 821 阅读 · 0 评论 -
Spring AOP源码分析(三):基于JDK动态代理和CGLIB创建代理对象的实现原理
IOC容器的bean对象创建在之前的文章中已经分析过IOC容器的bean对象的创建过程,具体在:Spring IOC源码分析(七):IOC容器的设计实现与bean对象的创建流程,其中核心方法为AbstractAutowireCapableBeanFactory的createBean:首先检查是否创建了bean的代理对象,如果创建了bean的代理对象则直接返回;否则进入正常bean对象的创建流程,具体在doCreateBean方法定义。 // 代理bean对象创建try { // Give Be转载 2020-07-01 15:57:05 · 241 阅读 · 0 评论 -
Spring AOP源码分析(二):AOP的三种配置方式与内部解析实现
AOP配置在应用代码中,可以通过在spring的XML配置文件applicationContext.xml或者基于注解方式来配置AOP。 AOP配置的核心元素为:pointcut,advisor,aspect,pointcut用于定义需要该辅助功能的类或方法集合;advisor则是将advice和pointcut结合起来,在spring的IOC容器启动时,为pointcut匹配的类生成代理对象,使用拦截器拦截对应的方法的执行,将辅助功能advice添加进去;aspect表示一个完整切面,即在aspec转载 2020-07-01 15:49:38 · 242 阅读 · 0 评论 -
Spring AOP源码分析(一):AOP与基础接口设计
一、概述SpringAOP设计的主要目的是将多个方法中的公用逻辑抽离出来,封装在一个Interctor拦截器中,然后使用该拦截器对这些方法的调用Invocation进行拦截,从而将这些公用逻辑添加回去,完成一次完整的方法调用。从而实现公用逻辑的复用,避免同一个公用功能的代码重复定义、实现,造成代码冗余。 从应用程序编码到应用程序执行的完整过程来看: 首先在应用代码的方法中定义业务逻辑,然后在xml文件中使用AOP相关的标签描述这个方法或者在这个方法中添加AOP相关的注解,此时应用程序编码层面的.转载 2020-07-01 15:42:59 · 147 阅读 · 0 评论 -
基于注解@EnableWebMvc启用SpringMvc的用法与实现原理
用法与最佳实践 在@Configuration注解的配置类中添加,用于为该应用添加SpringMVC的功能,即添加之后可以在项目中,可以使用@RequestMapping,@Controller等注解来定义请求处理与请求uri的映射和其他SpringMvc提供的功能。使用方法如下: @Configuration@EnableWebMvc@ComponentScan(basePackageClasses = MyConfiguration.class)public class MyConfi转载 2020-07-01 15:36:44 · 459 阅读 · 0 评论 -
Spring的构造函数注入的循环依赖问题
一、循环依赖spring的循环依赖主要是指两个类相互之间通过@Autowired自动依赖注入对方,即类A包含一个类B的对象引用并需要自动注入,类B包含一个类A的对象引用也需要自动注入。 对于循环依赖问题,spring根据注入方式的不同,采取不同的处理策略,对于双方都是使用属性值注入或者setter方法注入,则spring可以自动解决循环依赖注入问题,应用程序可以成功启动;对于双方都是使用构造函数注入对方或者主bean对象(Spring在启动过程中,先加载的bean对象)使用构造函数注入,则spri转载 2020-07-01 15:31:13 · 2434 阅读 · 0 评论 -
Spring的三种依赖注入方式的使用和源码实现分析
一、自动依赖注入的方式注解类型 spring提供了基于注解的属性自动注入特性,其中可以可用的注解包括spring自身提供的@Autowired和@Value,其中@Autowired是我们在项目中最常用来注入对象属性的,@Value注解通常用于注入属性文件properties的值,除此之外还可以使用JSR-330提供的注解@Inject,类型为javax.inject.Inject。如下: @Componentpublic class NettyServer { @Autowire转载 2020-07-01 15:15:18 · 259 阅读 · 0 评论 -
Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理
注入实现方式@Autowired是spring框架提供的实现依赖注入的注解,主要支持在set方法,field,构造函数中完成bean注入,注入方式为通过类型查找bean,即byType的,如果存在多个同一类型的bean,则使用@Qualifier来指定注入哪个beanName的bean。 与JDK的@Resource的区别:@Resource是基于bean的名字,即beanName,来从spring的IOC容器查找bean注入的,而@Autowried是基于类型byType来查找bean注入的。 与转载 2020-07-01 15:01:54 · 316 阅读 · 0 评论 -
Spring Bean对象初始化和销毁相关回调的用法和源码实现
一、概述构造后置处理:在spring容器启动,加载并创建bean对象实例的时候调用,通常为在构造bean对象实例,将相关属性赋值好了调用。 销毁前置处理:在spring容器关闭,在销毁其所创建并管理的bean对象实例之前,执行销毁前置处理,通常可以用来释放外部资源等。二、使用方法1. JDK注解方式构造后置处理:使用@PostConstruct注解对应的方法 销毁前置处理:使用@PreDestroy注解对应的方法。可以应用在一个或多个方法上面,但是推荐使用一个方法。方法的可见性没有严格要转载 2020-07-01 14:58:47 · 403 阅读 · 0 评论 -
Spring源码分析:applicationContext.xml文件解析与NamespaceHandler
applicationContext.xml文件解析Spring容器启动,在创建BeanFactory时,需要加载和解析当前ApplicationContext对应的配置文件applicationContext.xml,从而获取bean相关的配置信息。 在内部实现的调用关系为:ApplicationContext通过XmlBeanDefinitionReader来完成从applicationContext.xml获取应用配置的bean信息,并注册到关联的BeanFactory中。XmlBeanDefi转载 2020-07-01 14:49:24 · 282 阅读 · 0 评论 -
Spring IOC源码分析(七):IOC容器的对象存储体系与bean对象的加载流程
一、IOC容器的对象存储体系1. 获取bean对象 spring主要通过BeanFactory接口的getBean方法来从IOC容器,即BeanFactory的实现类中获取某个bean对象实例,如下为BeanFactory的getBean方法定义: public interface BeanFactory { ... /** * Return an instance, which may be shared or independent, of the specif转载 2020-07-01 14:40:31 · 389 阅读 · 0 评论 -
Spring IOC源码分析(六):BeanFactory体系结构与IOC容器的核心组件分析
一. 概述Spring容器通常指的是ApplicationContext的体系结构设计,即整个Spring框架的IOC功能,是通过ApplicationContext接口实现类来提供给应用程序使用的。应用程序通过ApplicationContext提供方法来间接与内部Bean工厂交互,如获取Bean对象实例等。 在Spring框架内部设计当中,ApplicationContext是Spring容器所管理、维护的beans对象的一个运行环境,即ApplicationContext包含一些功能组件:保存外转载 2020-06-29 15:28:19 · 197 阅读 · 0 评论 -
Spring IOC源码分析(五):IOC的容器上下文ApplicationContext的自顶向下分析
一、spring-context包:IOC的容器上下文1. ApplicationContext接口public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver最顶层接口,通过继承BeanFactory转载 2020-06-29 10:25:20 · 145 阅读 · 0 评论 -
Spring MVC源码分析(四):请求处理器体系结构设计与实现
一、概述在我的上一篇文章:Spring源码分析(三):DispatcherServlet的设计与实现中提到,DispatcherServlet在接收到客户端请求时,会遍历DispatcherServlet自身维护的一个HandlerMapping集合,来查找该请求对应的请求处理器,然后由该请求处理器来执行请求处理。 在SpringMVC中,DispatcherServlet通过HandlerMapping接口来定义请求和请求处理器之间的映射关系,通过HandlerAdapter接口来提供一个模板实现,转载 2020-06-28 18:28:02 · 179 阅读 · 0 评论 -
Spring MVC源码分析(三):请求分发器DispatcherServlet的设计与实现
一、概述DispatcherServlet是SpringMVC的一个前端控制器,是MVC架构中的C,即controller的实现,用于拦截这个web应用的所有请求,具体为在web.xml中配置这个servlet,对应的url-pattern设置为“/”,或者使用servlet3.0之后的WebApplicationInitializer来配置,在web容器启动这个应用时,会创建和初始化这个DispatcherServlet对象实例。 DispatcherServlet在接收到请求之后,会根据请求的ur转载 2020-06-28 18:12:27 · 766 阅读 · 0 评论 -
Spring MVC源码分析(二):Spring容器的加载
一、Tomcat引导Spring容器的加载:ContextLoaderListener 在我的上一篇文章:Spring源码分析(一):从哪里开始看spring源码,分析过在web容器,如tomcat,启动web应用时,会通过监听器的方式,通知ServletContextListener,web容器开始启动web应用了,ServletContextListener可以自定义初始化逻辑。ContextLoaderListener就是ServletContextListener接口的一个实现类,主要负责加载转载 2020-06-28 18:06:06 · 134 阅读 · 0 评论 -
Spring源码分析(一):从哪里开始看spring源码
一、概述对于大多数第一次看spring源码的人来说,都会感觉不知从哪开始看起,因为spring项目源码由多个子项目组成,如spring-beans,spring-context,spring-core,spring-aop,spring-web,spring-webmvc等,整个项目结构如图: 可能有人会觉得,既然spring是一个IOC容器或者说是一个bean的容器,那么应该从spring-beans看起,先了解spring是如何从xml文件配置获取需要创建的bean的信息,但是这里有个问题就是转载 2020-06-11 15:37:33 · 597 阅读 · 0 评论 -
Spring基于@Configuration的类配置的内部源码实现
概述Spring容器启动时,即ApplicationContext接口实现类的对象实例执行refresh方法时,主要是通过执行ConfigurationClassPostProcessor这个BeanFactoryPostProcessor,来开启整个@Configuration注解的系列类的加载的,即开启基于@Configuration的类配置代替beans标签的容器配置的相关bean的加载。 而ConfigurationClassPostProcessor注册到Spring容器的BeanFacto转载 2020-06-09 17:27:56 · 190 阅读 · 0 评论