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 创建对象

  1. 解析配置(XML文件、配置类)
  2. 获取扫描路径 (ComponentScan)
  3. 扫描并添加所有的Bean到容器map<String,Class>

4. Bean的创建过程

以Userservice为例

  1. 默认无参构造方法初始化(@Autowired 指定构造方法)-->普通对象

  2. 依赖注入(先byType,再byName)

  3. Aware回调(BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口设置属性)

  4. 初始化前(@PostConstruct)

  5. 初始化(InitializingBean接口,afterPropertiesSet方法执行)

  6. 初始化后(Aop)--->代理对象 (Cglib基于父子类,继承)

    无aop则创建对象为原对象

    有aop则为代理对象

  7. 如果Bean是单例bean 会将 bean对象放入单例池,原型bean则每次getBean执行一次创建过程

5. 推断构造方法

  1. 如果只有一个构造方法默认使用

  2. 多个则默认无参构造

  3. 没有无参构造,且有多个有参构造则需要@Autowired指定否则报错

6. AOP

判断是否需要AOP

  1. 找出所有切面定义Bean,确定切面的范围(@Before @After)
  2. 遍历切点的类是否匹配

cglib进行AOP的大致流程

  1. 生成代理类UserServiceProxy,代理类继承UserService

  2. 代理类中重写了父类的方法,比如UserService中的test()方法

  3. 代理类中还会有一个target属性,该属性的值为被代理对象(也就是通过 UserService类推断构造方法实例化出来的对象,进行了依赖注入、初始化等步骤的 对象)

  4. 代理类中的test()方法被执行时的逻辑如下:

    a. 执行切面逻辑(@Before)

    b. 调用target.test()

7. Spring事务

事务通过AOP实现

  1. 方法或者类加了@Transactional注解,创建代理类
  2. 利用事务管理器(TransactionMananger)新建数据库连接,关闭自动提交
  3. 执行方法逻辑,正常则提交,失败则回滚

注解 @Configration 代理模式 优先从容器里拿对象 保证jdbc和事务dataSource 是同一个

Spring事务是否会失效的判断标准:某个加了@Transactional注解的方法被调用时,要判 断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效。

事务的运行机制是aop,当存在事务嵌套时,且第二个事务的传播机制为Never(存在另一个事务报错),会失效,解决方法:注入自己

posted @ 2022-09-01 13:10  浮沉丶随心  阅读(30)  评论(0编辑  收藏  举报