简介
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创建步骤如下:
- 找构造函数(推断构造方法)
- 通过构造函数,创建实例化对象,对由@Autowired的属性进行依赖注入(DI)
- 初始化前操作(@postconstruct)
- 初始化操作(InitializingBean接口的afterPropertiesSet())
- 初始化后操作(判断是否要进行AOP,不用则结束,需要则创建代理对象作为Bean)
- Bean被创建出来后
- 如果是单例Bean,就会放入单例池的Map中(key:beanName,val:Bean对象或代理对象)
- 如果是原型Bean,就不会操作
- 进行getBean()操作时
- 如果是单例Bean,就可以从单例池Map中直接取得该对象
- 若是原型Bean,则重写执行该流程创建一个新的Bean对象
推断构造方法大致流程
Spring 在创建对象找构造函数时,遵循规则:
- 如果有一个或多个构造函数,存在无参构造函数,则默认使用无参构造函数
- 如果只有一个构造函数,不管这个构造函数是否有无参数,使用这个构造函数
- 如果有多个构造函数,且没有无参构造函数,则报错
- 如果多个构造函数,某一个构造函数上存在@Autowired注解,则使用这个构造函数
Spring依赖注入(也属于推断构造方法)大致流程
Spring如何注入Bean
- Spring会根据需要被注入的Bean参数类型去容器中的单例池(Map)找
- 若存在一个,则直接用,若不存在,则报错,若存在多个,则通过Bean的名称找
- 若找到,则使用,若不存在,则报错。(单例池Map不会存在允许多个相同beanName的对象)
AOP大致流程
判断是否需要Aop
- Spring会去扫描所有@Aspect 的 Bean对象
- 扫描这些Bean对象是否有@Before,@Around等注解
- 如果有,则判断pointcut是否和当前类匹配,并存入Map,后续使用
- 若匹配,则当前Bean就需要进行Aop
Aop大致流程:
- Spring会使用cglib代理,创建代理对象,去重写父类的方法
- 代理类中会持有一个当前被代理类对象的引用(target),也就是单例池中的Bean对象(进行依赖注入,初始化后的)
- 当对象执行时,会有代理对象执行。如下代码
class AProxy extends A {
A target;// 单例池中的对象,进行过依赖注入初始化的对象
public void test() {
// 执行@Before等
a.test();
// 执行@After等
}
}
Spring事务大致流程
当在某个方法上加上@Transactional注解后,就表示这个方法需要进行事务处理,会在初始化后进行AOP,生成代理对象来处理。
Spring是如何进行事务处理呢?
- 判断当前方法是否有@Transactional注解
- 若存在,则通过事务管理器TransactionManage创建一个数据库连接
- 修改自动提交事务为手动:autocommit = false
- 开启事务,执行target.方法(),也就是被@Transactional修饰的方法
- 执行成功后,提交事务,若失败,则回滚事务
因此,Spring事务是否生效,要看@Transactional所修饰的方法是否是代理对象所调用,若是,则事务生效,若不是,则没有生效。
原文地址:https://www.jb51.cc/wenti/3280247.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。