1.0 了解spring 核心概念
1. 大致了解
- Bean的生命周期
- 依赖注入
- 初始化
- 推断构造方法
- AOP
- spring事务
2. Spring 入口
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); //new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = (UserService) context.getBean("userService");
userService.test();
3. Spring 创建对象
- 解析配置(XML文件、配置类)
- 获取扫描路径 (ComponentScan)
- 扫描并添加所有的Bean到容器map<String,Class>
4. Bean的创建过程
以Userservice为例
-
默认无参构造方法初始化(@Autowired 指定构造方法)-->普通对象
-
依赖注入(先byType,再byName)
-
Aware回调(BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口设置属性)
-
初始化前(@PostConstruct)
-
初始化(InitializingBean接口,afterPropertiesSet方法执行)
-
初始化后(Aop)--->代理对象 (Cglib基于父子类,继承)
无aop则创建对象为原对象
有aop则为代理对象
-
如果Bean是单例bean 会将 bean对象放入单例池,原型bean则每次getBean执行一次创建过程
5. 推断构造方法
-
如果只有一个构造方法默认使用
-
多个则默认无参构造
-
没有无参构造,且有多个有参构造则需要@Autowired指定否则报错
6. AOP
判断是否需要AOP
- 找出所有切面定义Bean,确定切面的范围(@Before @After)
- 遍历切点的类是否匹配
cglib进行AOP的大致流程:
-
生成代理类UserServiceProxy,代理类继承UserService
-
代理类中重写了父类的方法,比如UserService中的test()方法
-
代理类中还会有一个target属性,该属性的值为被代理对象(也就是通过 UserService类推断构造方法实例化出来的对象,进行了依赖注入、初始化等步骤的 对象)
-
代理类中的test()方法被执行时的逻辑如下:
a. 执行切面逻辑(@Before)
b. 调用target.test()
7. Spring事务
事务通过AOP实现
- 方法或者类加了@Transactional注解,创建代理类
- 利用事务管理器(TransactionMananger)新建数据库连接,关闭自动提交
- 执行方法逻辑,正常则提交,失败则回滚
注解 @Configration 代理模式 优先从容器里拿对象 保证jdbc和事务dataSource 是同一个
Spring事务是否会失效的判断标准:某个加了@Transactional注解的方法被调用时,要判 断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效。
事务的运行机制是aop,当存在事务嵌套时,且第二个事务的传播机制为Never(存在另一个事务报错),会失效,解决方法:注入自己