Spring IoC 之 Bean 的理解
一、Spring IoC容器
1、IoC容器装载Bean工作流程
2、ApplicationContext、BeanFactory的区别
- Bean的初始实例化时间不同:在创建ApplicationContext实例时,Bean全部加载并且实例化;而BeanFactory则是在调用
getBean()
时实例化Bean;(ApplicationContext可以在BeanConfig.xml配置中使用lazy-init=“true”
属性可以实现在调用时实例化Bean) - 继承MessageSource,支持国际化消息
- 拥有上下文事件处理机制
二、Spring Bean的生命周期
Bean的初始化->Bean的使用->Bean的销毁,
对应处理方法方法为init()
、destroy()
在xml配置文件中设置属性init-method="init"
、destroy-method="destroy"
,实现处理方法在Bean的实现类中添加对应名字的方法即可
public void init(){
System.out.println("Bean start ....");
}
public void destroy(){
System.out.println("Bean end...");
}
在使用destroy-method属性时,应使用AbstractApplicationContext获取上下文并最后调用registerShutdownHook()
,才能确保Bean的正常销毁
当多个Bean的init、destroy方法相同时可以在Beans标签中的default-init-method、default-destroy-method属性进行设置。
default-init-method="defaultInit"
default-destroy-method="defaultDestroy"
在java类中实现,并在xml中配置
public class DefaultLifeCircleMethod {
public void defaultInit(){
System.out.println("default init...");
}
public void defaultDestroy(){
System.out.println("default destroy...");
}
}
三、SpringBean的后置处理器(BeanPostProcessor)
在初始化Bean时对Bean的相关属性进行修正
使用:创建一个类InitDefaultTools实现BeanPostProcessor,并在xml配置文件中配置信息,只需要配置class即可
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class InitDefaultTools implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeforeInitialization : " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("AfterInitialization : " + beanName);
return bean;
}
}
postProcessBeforeInitialization(Object bean, String beanName)
、postProcessAfterInitialization(Object bean, String beanName)
在初始化Bean时自动回调
四、Spring Bean的定义继承
与java类的继承不相同,在xml中声明继承
<bean id="parentBean" class="com.hgl.day01.ParentBean">
<property name="message01" value="hello world!"/>
<property name="message02" value="hello second world!"/>
</bean>
<bean id="childBean" class="com.hgl.day01.ChildBean" parent="abstractParent">
<property name="message01" value="hello china!"/>
<property name="message03" value="china first!"/>
</bean>
对childBean实例调用getMessage01、02、03,显示的结果为:
hello china!
hello second world!
china first!
childBean继承了parentBean的方法和属性
也可以使用抽象类作为父类
<bean id="abstractParent" abstract="true">
<property name="message01" value="hello world!"/>
<property name="message02" value="hello second world!"/>
</bean>