微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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. 初始化前操作(@postconstruct
  4. 初始化操作(InitializingBean接口的afterPropertiesSet())
  5. 初始化后操作(判断是否要进行AOP,不用则结束,需要则创建代理对象作为Bean)
  6. Bean被创建出来后
  7. 如果是单例Bean,就会放入单例池的Map中(key:beanName,val:Bean对象或代理对象)
  8. 如果是原型Bean,就不会操作
  9. 进行getBean()操作时
  10. 如果是单例Bean,就可以从单例池Map中直接取得该对象
  11. 若是原型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所修饰的方法是否是代理对象所调用,若是,则事务生效,若不是,则没有生效。

原文地址:https://www.jb51.cc/wenti/3280247.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐