深入Spring专题(28)

105 阅读2分钟

这是我参与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();
    }
}