每天每天
越来越爱

springIOC的bean生命周期

spring最核心的东西就是bean的生命周期,而ioc和aop是bean生命周期中的两个重要的过程。spring就是一个bean的容器,所以一个bean就是一个对象,但是对象不一定都是bean。

第一步 扫描包

通过配置的包路径扫面该包及子包下的所有的类信息

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MybatisConfig.class);
第二步 创建对象

通过反射方调用对象的构造方法,创建对象实例,如果存在多个构造方法,默认调用无参构造,如果没有无惨构造切构造方法只有一个,调用该构造方法。如果有多个构造方法,没有无惨构造,需要在构造方法上添加@Autowired 注解来指定构造方法,如果没有@Autowired则会抛异常

第三步 自动注入

对象创建完成之后,会对该对象的所有的属性(字段)进行扫描,如果属性上有@Autowired 注解或者@Resource注解,则会根据对象是否是单例如果是单例则会去容器中查找该类型的对象,先通过类型查找如果找不到,就会创建一个该对象,如果不是单例则会直接创建一个新的对象并赋值

第四步 初始化前

自动注入成功之后,则会去执行对象中添加@PostContract 的方法,PostContract注解不能加在构造方法上

@PostConstruct
public void test(){
    System.out.println("==============================");
    System.out.println("==============================");
    System.out.println("==============================");
    System.out.println("==============================");
}
第五步 初始化

对实现了InitializingBean 接口的实例调用afterPropertiesSet方法。

@Component
public class BeanConfig implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("=============afterPropertiesSet");
    }
}
第六步 初始化后动态代理(AOP)

对声明为切面的对象或者添加了@Transactional @Configuration注解的对象创建代理对象。

第七步 放回容器

将对象或者代理对象放回spring容器

spring 事务:

springboot在创建ioc容器的时候,将所有带注解的类都加载到容器中,会对configuration注解和Tranesaction注解产生代理对象。代理对象会在代理方法中创建一个数据库连接,并且将提交方式修改为false,通过代理对象的target去调用原来的方法,这个时候方法中的数据库连接就是代理对象创建的,所以不会提交事务,只有在方法执行结束,并且没有异常的时候才会提价,否则就会回滚。如果这时候在本来的方法中再去调用外部的方法,就会导致调用外部方法的对象不是代理对象,而事务不会产生作用。

总结: 事务生效有三个必要条件 1. 代理对象调用 2. 同一个数据源 3. 抛出异常 所以只要同时满足这三个条件,事务就会起作用,否则是不会起作用的。另外如果异常被trycatch了,也是不会起作用,如果抛出的异常是noRollbackFor的异常类,则也不会生效。

赞(0) 打赏

评论 抢沙发