这是我参与2022首次更文挑战的第35天,活动详情查看2022首次更文挑战
使用初始化方法时,可使用应用与Spring分离,但必须记住为每个需要初始化方法的bean配置响应的初始化方法。如果使用InitializingBean接口,则可以一次性为bean类的所有实例指定初始化回调,但必须结合应用才能完成此操作。如果使用注解,需要将注解应用于方法,并确保IoC容器支持JSR-250。总之,应该根据应用的需求决定使用哪种方法。如果可移植性是一个需要关注的问题,那请使用初始化或注解方法,否则,请使用InitializingBean接口,以减少应用需要的配置数量,以及由于配置错误而导致出现错误的可能性。
注意点:
当使用init-method或@PostConstruct配置初始化时,声明带不同访问权限的初始化方法是有好处的,初始化方法应该在bean创建时由Spring IoC调用一次,而随后的调用将意外的结果甚至失败,可通过将初始化私有化禁止外部调用,Spring IoC能够通过反射来调用它,但是代码中的任何其他调用都不被允许。
使用@Bean声明一个初始化方法
为bean声明初始化方法的另一种方法是指定@Bean注解的initMethod属性,并将初始化方法的名称设置为它的值,该注解用于在Java配置类中声明bean。
使用初始Singer类,需要编写一个配置类和一个新的main()方法来测试它,default-lazy-init="true"的配置使用@Lazy注解代替。
public class SingerConfigDemo{
@Configuration
static class SingerConfig{
@Lazy
@Bean(initMethod="init")
Singer singerOne(){
Singer singer=new Singer();
singer.setName("shiyi");
singer.setAge(18);
return singer;
}
@Lazy
@Bean(initMethod="init")
Singer singerTwo(){
Singer singerTwo=new Singer();
singerTwo.setAge(28);
return singerTwo;
}
@Lazy
@Bean(initMethod="init")
Singer singerThree(){
Singer singerTwo=new Singer();
singerTwo.setName("eleven");
return singerTwo;
}
}
public static void main(String... args){
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(SingerConfig.class);
getBean("singerOne",ctx);
getBean("singerTwo",ctx);
getBean("singerThree",ctx);
ctx.close();
}
}