Spring FrameWork 原理大致流程解析

简介

Spring是个大内容,包含了Spring FrameWork(Spring框架),Spring Boot,Spring Data,Spring Cloud等。
Spring Boot 就是基于Spring FrameWork做的。

Spring Bean创建的生命周期大致流程

如下代码:

    public static void main(String[] args) {
    	// 与ClassPathXmlApplicationContext类似,springMVC创建的,针对的是xml
    	// AnnotationConfigApplicationContext针对的是class,springboot创建的
        AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService userService = (UserService) configApplicationContext.getBean("userService");
        userService.test();
    }

配置文件:

	@ComponentScan("cn")
	public class AppConfig {
	}

AnnotationConfigApplicationContext 会创建容器,去扫描AppConfig.class配置的路径cn
路径下的类若存在@Component、@Service等注解,则会记录这些类,并创建Bean对象。

大体Bean创建步骤如下:

  1. 找构造函数(推断构造方法)
  2. 通过构造函数,创建实例化对象,对对象内的加了@Autowired的属性进行依赖注入(DI)
  3. Aware接口回调
  4. 初始化前操作(@PostConstruct)
  5. 初始化操作(InitializingBean接口的afterPropertiesSet())
  6. 初始化后操作(判断是否要进行AOP,不用则结束,需要则创建代理对象作为Bean)
  7. Bean被创建出来后
  8. 如果是单例Bean,就会放入单例池的Map中(key:beanName,val:Bean对象或代理对象)
  9. 如果是原型Bean,就不会操作
  10. 进行getBean()操作时
  11. 如果是单例Bean,就可以从单例池Map中直接取得该对象
  12. 若是原型Bean,则重写执行该流程创建一个新的Bean对象

推断构造方法大致流程

Spring 在创建对象找构造函数时,遵循规则:

  1. 如果有一个或多个构造函数,存在无参构造函数,则默认使用无参构造函数
  2. 如果只有一个构造函数,不管这个构造函数是否有无参数,使用这个构造函数
  3. 如果有多个构造函数,且没有无参构造函数,则报错
  4. 如果多个构造函数,某一个构造函数上存在@Autowired注解,则使用这个构造函数

Spring依赖注入(也属于推断构造方法)大致流程

Spring如何注入Bean

  1. Spring会根据需要被注入的Bean参数类型去容器中的单例池(Map)找
  2. 若存在一个,则直接用,若不存在,则报错,若存在多个,则通过Bean的名称找
  3. 若找到,则使用,若不存在,则报错。(单例池Map不会存在允许多个相同beanName的对象)

AOP大致流程

判断是否需要Aop

  1. Spring会去扫描所有@Aspect 的 Bean对象
  2. 扫描这些Bean对象是否有@Before,@Around等注解
  3. 如果有,则判断Pointcut是否和当前类匹配,并存入Map,后续使用
  4. 若匹配,则当前Bean就需要进行Aop

Aop大致流程:

  1. Spring会使用cglib代理,创建代理对象,去重写父类的方法
  2. 代理类中会持有一个当前被代理类对象的引用(target),也就是单例池中的Bean对象(进行依赖注入,初始化后的)
  3. 当对象执行时,会有代理对象执行。如下代码
 	class AProxy extends A {
 		A target;// 单例池中的对象,进行过依赖注入初始化的对象
		public void test() {
			// 执行@Before等
			a.test();
			// 执行@After等
		}
	}

Spring事务大致流程

当在某个方法上加上@Transactional注解后,就表示这个方法需要进行事务处理,会在初始化后进行AOP,生成代理对象来处理。

Spring是如何进行事务处理呢?

  1. 判断当前方法是否有@Transactional注解
  2. 若存在,则通过事务管理器TransactionManage创建一个数据库连接
  3. 修改自动提交事务为手动:autocommit = false
  4. 开启事务,执行target.方法(),也就是被@Transactional修饰的方法
  5. 执行成功后,提交事务,若失败,则回滚事务

因此,Spring事务是否生效,要看@Transactional所修饰的方法是否是代理对象所调用,若是,则事务生效,若不是,则没有生效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值