Spring Framework源码分析
Spring Framework源码分析
一直不懂
笔记
展开
-
【Spring源码分析】42-@Conditional详解
1、@Conditional简介@Conditional注解指示组件仅在所有指定条件匹配时才有资格注册。@Conditional注解的value属性就是条件匹配Class对象,具体说是Condition接口实例数组。@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Do...原创 2019-11-19 00:35:17 · 2083 阅读 · 0 评论 -
【Spring源码分析】41-ClassPathBeanDefinitionScanner
一个bean定义扫描程序类,它检测类路径上的bean候选者,使用给定的注册表(BeanFactory或ApplicationContext)注册相应的bean定义。通过可配置的类型过滤器检测候选类。 默认过滤器包括使用Spring的@Component,@Repository,@Service或@Controller构造型注释的类。还支持Java EE 6的javax.annotation.Ma...原创 2019-11-17 23:53:20 · 3127 阅读 · 0 评论 -
【Spring源码分析】01-DispatcherServlet注册过程
传统的Servlet注册是配置在/WEB-INF/web.xml下,在容器启动的时候注册Servlet。Servlet3规范为我们又提供了一种更加方便的注册方法。容器启动的时候扫描jar包,找到jar包下一个文件路径为下面这个的文件。META-INF/services/javax.servlet.ServletContainerInitializer该文件的内容必须是一个实现了javax.serv...原创 2018-05-07 21:56:25 · 7440 阅读 · 4 评论 -
【Spring源码分析】04-类型转换
Spring提供了一个Converter接口用于做类型装换,但我们需要将对象从一种类型转换为另一种类型只需要调用具体实现类的convert()方法。Spring也默认为我们提供了很多常用的实现类。public interface Converter<S, T> { T convert(S source);}上述接口有一个麻烦的地方是,如果我们需要将String转换到相应的...原创 2018-05-09 20:42:14 · 7508 阅读 · 0 评论 -
【Spring源码分析】30-Spring编程式事物的设计与实现
1、Spring事物处理的编程式使用TransactionDefinition td = new DefaultTransactionDefinition();Transactionstatus status = transactionManager.getTransaction(td);try { //这里是需要进行事务处理的方法调用}catch (ApplicationExc...原创 2019-01-17 00:25:58 · 6439 阅读 · 0 评论 -
【Spring源码分析】25-Spring异步实现原理
@EnableAsync用于开启Spring bean异步方法的能力。下面是注解EnableAsync的定义。@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AsyncConfigurationSelector.class)public @interface EnableAs...原创 2019-01-03 14:45:26 · 7539 阅读 · 0 评论 -
【Spring源码分析】28-Spring缓存原理详解
Spring框架提供了基于注解@Cacheable、@CacheEvict、@CachePut、@Caching、@CacheConfig的缓存功能,@EnableCaching用于开启基于注解的缓存功能,下面分析一下Spring基于注解缓存的实现原理。@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documen...原创 2019-01-08 23:36:57 · 7605 阅读 · 0 评论 -
【Spring源码分析】24-基于注解@Aspect的AOP实现
1、AnnotationAwareAspectJAutoProxyCreator注册过程Spring应用如果想开启基于注解形式的AOP代理,只需要在@Configuration类上加入@EnableAspectJAutoProxy,因为EnableAspectJAutoProxy上有@Import(AspectJAutoProxyRegistrar.class),就可以在bean加载阶段调用A...原创 2019-01-02 17:44:43 · 7480 阅读 · 0 评论 -
【Spring源码分析】23-TargetSource目标源
1、为什么需要TargetSourceTargetSource(目标源)是被代理的target(目标对象)实例的来源。public interface TargetSource extends TargetClassAware { //目标对象类型 Class<?> getTargetClass(); // 这个方法用户返回当前bean是否为静态的,比如常见...原创 2019-01-01 15:32:55 · 12590 阅读 · 0 评论 -
【Spring源码分析】27-基于注解@Scheduled定时任务实现
1、概述@EnableScheduling启用Spring的定时任务功能,这允许检测容器中@Scheduled注释的bean。执行定时任务还需要一个调度器TaskScheduler,默认情况下,将在容器中搜索一个关联的scheduler定义:要么是一个唯一的TaskScheduler类型的bean,要么是一个bean name是taskScheduler的TaskScheduler。这两种查找...原创 2019-01-05 18:29:13 · 8373 阅读 · 0 评论 -
【Spring源码分析】22-Spring AOP的实现原理之ProxyFactoryBean
1、设计原理在 Spring的AOP模块中,一个主要的部分是代理对象的生成,而对于 Spring应用,可以看到,是通过配置和调用 Spring的 ProxyFactoryBean来完成这个任务的。在 ProxyFactoryBean中,封装了主要代理对象的生成过程。在这个生成过程中,可以使用JDK的Proxy和CGLIB两种生成方式。以ProxyFactory的设计为中心,可以看到相关的类继承...原创 2019-01-01 02:51:57 · 9340 阅读 · 3 评论 -
【Spring源码分析】26-TaskExecutor与TaskScheduler
上一篇文章《Spring异步实现原理》中提到执行异步方法使用了AsyncTaskExecutor,这篇就讲解一下TaskExecutor的实现类原理。1、TaskExecutor概述Executors是JDK线程池概念的名字。“executor”命名是由于它并不能保证底层实现实际上是一个池。一个executor可能是单线程的,甚至是同步的。Spring的抽象隐藏了实现细节。Spring的E...原创 2019-01-05 15:06:40 · 8294 阅读 · 0 评论 -
【Spring源码分析】31-Spring声明式事物的设计与实现
1、设计原理与基本过程在使用Spring声明式事务处理的时候,一种常用的方法是结合IoC容器和Spring已有的TransactionProxyFactoryBean对事务管理进行配置,比如,可以在这个TransactionProxyFactoryBean中为事务方法配置传播行为、并发事务隔离级别等事务处理属性,从而对声明式事务的处理提供指导。具体来说,在以下的内容中,在对声明式事务处理的原理...原创 2019-01-20 00:08:59 · 6374 阅读 · 0 评论 -
【Spring源码分析】32-基于注解@Transactional的事物实现
@EnableTransactionManagement启用Spring的注解驱动的事务管理功能,它背后的处理器是TransactionManagementConfigurationSelector,在使用ASPECTJ模式它会导入AspectJJtaTransactionManagementConfiguration和AspectJTransactionManagementConfigurati...原创 2019-01-21 01:04:08 · 6726 阅读 · 0 评论 -
【Spring源码分析】39-Spring容器生命周期回调接口——LifeCycle
1、LifeCycle接口概述LifeCycle定义启动/停止生命周期控制方法的通用接口。这种情况的典型用例是控制异步处理。可以由两个组件(通常是Spring上下文中定义的Spring bean)和容器(通常是Spring ApplicationContext本身)实现。容器将开始/停止信号传播到每个容器内应用的所有组件。可用于通过JMX进行直接调用或管理操作,org.springframew...原创 2019-08-08 19:56:27 · 2193 阅读 · 0 评论 -
【Spring源码分析】38-RestTemplate详解
同步客户端执行HTTP请求,在底层HTTP客户端库(如JDK HttpURLConnection,Apache HttpComponents等)上公开简单的模板方法API。RestTemplate除了支持频率较低的情况的通用交换和执行方法之外,还通过HTTP方法提供常见方案的模板。注意:从5.0开始,非阻塞,反应式org.springframework.web.reactive.client.We...原创 2019-03-06 11:51:46 · 8113 阅读 · 0 评论 -
【Spring源码分析】37-Spring MVC的异常处理
在Spring MVC中处理HTTP请求时如果抛出异常会使用DispatcherServlet#processHandlerException()处理,这个方法内部使用Spring MVC默认的注册的HandlerExceptionResolver进行处理。@Nullableprotected ModelAndView processHandlerException(HttpServlet...原创 2019-02-12 19:07:35 · 6381 阅读 · 0 评论 -
【Spring源码分析】36-Spring MVC参数值的绑定
上一篇《Spring MVC设计原理》中提到了Spring MVC在使用RequestMappingHandlerAdapter处理HTTP请求时会进行参数绑定,参数绑定会在两种方法上发生:@RequestMapping方法的参数绑定 @ModelAttribute方法的参数绑定1、参数解析器的初始化这两种参数绑定分别使用一个HandlerMethodArgumentResolverC...原创 2019-02-03 20:35:59 · 6836 阅读 · 0 评论 -
【Spring源码分析】35-Spring MVC设计原理
1、Spring MVC 请求处理流程概述DispatcherServlet是SpringMVC 中的前端控制器(Front Controller),负责接Request并将Request委托特殊bean处理请求并呈现适当的响应。Bean类型 描述 HandlerMapping 将请求映射到处理程序以及用于预处理和后处理的拦截器列表。映射基于某些标准...原创 2019-02-03 01:05:31 · 6799 阅读 · 2 评论 -
【Spring源码分析】33-Spring远端调用的实现
1、Spring远程调用的设计概览Spring为使用各种技术的远程支持提供集成类。远程支持简化了由通常的(Spring) pojo实现的支持远程的服务的开发。目前,Spring支持以下远程处理技术: Remote Method Invocation (RMI): 通过使用RmiProxyFactoryBean和RmiServiceExporter, Spring同时支持传统的RMI(使用...原创 2019-01-26 01:09:23 · 7048 阅读 · 1 评论 -
【Spring源码分析】34-Spring Bean作用域的设计与实现
1、Spring Bean作用域简介bean定义的配方是很重要的,因为这意味着,对于一个类,你可以使用一个配方创建许多对象实例。你不仅可以通过特定的bean定义控制各种依赖关系和配置值创建一个对象,还控制创建的对象的作用域。这种方法是强大和灵活的,因为你可以选择您创建的对象的作用域通过配置,而不是靠对象在Java类级别的作用域。可以定义bean被部署在一个作用域。Spring框架支持六个作用域...原创 2019-01-27 14:17:15 · 6680 阅读 · 0 评论 -
【Spring源码分析】29-JdbcTemplat的设计与实现
1、设计原理在 Spring JDBC中, JdbcTemplate是一个主要的模板类,从类继承关系上来看, JdbcTemplate继承了基类JdbcAccessor和接口类JdbcOperation。在基类 JdbcAccessorl的设计中,对DataSource数据源进行管理和配置。在 JdbcOperation接口中,定义了通过JDBC操作数据库的基本操作方法,而JdbcTempla...原创 2019-01-11 00:57:12 · 6721 阅读 · 0 评论 -
【Spring源码分析】21-Spring AOP概述
1、AOP概念 Aspect: 切面是一个关注点的模块化,这个关注点可能是横切多个对象。在Spring AOP中切面是常规的类(基于xml配置)或者是带有@Aspect注解的类实现的。 Join point: 连接点是程序执行的一个方法或者一个可处理的异常。在Spring AOP中,连接点总是代表执行方法。 Advice: 通知是切面拦截到连接点之后所要采取的行动。通知类...原创 2018-12-29 16:54:10 · 6298 阅读 · 0 评论 -
【Spring源码分析】20-Spring事件/监听器机制
ApplicationContext提供事件处理通过ApplicationEvent类和ApplicationListener接口。如果一个bean实现ApplicationListener接口在容器中,每次一个ApplicationEvent被发布到ApplicationContext中,这类bean就会收到这些通知。从本质上讲,这是标准的观察者设计模式。实现Spring事件机制主要有4个类...原创 2018-12-28 20:15:12 · 11191 阅读 · 0 评论 -
【Spring源码分析】07-BeanWrapper
beans包里一个非常重要的类是BeanWrapper接口和它的相应实现(BeanWrapperImpl)。BeanWrapper提供了设置和获取属性值(单独或批量)、获取属性描述符以及查询属性以确定它们是可读还是可写的功能。BeanWrapper还提供对嵌套属性的支持,能够不受嵌套深度的限制启用子属性的属性设置。然后,BeanWrapper提供了无需目标类代码的支持就能够添加标准JavaBean...原创 2018-05-15 22:19:18 · 8703 阅读 · 5 评论 -
【Spring源码分析】02-Resource
Spring的Resource接口为资源访问提供了统一的接口,不同的实现类实现了从不同上下文获取资源。下面是该接口的方法:public interface Resource extends InputStreamSource { boolean exists(); default boolean isReadable() { return true; } default boolean...原创 2018-05-09 20:40:06 · 6630 阅读 · 0 评论 -
【Spring源码分析】03-ResourceLoader
ResourceLoader 接口是用来加载 Resource 对象的,换句话说,就是当一个对象需要获取 Resource 实例时,可以选择实现 ResourceLoader 接口。public interface ResourceLoader { /** Pseudo URL prefix for loading from the class path: "classpath:" */ St...原创 2018-05-09 20:41:24 · 6525 阅读 · 0 评论 -
【Spring源码分析】09-PropertySourcesPropertyResolver
PropertySourcesPropertyResolver用来将PropertySource的占位符文本解析,PropertyResolver是 Environment的顶层接口,主要提供属性检索和解析带占位符的文本。原创 2018-06-01 20:24:26 · 15081 阅读 · 0 评论 -
【Spring源码分析】06-ResolvableType
前两篇博客中很多地方都是用到了ResolvableType获取类型信息,这篇就来详细看看它。ResolvableType封装了Java的Type,提供了getSuperType()方法访问父类型,getInterfaces()反回实现的接口,getGeneric()获取泛型参数,resolve()转化为Class对象。那么什么事Java的Type呢,可以看出Type有四个子接口,一个子类。每种类型...原创 2018-05-12 15:10:26 · 13222 阅读 · 0 评论 -
【Spring源码分析】08-DataBinder
DataBinder实现了TypeConverter和PropertyEditorRegistry接口提供了类型转换功能,并且可以对目标对象字段做Validation。DataBinder有个重要的成员变量bindingResult是AbstractPropertyBindingResult类,我们先分析他的用处。Errors接口定义了存储与展示关于数据绑定和validation到...原创 2018-05-22 22:58:21 · 12757 阅读 · 0 评论 -
【Spring源码分析】05-字段格式化
上一篇分析了继承图的右半部分,这次来分析左半部分。Spring 3为此引入了一个方便的Formatter SPI来直接解决这些问题,这个接口为客户端环境提供一种简单强大并且替代PropertyEditor的方案。一般来说,当你需要实现通用的类型转换逻辑时请使用Converter SPI,例如,在java.util.Date和java.lang.Long之间进行转换。当你在一个客户端环境(比如web...原创 2018-05-10 18:40:49 · 6734 阅读 · 0 评论 -
【Spring源码分析】10-Environment
Environment扩展了PropertyResolver接口,定义了代表当前应用程序所处的运行环境的方法。public interface Environment extends PropertyResolver { String[] getActiveProfiles();//显示激活的运行环境 String[] getDefaultProfiles();//默认的运行环境 ...原创 2018-06-01 20:24:55 · 6985 阅读 · 0 评论 -
【Spring源码分析】13-DispatcherServlet中WebApplicationContext启动过程
DispatcherServlet中WebApplicationContext的启动在父类FrameworkServlet的configureAndRefreshWebApplicationContext()方法中,其中WebApplicationContext的具体子类是AnnotationConfigWebApplicationContext。下图为ApplicationContext的继承结...原创 2018-06-24 19:45:12 · 6913 阅读 · 0 评论 -
【Spring源码分析】19-ConfigurationClassPostProcessor
1、ConfigurationClassPostProcessor如何应用ConfigurationClassPostProcessor在Spring启动时为我们自动注册的当我们使用了XmlWebApplicationContext并在配置文件中配置了<context:annotation-config/>或<context:component-scan/>元素,X...原创 2018-12-27 01:11:30 · 7701 阅读 · 2 评论 -
【Spring源码分析】18-CommonAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor这个BeanPostProcessor通过继承InitDestroyAnnotationBeanPostProcessor对@javax.annotation.PostConstruct和@javax.annotation.PreDestroy注解的支持。以及依据bean name依赖注入的@javax.annotation.Res...原创 2018-08-30 18:45:18 · 11220 阅读 · 1 评论 -
【Spring源码分析】17-RequiredAnnotationBeanPostProcessor
@Required注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常。RequiredAnnotationBeanPostProcessor就是用来解析@Required的,当一个bean实例经过SmartInstantiationAwareB...原创 2018-08-03 00:10:13 · 7477 阅读 · 0 评论 -
【Spring源码分析】16-AutowiredAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor继承了InstantiationAwareBeanPostProcessorAdapter间接实现了SmartInstantiationAwareBeanPostProcessor接口覆盖了determineCandidateConstructors()方法,此方法在实例化bean前选取一个构造方法数组,请参考bean创建的流...原创 2018-08-03 00:09:58 · 8821 阅读 · 0 评论 -
【Spring源码分析】15-ConfigurationClassPostProcessor
ConfigurationClassPostProcessor是一个BeanDefinitionRegistryPostProcessor,用于在Spring启动时处理以Java类定义形式的配置。@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { int r...原创 2018-07-26 17:30:14 · 7541 阅读 · 0 评论 -
【Spring源码分析】14-Spring默认重要的组件
A代表通过addBeanFactoryPostProcessor或addBeanPostProcessor方法直接添加为相应的组件后面的数字代表此组件在代码层面出现的先后顺序之后为组件的类名bean的name继承了PriorityOrdered还是OrderedOrdered或PriorityOrdered的优先级...原创 2018-07-26 17:29:54 · 6298 阅读 · 0 评论 -
【Spring源码分析】12-BeanFactory创建Bean的重要流程图
SpringBean的生命周期原创 2018-06-01 20:25:27 · 6977 阅读 · 0 评论