org.springframework.context.ApplicationContextInitializer这是整个spring容器在革新之前初始化ConfigurableApplicationContext的回调接口,简单来说,就是在容器革新之前调用此类的initialize方法。这个点答应被用户本身扩展。用户可以在整个spring容器还没被初始化之前做一些事故。
可以想到的场景大概为,在最开始激活一些设置,大概使用这时间class还没被类加载器加载的机遇,进办法态字节码注入等使用。
扩展方式为:
public class TestApplicationContextInitializer implements ApplicationContextInitializer {因为这时间spring容器还没被初始化,以是想要本身的扩展的收效,有以下三种方式:
Spring SPI扩展,在spring.factories中参加org.springframework.context.ApplicationContextInitializer=com.example.demo.TestApplicationContextInitializer
4.BeanDefinitionRegistryPostProcessor
org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor这个接口在读取项目中的beanDefinition之后实验,提供一个增补的扩展点使用场景:你可以在这里动态注册本身的beanDefinition,可以加载classpath之外的bean扩展方式为:
public class TestApplicationContextInitializer implements ApplicationContextInitializer { @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.out.println("[ApplicationContextInitializer]"); }}5.BeanFactoryPostProcessor
org.springframework.beans.factory.config.BeanFactoryPostProcessor这个接口是beanFactory的扩展接口,调用机遇在spring在读取beanDefinition信息之后,实例化bean之前。
在这个机遇,用户可以通过实现这个扩展接口来自行处置惩罚一些东西,比如修改已经注册的beanDefinition的元信息。
扩展方式为:
public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {6.InstantiationAwareBeanPostProcessor
org.springframework.beans.factory.BeanNameAware可以看到,这个类也是Aware扩展的一种,触发点在bean的初始化之前,也就是postProcessBeforeInitialization之前,这个类的触发点方法只有一个:setBeanName使用场景为:用户可以扩展这个点,在初始化bean之前拿到spring容器中注册的的beanName,来自行修改这个beanName的值。扩展方式为:
public class NormalBeanA implements BeanNameAware{ public NormalBeanA() { System.out.println("NormalBean constructor"); } @Override public void setBeanName(String name) { System.out.println("[BeanNameAware] " + name); }}11.@PostConstruct
javax.annotation.PostConstruct这个并不算一个扩展点,着实就是一个标注。其作用是在bean的初始化阶段,假如对一个方法标注了@PostConstruct,会先调用这个方法。这里重点是要关注下这个标准的触发点,这个触发点是在postProcessBeforeInitialization之后,InitializingBean.afterPropertiesSet之前。
使用场景:用户可以对某一方法举行标注,来举行初始化某一个属性
扩展方式为:
public class NormalBeanA { public NormalBeanA() { System.out.println("NormalBean constructor"); } @PostConstruct public void init(){ System.out.println("[PostConstruct] NormalBeanA"); }}12.InitializingBean
org.springframework.beans.factory.InitializingBean这个类,顾名思义,也是用来初始化bean的。InitializingBean接口为bean提供了初始化方法的方式,它只包罗afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时间都会实验该方法。这个扩展点的触发机遇在postProcessAfterInitialization之前。使用场景:用户实现此接口,来举行体系启动的时间一些业务指标的初始化工作。扩展方式为:
public class NormalBeanA implements InitializingBean{ @Override public void afterPropertiesSet() throws Exception { System.out.println("[InitializingBean] NormalBeanA"); }}13.FactoryBean
org.springframework.beans.factory.FactoryBean一样平常环境下,Spring通过反射机制使用bean的class属性指定支线类去实例化bean,在某些环境下,实例化Bean过程比力复杂,假如按照传统的方式,则需要在bean中提供大量的设置信息。设置方式的机动性是受限的,这时接纳编码的方式大概会得到一个简单的方案。
Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。FactoryBean接口对于Spring框架来说占用告急的职位,Spring自身就提供了70多个FactoryBean的实现。它们潜伏了实例化一些复杂bean的细节,给上层应用带来了便利。从Spring3.0开始,FactoryBean开始支持泛型,即接口声明改为FactoryBean<T>的情势使用场景:用户可以扩展这个类,来为要实例化的bean作一个署理,比如为该对象的全部的方法作一个拦截,在调用前后输出一行log,模拟ProxyFactoryBean的功能。
扩展方式为:
public class TestFactoryBean implements FactoryBean<TestFactoryBean.TestFactoryInnerBean> { @Override public TestFactoryBean.TestFactoryInnerBean getObject() throws Exception { System.out.println("[FactoryBean] getObject"); return new TestFactoryBean.TestFactoryInnerBean(); } @Override public Class<?> getObjectType() { return TestFactoryBean.TestFactoryInnerBean.class; } @Override public boolean isSingleton() { return true; } public static class TestFactoryInnerBean{ }}14.SmartInitializingSingleton
org.springframework.beans.factory.SmartInitializingSingleton这个接口中只有一个方法afterSingletonsInstantiated,其作用是是 在spring容器管理的全部单例对象(非懒加载对象)初始化完成之后调用的回调接口。其触发机遇为postProcessAfterInitialization之后。
使用场景:用户可以扩展此接口在对全部单例对象初始化完毕后,做一些后置的业务处置惩罚。
扩展方式为:
public class TestSmartInitializingSingleton implements SmartInitializingSingleton { @Override public void afterSingletonsInstantiated() { System.out.println("[TestSmartInitializingSingleton]"); }}15.CommandLineRunner
org.springframework.boot.CommandLineRunner这个接口也只有一个方法:run(String... args),触发机遇为整个项目启动完毕后,主动实验。假如有多个CommandLineRunner,可以使用@Order来举行排序。
使用场景:用户扩展此接口,举行启动项目之后一些业务的预处置惩罚。
扩展方式为:
public class TestCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("[TestCommandLineRunner]"); }}16.DisposableBean
org.springframework.beans.factory.DisposableBean这个扩展点也只有一个方法:destroy(),其触发机遇为当此对象烧毁时,会主动实验这个方法。比如说运行applicationContext.registerShutdownHook时,就会触发这个方法。扩展方式为:
public class NormalBeanA implements DisposableBean { @Override public void destroy() throws Exception { System.out.println("[DisposableBean] NormalBeanA"); }}17.ApplicationListener