美文网首页
知识回顾|中间件存储及框架|Spring

知识回顾|中间件存储及框架|Spring

作者: 三更冷 | 来源:发表于2023-02-23 16:07 被阅读0次

    Spring

    本文回答以下问题,文内可能有遗漏、错误或表达不够清晰的地方。

    ① spring中bean的生命周期是怎样的?
    ② 属性注入和构造器注入哪种会有循环依赖的问题?
    ③ AOP的实现原理和场景,java动态代理和cglib动态代理的区别
    ④ spring事务传播、事务隔离级别
    ⑤ spring boot 自动配置原理
    ⑥ spring 框架有哪些扩展点

    ① spring中bean的生命周期是怎样的?

    Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:
    Bean自身的方法、Bean级接口方法、后处理器级接口方法、工厂后处理器接口方法。

    bean的生命周期(简略回答):

    实例化:选择该类的一个构造方法,实例化得到对象。
    依赖注入:Spring 会判断对象属性上是否有@Autowired 类似注解,有就把这些属性找出来,填充属性。
    初始化(Bean级接口方法):Spring 会判断对象是否实现了 xxxAware 相关接口;判断是否实现了 InitializingBean 接口或自定义 init 方法;如若实现则进行回调。
    初始化(后处理器级接口方法):Spring 会判断是否存在某个方法被@PostConstruct注解修饰;判断当前对象需不需要进行AOP,如果不需要那么Bean就创建完了,如果需要会进行动态代理并生成一个代理对象做为Bean。
    销毁bean:实现了 DisposableBean 接口的 Bean 会被销毁。

    ② 属性注入和构造器注入哪种会有循环依赖的问题?

    属性注入可能会有循环依赖的问题,项目使用时构造器注入优于属性注入。

    • spring是如何解决依赖的
    @Service
    publicclass TestService1 {
    
        @Autowired
        private TestService2 testService2;
    
        public void test1() {
        }
    }
    @Service
    publicclass TestService2 {
    
        @Autowired
        private TestService1 testService1;
    
        public void test2() {
        }
    }
    
    

    ③ AOP的实现,java动态代理和cglib动态代理的区别?

    Spring AOP是基于动态代理的,如果要代理的对象实现了某个接口,那么Spring AOP就会使用JDK动态代理去创建代理对象;而对于没有实现接口的对象,就无法使用JDK动态代理,转而使用 cglib 动态代理生成一个被代理对象的子类来作为代理。

    JDK动态代理只提供接口的代理,不支持类的代理。核心 InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。

    如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会 选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。 CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final, 那么它是无法使用CGLIB做动态代理的。

    一个Advisor(通知器)由一个Pointcut(切点)和一个Advice(通知)组成的。
    AbstractAdvisorAutoProxyCreator:只要Spring容器中存在这个类型的Bean,就相当于开启了AOP。

    • aop 过程(在一个 bean 的生命周期中):

    1、找到所有的通知器Advisor,然后判断当前这个Bean是否存在某个Advisor与之匹配(根据Pointcut),如果匹配就表示当前这个Bean有对应的切面逻辑,需要进行AOP来产生一个代理对象。(Spring 通过创建一个代理对象工厂 ProxyFactory产生代理对象)
    2、代理对象执行某个方法时,会把 代理对象工厂 ProxyFactory 中的 Advisor 拿出来和当前正在执行的方法进行匹配筛选。

    ④ spring事务传播

    spring 事务的7种传播行为:https://blog.csdn.net/weixin_39625809/article/details/80707695

    常用的有 REQUIRED、REQUIRES_NEW、NESTED

    • REQUIRED
      如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
      内层事务抛异常或者外层事务抛异常都会回滚。

    • REQUIRES_NEW
      如果存在一个事务,先将这个存在的事务挂起,再开启一个新的事务。如果没有事务则开启一个新的事务。
      外层事务抛异常:外层事务回滚,内层事务不回滚。
      内层事务抛异常,外层事务捕获内层事务抛的异常,未向上抛异常:内层事务回滚,外层事务不回滚。
      内层事务抛异常,外层事务捕获内层事务抛的异常,向上抛异常:都回滚;

    • NESTED
      如果存在一个事务,依赖该事务,作为该事务的子事务。如果没有事务则开启一个新的事务。
      外层事务抛异常:都回滚。
      内层事务抛异常,外层事务捕获内层事务抛的异常,未向上抛异常:内层事务回滚,外层事务不回滚。
      内层事务抛异常,外层事务捕获内层事务抛的异常,向上抛异常:都回滚;

    ⑤ spring boot 自动配置原理

    注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 是自动配置的核心, @EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。
    @Configuration、@ConditionalOnClass 筛选有效的自动配置类。
    每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能

    引入了一个(延迟的、导入自动配置类的)选择器,扫描所有jar包中 META-INF/spring.factories 目录下的文件,导入自动配置类,判断自动配置类生效。

    ⑥ spring 框架有哪些扩展点

    FactoryBean:Mybatis的Mapper接口的动态代理对象、FeignClient接口的动态代理
    @Import注解:核心作用就是导入配置类,根据配置类实现了什么接口注入什么样的Bean(如注册BeanDefinition)
    Bean的生命周期:生命周期的回调
    BeanPostProcessor:在Bean创建的过程中起作用,如Dubbo中可以通过@DubboReference(@Reference)来引用生产者提供的接口
    BeanFactoryPostProcessor:对Spring容器做处理
    Spring SPI机制:SpringFactoriesLoader,导入xxxAutoConfiguration
    SpringBoot启动扩展点:如自动装配、Nacos实现读取json格式的配置文件、SpringBoot启动成功后台通过CommandLineRunner命令行启动器来加载数据
    Spring Event 事件:事件的发布订阅
    命名空间:...

    引用文章

    https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247524146&idx=2&sn=ebfa45facb58a19ca52936b71b5bf900
    https://pdai.tech/md/interview/x-interview-2.html
    https://www.cnblogs.com/crazymakercircle/p/14465630.html

    相关文章

      网友评论

          本文标题:知识回顾|中间件存储及框架|Spring

          本文链接:https://www.haomeiwen.com/subject/zyxuhdtx.html