Spring源码分析
文章平均质量分 76
Spring源码分析
xiaolyuh123
凡是过去,皆为序幕
展开
-
Spring 设计模式
单例模式:Spring Bean 默认都是单例的工厂模式:Spring 主要作用之一就是对Bean的管理,所有Bean的创建都由Spring来负责,从这里来看就是一个工厂模式了。动态代理模式:Spring 主要作用之一AOP,就是通过动态代理模式来实现的,如:事物管理等。策略模式:Spring Bean的自动装配(@Autowired),其实就是策略选择的一种方式。模板方法模式:ApplicationContext体系就是使用了模板方法模式。装饰器模式:一种是类名中含有Wrapper,另一种是类.原创 2021-02-25 10:19:30 · 362 阅读 · 0 评论 -
Spring 源码(十二)Spring 中核心的后置处理器
BeanFactoryBeanFactoryPostProcessor:BeanFactory后置处理器ConfigurationClassPostProcessor:解析配置类的BeanFactory后置处理器BeanBeanPostProcessors:Bean 初始化前后执行的后置处理器InstantiationAwareBeanPostProcessor:Bean实例化前...原创 2020-01-14 15:30:12 · 1149 阅读 · 1 评论 -
Spring 源码(十一)Spring流程汇总
Spring 容器初始化流程Spring 容器初始化流程大致流程如下:this():注册内置的BeanPostProcessor的BeanDefinition到容器register(annotatedClasses):注册配置类 BeanDefinition 到容器prepareRefresh():初始化前的准备工作,列如对系统属性或者环境变量进行验证obtainFreshBeanF...原创 2019-11-28 11:20:33 · 751 阅读 · 0 评论 -
Spring 源码(十)Spring Aware自动装配原理
Spring Aware自动装配有两种实现方式:在初始化Bean的initializeBean方法中执行invokeAwareMethods方法通后置处理器ApplicationContextAwareProcessor来实现的,它实现了BeanPostProcessor接口invokeAwareMethods我们在初始化Bean的时候,为了保证一部分Aware必须在后置处理器post...原创 2019-11-28 11:19:37 · 461 阅读 · 0 评论 -
Spring 源码(八)循环依赖源码解析
循环依赖是指两个或者多个Bean之前相互持有对方。在Spring中循环依赖一般有三种方式:构造函数循环依赖setter方法循环依赖prototype 范围的依赖处理构造函数循环依赖在Spring中构造函数循环依赖是无法解决的,因为构造函数依赖其实是方法间循环调用的一种,会发生死循环。但是在Spring中会直接抛出BeanCurrentlyInCreationException异常。源...原创 2019-11-28 11:18:36 · 381 阅读 · 1 评论 -
Spring 源码(九)@Autowired注解实现原理(Spring Bean的自动装配)
@Autowired注解的实现过程,其实就是Spring Bean的自动装配过程。通过看@Autowired源码注释部分我们可以看到@Autowired的实现是通过AutowiredAnnotationBeanPostProcessor后置处理器中实现的。AutowiredAnnotationBeanPostProcessor 类图PriorityOrdered:确认 AutowiredA...原创 2019-11-28 11:17:14 · 1497 阅读 · 0 评论 -
Spring 源码(七)Spring 事务源码解析
注册后置处理器开启对事务的支持@EnableTransactionManagement@EnableTransactionManagement注解的主要作用是开启对事务的支持,源码如下:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(TransactionManagementC...原创 2019-11-28 11:13:57 · 352 阅读 · 0 评论 -
Cglib 与 JDK动态代理
AOP 代理的两种实现:jdk是代理接口,私有方法必然不会存在在接口里,所以就不会被拦截到;cglib是子类,private的方法照样不会出现在子类里,也不能被拦截。JDK 动态代理。具体有如下四步骤:通过实现 InvocationHandler 接口创建自己的调用处理器;通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;通过...原创 2019-11-28 11:13:11 · 421 阅读 · 0 评论 -
Spring 源码(六)Spring AOP源码解析
AOP 面向切面编程,相对于OOP面向对象编程。Spring AOP存在的目的是为了解耦。AOP可以让一组类共享相同的行为。在OOP中只能通过继承类和实现接口,来使代码的耦合度增强,且类继承只能是单继承,阻碍更多的行为添加到一组类上,AOP弥补了OOP的不足。Spring支持AspectJ的注解式切面编程,基本定义如下:使用@AspectJ声明一个切面。使用@After、@Be...原创 2019-11-28 11:12:22 · 562 阅读 · 0 评论 -
Spring 源码(五)初始化所有单例Bean,并注册到容器(Bean的生命周期)
在这之前我们先来看下refresh()方法,它完整的描述了整个ApplicationContext的初始化过程。这里看起来更像是对容器进行初始化的模板或者提纲。@Overridepublic void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonit...原创 2019-11-28 11:11:13 · 339 阅读 · 0 评论 -
Spring 源码(四)解析配置类
我们要找出所有符合条件的业务Bean,首先我们需要知道在Spring中什么样的Bean是符合条件的,是需要容器来管理的:使用组件标注注解的Bean(@Controller、@Service、@Repository、@Component),一般项目里面使用。使用@Bean注解标准的方法,一般导入第三方组件的时候使用。使用@Import注解导入的Bean,一般快速导入一批组件时使用。doP...原创 2019-11-28 11:09:20 · 275 阅读 · 0 评论 -
Spring 源码(三)注册配置类 BeanDefinition 到容器
调用链路:registerBeanDefinition:861, DefaultListableBeanFactory (org.springframework.beans.factory.support)registerBeanDefinition:315, GenericApplicationContext (org.springframework.context.support)reg...原创 2019-11-28 11:08:13 · 268 阅读 · 0 评论 -
Spring 源码(二)注册内置的BeanPostProcessor的BeanDefinition到容器
发起注册调用链路:registerAnnotationConfigProcessors:163, AnnotationConfigUtils (org.springframework.context.annotation)registerAnnotationConfigProcessors:134, AnnotationConfigUtils (org.springframework.con...原创 2019-11-28 11:06:28 · 357 阅读 · 0 评论 -
Spring 源码(一)Spring 容器的入口
Spring 容器的初始化ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);当我们完成一个ApplicationContext的实例化时就完成了Spring容器的初始化,而AnnotationConfigApplicationContext的构造方法也就是Spring容器的入...原创 2019-11-28 11:05:06 · 562 阅读 · 0 评论 -
Spring Bean 的初始化和销毁的三种方式(Spring Bean 的生命周期)
Spring 容器中的 Bean 是有生命周期的,Bean 的生命周期是指 Bean 创建----> 初始化----> 销毁 的过程,并且 Spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。 下面是常用的三种指定特定操作的方法:通过 元素的init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;通过实现Ini...原创 2019-11-28 11:04:22 · 489 阅读 · 0 评论 -
Spring 核心注解
@Configuration 配置类注解声明一个类是配置类,等同于配置文件中的applicationcontext.xml。加载Spring配置的两种方式:ClassPathXmlApplicationContext XML方式ApplicationContext app = new ClassPathXmlApplicationContext("applicationcontext....原创 2019-11-28 11:03:29 · 594 阅读 · 1 评论 -
Spring Bean 的注册和注入的几种常用方式和区别
Spring 注册Bean:包扫描 + 组件标注注解(@Controller、@Service、@Repository、@Component),一般项目里面使用。使用@Bean注解,一般导入第三方组件的时候使用。使用@Import注解,一般快速导入一批组件时使用。使用FactoryBean接口 + @Bean注解。包扫描 + 组件标注注解(@Controller、@Service、@...原创 2019-11-28 11:02:47 · 1824 阅读 · 1 评论 -
Spring 模块介绍
一、核心容器(Core Container)Spring-Core:核心工具类,Spring其他模块大量使用Spring-Core。Spring-Beans:Spring定义Bean的支持。Spring-Context:运行时Spring容器。Spring-Context-Support:Spring对第三方包的集成支持。Spring-Expression:使用表达式语言在运行时查询...原创 2019-11-28 11:01:53 · 232 阅读 · 0 评论 -
Spring框架的启动入口 ContextLoaderListener
Spring的入口配置在web.xml中。以监听器的形式来实现。 <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 指定Spring Bean的...原创 2017-03-03 10:41:23 · 5823 阅读 · 1 评论 -
Spring MVC之@RequestMapping 详解
引言:前段时间项目中用到了REST风格来开发程序,但是当用POST、PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据。为了找出原因,便对参数绑定(@RequestParam、 @RequestBody、 @R转载 2017-03-31 14:55:05 · 412 阅读 · 0 评论 -
Spring 配置多数据源实现数据库读写分离
现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库。Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询。因为在实际的应用中,数据库都是读多写少(读取数据的频率高,更新数据的频率相对较少),而读取数据通常耗时比较长,占用数据库服务器的CPU较多,从而影响用户体验。我们通常的做法就是把查询从主库中抽取出来,采用多个从库,转载 2015-11-17 11:13:38 · 782 阅读 · 0 评论 -
注释驱动的 Spring cache 缓存介绍
介绍 spring 3.1 激动人心的新特性:注释驱动的缓存,本文通过一个简单的例子进行展开,通过对比我们原来的自定义缓存和 spring 的基于注释的 cache 配置方法,展现了 spring cache 的强大之处,然后介绍了其基本的原理,扩展点和使用场景的限制。通过阅读本文,你可以短时间内掌握 spring 带来的强大缓存技术,在很少的配置下即可给既有代码提供缓存能力。6 评论:转载 2015-09-02 15:34:21 · 730 阅读 · 0 评论 -
Spring3.1 Cache注解
Spring3.1 Cache注解博客分类: Springspringehcache 需要感慨一下,spring3.0时丢弃了2.5时的spring-modules-cache.jar,致使无法使用spring来方便的管理cache注解,好在3.1.M1中增加了对cache注解的支持,可喜可贺啊! 希望了解spring2.5的cache注解,转载 2015-09-02 15:28:11 · 535 阅读 · 0 评论 -
Spring Cache 介绍
Spring Cache缓存是实际工作中非常常用的一种提高性能的方法, 我们会在许多场景下来使用缓存。本文通过一个简单的例子进行展开,通过对比我们原来的自定义缓存和 spring 的基于注释的 cache 配置方法,展现了 spring cache 的强大之处,然后介绍了其基本的原理,扩展点和使用场景的限制。通过阅读本文,你应该可以短时间内掌握 spring 带来的强大缓存技术,在原创 2015-09-02 15:26:44 · 482 阅读 · 0 评论 -
Spring Boot集成Mybatis
1. 配置pom.xml引入mybatis-spring-boot-starter。 org.springframework.boot spring-boot-starter-parent 1.3.5.RELEASE UTF-8 UTF-8 1.8 org.springframework.b原创 2017-06-07 14:44:29 · 1304 阅读 · 0 评论 -
spring security实现注解式权限管理时不成功,注解@Secured 无效
jsr250-annotations="enabled" pre-post-annotations="enabled"secured-annotations="enabled" />这段配置放到Spring mvc的配置文件中 ,不要放到spring-security 文件中。原创 2016-12-27 10:50:39 · 9102 阅读 · 4 评论 -
Spring Boot AOP代理
AOP 代理的两种实现:jdk是代理接口,私有方法必然不会存在在接口里,所以就不会被拦截到; cglib是子类,private的方法照样不会出现在子类里,也不能被拦截。Java 动态代理。具体有如下四步骤:通过实现 InvocationHandler 接口创建自己的调用处理器; 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;...原创 2017-08-09 16:27:09 · 3192 阅读 · 0 评论 -
深入理解 Spring 事务原理
一、事务的基本原理Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:获取连接 Connection con = DriverManager.getConnection()开启事务con.setAutoCommit(true/false);执行CRUD提交事务/回滚事原创 2017-02-21 10:58:24 · 1981 阅读 · 2 评论 -
Spring MVC Bean 参数校验 @Validated
一、Bean Validation简介JSR-303主要是对JavaBean进行验证,如方法级别(方法参数/返回值)、依赖注入等的验证是没有指定的。因此又有了JSR-349规范的产生。Hibernate Validator(下载地址:http://www.hibernate.org/subprojects/validator.html);二、Bean Validati...原创 2017-05-11 10:33:57 · 10115 阅读 · 0 评论 -
Spring 日志文档翻译
原文:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#overview-logging2.3.2 日志日志对于spring来说非常重要,因为 a)它是唯一强制的外部依赖,b)每个人都希望在使用某个工具时可以看到一些友好地输出,c)Spring集成了很多其他的工具,它们也都有自己的日志依...翻译 2017-03-30 15:56:05 · 543 阅读 · 0 评论