1. bean初始化简介
spring服务启动,诸如@Configuration @Component注解的类注册到IOC容器,注解描述的bean就完成了初始化。
所谓初始化,就是bean的元信息加载进容器,具体地说就是bean信息从注解中读取出来,加载为BeanDefinition,再通过BeanDefinitionRegistry将这些BeanDefinition注册到IOC容器中
2. Bean初始化的回调函数
@PostConstruct InitilizingBean initMethod是在某个特定bean被初始化后,自动执行一些代码逻辑
2.1 基于@PostConstruct构造后回调函数
@PostConstruct是在被定义成Bean的类的方法上。当@PostConstruct所在类(@Configuration @Component等注解)完成初始化后,会调用被@PostConstrut注解的方法
如果同一个类中,有多个方法被@postConstruct注解,这些方法在bean完成初始化后都会被回调,但是调用顺序不能保证,并不是按照定义舒徐调用的。
另外值得注意是,只有@PostConstruct注解的类是通过注解方式完成初始化时,@PostConstruct才会生效。如果这个class是通过xml初始化成bean,那么@PostConstruct不会起作用
代码示例
代码如下,类Test1没有加@Configuration,springboot启动不会被初始化,其中@PostConstruct不会生效,
public class Test1 { @Value("${mongo.hosts}") String[] mongoHosts; @Value("${mongo.port}") String mongoPort; @PostConstruct public void testPostConstruct(){ System.out.println("test1 postConstruct mongoHosts:"+mongoHosts+"mongoPort:"+mongoPort); } } @Configuration public class Test2 { @Value("${mongo.hosts}") String[] mongoHosts; @Value("${mongo.port}") String mongoPort; @PostConstruct public void testPostConstruct(){ System.out.println("postConstruct mongoHosts:"+mongoHosts+"mongoPort:"+mongoPort); } }
output:
- Root WebApplicationContext: initialization completed in 5629 ms
postConstruct mongoHosts:[Ljava.lang.String;@46fb9581mongoPort:37017
2.2 实现InitializingBean重写afterPropertiesSet
类实现InitializingBean后,重写afterPropertiesSet在类初始化完成后,调用重写的afterPropertiesSet相关代码
实现InitializingBean接口的类,无论是通过注解还是xml,afterPropertiesSet都会生效
示例代码:
@Configuration public class Test2 implements InitializingBean { @Value("${mongo.hosts}") String[] mongoHosts; @Value("${mongo.port}") String mongoPort; @Override public void afterPropertiesSet() throws Exception { System.out.println("InitializingBean mongoHosts:"+mongoHosts+"mongoPort:"+mongoPort); } }
output:
- Root WebApplicationContext: initialization completed in 5629 ms
InitializingBean mongoHosts:[Ljava.lang.String;@2a259f6fmongoPort:37017
2.3 基于@Bean的initMethod属性,初始化后回调函数
@Bean中有个属性initMethod,用来将类中的某个方法指定为初始化函数。
如下例中,当Test3初始化后执行InitDemo类中initService方法
@Service public class Test3 { @Bean(initMethod = "initService") public InitDemo test(){ return new InitDemo(); } }
//@Configuration
public class InitDemo {
@Value("${mongo.hosts}")
String[] mongoHosts;
@Value("${mongo.port}")
String mongoPort;
public void initService(){
System.out.println("init mongoHosts:"+mongoHosts+"mongoPort:"+mongoPort);
}
public void initService1(){
System.out.println("init1 mongoHosts:"+mongoHosts+"mongoPort:"+mongoPort);
}
}
从以下输出可见,在完成Test初始化后执行了initService方法结果,但initService1结果并未在初始化结束后执行
output:
- Root WebApplicationContext: initialization completed in 4143 ms
init mongoHosts:[Ljava.lang.String;@46fb9581mongoPort:37017
2.4 @PostConstruct InitilizingBean InintMethod执行顺序
bean初始化执行顺序先后分为 构造 属性填充 初始化,而已上三种方式对应这三个阶段:@PostConstruct在构造结束后调用,IniitilizingBean在属性填充后被调用,initMethod在初始化完成后被调用
参考文献:https://www.codenong.com/cs106996679/
标签:初始化,String,Spring,PostConstruct,mongoPort,Bean,mongoHosts,public From: https://www.cnblogs.com/enhance/p/17201070.html