spring底层核心原理

1.对象的创建大致过程

1. 通过ClassPathXmlApplicationContext中的参数,找到注解中的路径,扫描路径下所有@Component,@Service的class文件。
2. 调用类的构造方法,生成普通对象
3. 找到标注有@Autowired的属性进行依赖注入
4. 初始化前 找到标注有@PostConstruct的方法调用
5. 初始化 判断类是否实现了InitializingBean ,如果实现了,就执行afterPropertiesSet()方法。
6. 初始化后  完成上面操作后就会去判断是否需要进行aop,如果需要进行动态代理,生成一个代理对象。
所以我们会发现,如果不进行aop,则生成一个普通的对象,
                             如果要进行aop则会生成一个代理对象

2.推断构造方法

1. spring首先需要去找默认都无参构造方法,如果找到了,即使有多个构造方法,调用无   参构造方法
 2. 如果没有找到无参构造方法,如果只找到一个有参构造方法,则使用这个有参构造方法,
 3. 如果找到多个有参构造方法,则spring不知道调用哪个所以会报错,不过我们可以使用@Aurowired 注解来标注一个有参构造方法,让spring去调用。

3.AOP的大致过程

spring在创建对象的最后一步会去判断这个类是否需要进行aop

判断方法:

1.找到所有的切面类,然后遍历每一个方法,看是否标注有@before @after。
2.如果有,则去判断pointcut是否和当前创建的类匹配。
3.如果匹配则说明当前类要进行aop。

利用cglib创建代理类

1.生成代理类继承当前正创建的类
2.代理类中重写了父类的方法
3.代理类中有一个target属性,该属性的值为之前通过构造方法创建出来的普通类,这个普通类是进行了依赖注入,初始化等过程的。
4.代理类中要进行aop的方法被执行时的逻辑为
   4.1 先进行执行切面逻辑(@Before)
   4.2 再调用target中被切的方法。
这个时候我们就得到了代理类,在代理类中可以实现其他的逻辑,而在调用真正的方法时又会使用target对象,和使用正常的类一样。

4.spring事务

当我们在某个方法上使用了@Transactional后此方法开启了事务,而这个类也会生成代理对象,逻辑和AOP一致
代理对象调用事务方法时的步骤如下
1.在调用某个方法时先判断是否标注了@Transactiona
2.如果标注了@Transactiona,则通过事务管理器创建一个数据库链接
3.修改数据库链接的autocommit 属性为false
4.执行方法时使用自己创建出来的数据库链接来执行sql
5.方法执行完成后需要调用commit方法,来提交事务。

有时我们在同一个类中的两个事务方法调用时,发现被调用的方法@Transactional注解不起作用,主要是因为在调用到方法中时使用的时target属性,也就是普通对象,所以并不会在调用前做其他处理, 这种问题我们主要是需要判断调用事务方法的到底是不是代理类。