有这样需求,就是在bean创建实例化之后进行一下初始化,一般场景可以可能是,预加载(将数据库数据加载到缓存中)或是预检查操作,或使用类依赖项。
- 通常需要在初始化Spring bean 时运行一些自定义代码。例如检查强制属性或建立初始连接。在注入属性之后,Spring提供了一些初始化bean的构造。
1、方式一、@PostConstruct
-
这个方法级别的注解,可通过标准Java扩展包获得。应该将其应用于在将属性注入到Bean之后需要执行的方法。Spring支持此注解进行初始化。
-
import javax.annotation.PostConstruct; import org.springframework.util.Assert; public class UserService { private String userprops; public String getUserprops() { return userprops; } public void setUserprops(String userprops) { this.userprops = userprops; } @PostConstruct public void initWithPostConstuctor() { System.out.println("PostConstruct method called"); Assert.notNull(userprops); } }
2、方式二 、init-method (xml标签属性)
-
init-method用于基于XML的Bean配置。可以使用零参数方法对其进行配置以初始化Bean
-
<bean class="com.codelooru.pojo.UserService" id="userService" init-method="initWithXMLInitMethod"> <property name="userprops" value="userprops"> </property> </bean>
-
import org.springframework.util.Assert; public class UserService { private String userprops; public String getUserprops() { return userprops; } public void setUserprops(String userprops) { this.userprops = userprops; } public void initWithXMLInitMethod() { System.out.println("init-method called"); Assert.notNull(userprops); } }
3、方式三、InitializingBean接口
-
initializingBean是具有一个单一方法的接口。afterPropertiesSet方法,Bean可以实现此接口,并且在Bean上设置了所有属性之后,将调用该方法。通常它是最不推荐使用的初始化方法,因为它将类与Spring紧密耦合在一起。
-
import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; public class UserService implements InitializingBean { private String userprops; public String getUserprops() { return userprops; } public void setUserprops(String userprops) { this.userprops = userprops; } public void afterPropertiesSet() throws Exception { System.out.println("afterPropertiesSet for InitializingBean called"); Assert.notNull(userprops); } }
4、实例代码
5、为啥需要使用@PostConstruct注解进行初始化,为啥不能构造方法中进行初始化?
-
因为在调用构造函数时,bean尚未初始化,即没有注入依赖项,在@PostConstruct方法中,bean已完全初始化。您可以使用依赖项。
-
因为这是保证可以在bean生命周期中仅调用一次此方法的约定。可能会发生(尽管不太可能)容器在其内部工作中多此实例化bean,但它保证@PostConstruct只会被调用一次。