这是我参与2022首次更文挑战的第34天,活动详情查看2022首次更文挑战
唯一区别就是该类实现了InitializingBean接口,并且将初始化逻辑放入afterPropertiesSet()方法中,可看到该例的配置文件如下:
<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>
区别是去掉了init-method属性,由于Singer类实现了InitializingBean接口,因此Spring知道调用哪个方法作为初始化回调,不需要任何其他配置。
使用JSR-250 @PostConstruct注解
使用JSR-250生命周期注解@PostConstruct,从Spring2.5开始,可使用JSR-250注解来指定在类中存在与bean的生病周期相关的相应注解时Spring应该调用的方法。使用@PostConstruct注解代码如下:
public class SingerWithPostConstruct{
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;
}
@PostConstruct
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-method方法一样,只是在init()方法前应用了@PostConstruct注解
注意点;
可为该方法分配任何名称,由于使用了注解,所以需要将上下文空间中的context:annotation-driven标记添加到配置文件中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmls=“http://www.springframework.org/schema/beans”
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd" default-lazy-init="true">
<context:annotation-config/>
<bean id="singerOne" class="com.ozx.SingerWithPostConstruct" p:name="shiyi" p:age="18"/>
<bean id="singerTwo" class="com.ozx.SingerWithPostConstruct" p:age="28"/>
<bean id="singerThree" class="com.ozx.SingerWithPostConstruct" p:name="eleven"/>
</beans>