springboot 常用扩展点

springboot 常用扩展点

1、FactoryBean:本身为Bean,当向spring容器中注入Bean时,最终生成的Bean是通过Factory的getObject方法获取的。通常用于较为复杂的对象的注册。

    FactoryBean是一个能生产或修饰对象生成的工厂Bean。一个Bean如果实现了FactoryBean接口,那么根据该bean名称获取到的实际上是getObject方法返回的对象。如果要获取Bean自身实例,那么需要在名称前加上‘&’符号。

application.getBean("&myBean");

      框架中对于FactoryBean的使用:

      Mybatis整合spring框架时,使用FactoryBean用于将JDK动态代理生成的MapperProxy代理对象注入到spring容器中。

      OpenFeign框架中,FeignClient接口的动态代理也是通过FactoryBean注入到spring容器中。

2、@Import注解:向spring容器中注入Bean

      配置类实现ImportSelector接口,可以向spring容器注入特定的Bean

      配置类实现ImportBeanDefinitionRegistrar接口,可以向spring容器注入自定义逻辑的Bean

      配置类未实现任何接口,将配置类注入到spring容器中

3、Bean生命周期的回调

      构造方法——>@Autowired——>Aware接口——>@PostConstruct——>InitializingBean#afterPropertiesSet——>@Bean#initMethod——>@PreDestroy——>DisposableBean#destroy——>@Bean#destroyMethod

4、BeanPostProcesssor:Bean后置处理器。在springbean的扩展中扮演者重要角色,通过它可以在任意一个阶段扩展自己想要的东西。

      Dubbo中当Bean在创建的某个阶段,进入到ReferenceAnnotationBeanPostProcessor类时,就会根据反射判断该类是否有@DubboReference注解,有的话会构建动态代理注入到spring容器中。

5、BeanFactoryPostProcessor:对spring容器进行处理。

      可以禁止spring循环依赖

      实现BeanFactoryPostProcessor接口,获取beanFactory并进行设置:beanFactory.setAllowCircularReferences(false).

6、SPI(service provider Interface):动态替换机制,可以灵活的让接口和实现进行分离,让API提供者只提供接口,让第三方来实现,然后通过配置文件的方式来实现替换或扩展。

  • springboot自动装配:项目启动时,会从所有spring.factories文件中读取@enableAutoConfiguration键值对,在进行去冲突决定使用哪些配置。@SpringbootApplication—>@enableAutoConfiguration—>@Import

  • PropertySourceLoader:springboot环境中,外部配置文件支持properties和yaml格式,可以通过PropertySourceLoader实现支持json格式的配置文件。实现PropertySourceLoader接口,处理json解析逻辑,将自己的实现类加入到spring.factories文件中。

           nacos注册配置中心就是通过实现PropertySourceLoader接口完成对json、xml格式文件的支持

  • ApplicationcontextInitailizer:是springboot启动过程中的扩展点,传入ConfigurableApplicationContext,此时还没调用refresh方法,没有Bean,一般该接口是用来配置ConfigurableApplicationContext的。

  • EnvironmentPostProcessor:用于处理配置信息。

7、ApplicationRunner和CommandLineRunner:在springboot启动成功之后调用,可以获取启动时 的参数。

8、springEvent事件机制

  •    spring事件传播机制:父子容器中,子容器发布的事件,父容器也可以进行监听。

   传播特性的坑:在springcloud环境中,spring发布的事件的监听器可能会执行多次。原因如下:为了使FeignClient和RibbonClient不同的服务配置相互隔离,会创建很多子容器,有一个共同的付容器,就会导致上述问题。

  •    解决方案:判断监听器是否执行过。增加判断标志或者监听类似的事件,比如ApplicationStartedEvent

  •    事件机制的框架应用:Mybatis 的SQLSessionFactoryBean监听ContextRefreshedEvent。

  • springcloud环境中,当项目启动成功,会发布ServletWebServerInitailizedEvent事件,服务注册中心通过监听该事件就可以向注册中心注册事例。

  

     

你可能感兴趣的:(学习总结,spring,java,mybatis)