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/

 

posted on 2023-03-09 18:48  colorfulworld  阅读(217)  评论(0编辑  收藏  举报