这是我参与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>