深入Spring专题(24)

118 阅读2分钟

这是我参与2022首次更文挑战的第31天,活动详情查看2022首次更文挑战

在创建bean时执行方法

接收初始化回调的一种方法是在bean上指定一个方法作为初始化方法,并告诉Spring将此方法用作初始化方法,当只有几个相同类型的bean,或者应用与Spring分离时,这种回调机制是为了能够让Spring应用使用先前构建的或第三方提供的bean,指定回调方法只是在bean的标记的init-method属性中指定名称的一种情况。

定义一个具有两个依赖项的基本bean

public class Singer{
    private static final String DEFAULT_NAME="ozx";
    
    private Strig name;
    private int age=Integer.MIN_VALUE;
    
    public void setName(String name){
        this.name=name;
    }
    public void setAge(int age){
        this.age=age;
    }
    public void init(){
        System.out.println("Initializing Bean");
        if(name == null){
            System.out.println("Using default name");
            name = DEFAULT_NAME;
        } 
        if(age == Integer.MIN_VALUE){
            throw new IllegalArgumentException("必须先填充age属性的值");
        }
    }
    
    public String toString(){
        return "Name:"+name+"\n Age:"+age;
    }
    
    public static void main(String... args){
       GenericXmlApplicaiotnContext ctx= new GenericXmlApplicaiotnContext();
        ctx.load("classpath:spring/app-context.xml");
        ctx.refresh();
        
        getBean("singerOne",ctx);
        getBean("singerTwo",ctx);
        getBean("singerThree",ctx);
        ctx.close();
    }
    
    public static Singer getBean(String beanName,Application ctx){
        try{
            Singer bean=ctx.getBean(beanName);
            System.out.println(bean);
            return bean;
        }catch(BeanCreationException e){
            System.out.println("异常发生在bean配置:"+e.getMessage());
            return null;
        }
    }
}

已定义了方法init()作为初始化回调函数,init()方法检查name属性是否已设置,如果未设置,则使用存储在DEFAULT_NAME常量中的默认值,init()方法还会检查age属性是否已设置,如果未设置,则会抛出IllegalArgumentException异常。

Simple Bean类的main()方法使用自己的getBean()方法从GenericXMLApplicationContext获取三个bean,在getBean()方法中,如果成功获取bean,就把其详细信息写入控制台输出。如果在init()方法中抛出一个异常,则可能是因为未设置age属性,Spring会将该异常封装到BeanCreationException中。getBean()方法捕获这些异常,并向控制输出错误信息,并返回null值。 ApplicationContext配置如下:

<beans  ... default-lazy-init="true">
    <bean id="singerOne" class="com.ozx.Singer" init-method="init" p:name="shiyi" p:age="18"/>
    <bean id="singerTwo" class="com.ozx.Singer" init-method="init" p:age="28"/>
    <bean id="singerThree" class="com.ozx.Singer" init-method="init" p:name="eleven"/>
</beans>