本文僅供學(xué)習(xí)交流使用蝌焚,侵權(quán)必刪移剪。
不作商業(yè)用途,轉(zhuǎn)載請注明出處
Spring Bean能通過不同方式進行初始化瓤摧,下面將展示Spring Bean的各種初始化方式立哑。
通過@PostConstruct
@PostConstruct是java的注解類,如果需要通過這種方式初始化Bean姻灶,需要容器具備掃描注解的能力
以下例子通過@PostConstruct的方式展示
- Bean的類定義
public class SubUser {
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
/**
* 通過@PostConstruct設(shè)定的初始化方法
*/
@PostConstruct
public void initByPostConstruct() {
System.out.println("init method by @PostConstruct");
}
}
- 啟動類
public class BeanInitializationDemo {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext ();
//注冊注解標記的組件class
applicationContext.register (Config.class);
//啟動spring應(yīng)用上下文
applicationContext.refresh ();
SubUser subUser = applicationContext.getBean ("init-by-bean-annotation", SubUser.class);
System.out.println (subUser);
applicationContext.close ();
}
static class Config {
@Bean(name = "init-by-bean-annotation")
public SubUser subUser() {
return new SubUser ();
}
}
}
通過Xml配置init-method方法
Xml方式是比較熟悉的方式铛绰,將定義在Bean類中的初始化方法名設(shè)定在init-method中
- Bean定義
public class SubUser {
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
/**
* Xml配置的初始化方法
*/
public void init() {
System.out.println("init by xml method init config");
}
}
- Xml配置
<!-- 自定義初始化方法-->
<bean id="init-by-init-method" init-method="init" class="com.kgyam.domain.SubUser"></bean>
- 啟動類
public class BeanInitializationDemo {
public static void main(String[] args) {
/*
啟動讀取xml配置的應(yīng)用上下文
*/
ApplicationContext applicationContext = new ClassPathXmlApplicationContext ("classpath:META-INF/bean-initialization-context.xml");
SubUser subUser = applicationContext.getBean ("init-by-init-method", SubUser.class);
System.out.println (subUser);
}
}
通過@Bean的init-method方法
這種方式比較方便,直接在@Bean的注解的init-method上設(shè)定Bean類中的初始化方法名
@Bean(name = "init-by-bean-annotation", initMethod = "initByAnnotation")
public SubUser subUser() {
return new SubUser ();
}
實現(xiàn)InitializingBean
這種方式需要Bean類實現(xiàn)InitializingBean接口重寫afterPropertiesSet方法产喉。
下面只展示實現(xiàn)了InitializingBean的Bean定義
public class SubUser implements InitializingBean {
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
/**
* 實現(xiàn)InitializingBean接口的初始化方法
*
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
System.out.println(" init by InitializingBean#afterPropertiesSet()");
}
}
BeanDefinitionBuilder的setInitMethodName
這種方式是通過BeanDefinition的方式設(shè)定Bean的初始化方法
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext ();
//啟動應(yīng)用上下文
applicationContext.refresh ();
/*
構(gòu)建BeanDefinitionBuilder
*/
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition (SubUser.class);
/*
設(shè)置初始化方法
*/
builder.setInitMethodName ("initByBeanDefinition");
/*
設(shè)置是否延遲加載
*/
//builder.setLazyInit(true);
BeanDefinition beanDefinition = builder.getBeanDefinition ();
/*
向容器注冊BeanDefinition,
*/
String beanName = "init-by-bean-definition";
applicationContext.registerBeanDefinition (beanName, beanDefinition);
SubUser subUser = applicationContext.getBean (beanName, SubUser.class);
System.out.println (subUser);
/*
關(guān)閉應(yīng)用上下文
*/
applicationContext.close ();
關(guān)于初始化方法的執(zhí)行順序
@PostConstruct -> InitializingBean#afterPropertiesSet() -> 自定義init-method
延遲初始化
1. 通過@Lazy
2. 通過Xml配置lazy-init="true"
3. 通過BeanDefinitionBuilder的setLazyInit()
4. 在容器級別默認控制所有Bean延遲初始化,通過beans標簽的屬性default-lazy-init
<beans default-lazy-init="true">
<!-- no beans will be pre-instantiated... -->
</beans>