深入Spring专题(27)

124 阅读1分钟

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