Spring 面试题(一)

177 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

  1. Bean的创建的生命周期

    UserService类 -> 无参构造方法(推断构造方法)->普通对象->依赖注入-> 初始化前(@PostConstruct)-> 初始化(InitializingBean) -> 初始化后(AOP)-->代理对象-->放入单例池Map --> Bean

a) @Autowired,-》 类型,注入优先by Type, 多个情况then by name -> 找不到异常。

b) 默认无参构造。只有一个构造方法也是可以。只有多个有参构造,有异常。 @Autowired 用于一个构造方法,则可以指定使用哪个构造方法。

c) 代理对象在单例池,普通对象不在单例池

d) UserServiceProxy代理对象 -> UserService对象 -> UserService代理对象的.target = 普通对象 --> 完成

AOP eg:

class UserServiceProxy extends UserService {
​
    UserService target;
    public void test() {
        // @Before 切面逻辑
        // target.test();
    }
​
}
  1. @Transactional 失效的场景

    class UserServiceProxy extends UserService {
    ​
        UserService target;
        public void test() {
            // @Transactional
            // 事务管理器新建一个数据库连接conn, ThreadLocal<Map<DataSource,conn>>
            // conn.autocommit = false;
            // target.test(); sql1, sql2, sql3.
            // conn.commit(); conn.rollback();
        }
    ​
    }
    
    1. 普通对象调用不生效,保证是代理对象在调用方法。
  1. 什么是单例池?作用是什么?

    1. singletonObjects Map.
  2. Bean初始化前,做一些事情。

    1. @PostConstruct 注解于init method. 获取所有method, 判断注解是否存在,反射调用
    2. 实现InitializingBean, 重写方法(afterPropertiesSet()), 实例化后判断类型, 是的话,调用方法。
  3. Bean的实例化和初始化区别是什么?

    1. 初始化就是实例化后执行指定的方法。
  4. 推断构造方法是什么?

    1. 多个构造方法,有无参使用无参,有唯一@Autowired注解的构造方法,使用该构造方法。
  5. Spring AOP 底层是怎么工作的?

  6. Spring 十五底层是怎么工作的?

  7. @Configuration注解的作用

    1. 同样会生成代理对象,当实例化对象的时候,检查对象是否在容器中,在的话用,不在的话先实例化放到容器中,下次再用的时候就可以直接从容器拿到。
    2. 代理对象中,super.test();
  8. Spring 为什么要用三级缓存来解决循环依赖?

    1. singletonObjects
    2. earlySingletonObjects
    3. 三级缓存 singletonFactories lambda , 真正 打破循环的

    不考虑AOP,代理对象的二级缓存可以满足,考虑代理对象,二级缓存是有问题的。