什么是Bean?
就是将某个类注册为bean,并用id为其取个名字,在通过容器的getBean方法获取这个类的实例对象,然后就可以调用这个类的方法了。所以bean就是相当于new一个对象,只不过它是容器帮你生成的。
Spring Bean的生命周期
其中BeanPostProcess接口是针对所有的bean而言的。
当一个bean实现了上述接口,我们只需要Spring IOC容器中定义它就可以了,Spring IOC容器会自动识别,并按顺序执行。
测试步骤
1.生产果汁
public class Source { private String fruit;//类型 private String sugar;//糖分描述 private String size;//大小杯 //setter getter }
2.店里售卖果汁
public class JuiceMaker implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean{ private String beverageShop=null; private Source source=null; //setter getter public void myInit() { System.out.println("【"+this.getClass().getSimpleName()+"】执行自定义初始化方法"); } public void myDestroy() { System.out.println("【"+this.getClass().getSimpleName()+"】执行自定义销毁方法"); } public String makeJuice() { String juice="这是一杯由"+beverageShop+"饮品店,提供的"+source.getSize()+source.getSugar()+source.getFruit(); return juice; } @Override public void destroy() throws Exception { System.out.println("调用接口DisposableBean的destroy方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("【"+this.getClass().getSimpleName()+"】调用InitializingBean接口的afterPropertiesSet方法"); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("【"+this.getClass().getSimpleName()+"】调用ApplicationContextAware接口的setApplicationContext方法"); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("【"+this.getClass().getSimpleName()+"】调用BeanFactoryAware接口的setBeanFactory方法"); } @Override public void setBeanName(String name) { System.out.println("【"+this.getClass().getSimpleName()+"】调用BeanNameAware接口的setBeanName方法"); } }
3.自定义BeanPostProcess方法
//BeanPostProcessor的这两个方法都是针对全部bean而言的 public class BeanPostProcessorImpl implements BeanPostProcessor{ //预初始化方法 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("【"+bean.getClass().getSimpleName()+"】对象"+beanName+"开始实例化"); return bean; } //后初始化方法 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("【"+bean.getClass().getSimpleName()+"】对象"+beanName+"实例化完成"); return bean; } }
4.现场配置所需类型果汁
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <bean id="beanPostProcessor" class="test4.BeanPostProcessorImpl"/> <bean id="source" class="test4.Source"> <property name="fruit" value="橙汁"/> <property name="sugar" value="少糖"/> <property name="size" value="大杯"/> </bean> <bean id="juiceMaker" class="test4.JuiceMaker" init-method="myInit" destroy-method="myDestroy"> <property name="beverageShop" value="贡茶"/> <property name="source" ref="source"/> </bean> </beans>
5.得到果汁并附加其它功能
//对于我来说我只是想要一杯果汁,我直接找贡茶饮品店去买,而贡茶饮品店是怎么制作的我不关心 //对于饮品店来说,它提供店面,找别人外包商提供果汁就行了,外包商专业做果汁的,他就能很专业的做好果汁 public static void main(String[] args) { //配置文件跟包是并列的 ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("spring-cfg.xml"); JuiceMaker juiceMaker =(JuiceMaker)ctx.getBean("juiceMaker"); System.out.println(juiceMaker.makeJuice()); ctx.close(); }
【Source】对象source开始实例化
【Source】对象source实例化完成
【JuiceMaker】调用BeanNameAware接口的setBeanName方法
【JuiceMaker】调用BeanFactoryAware接口的setBeanFactory方法
【JuiceMaker】调用ApplicationContextAware接口的setApplicationContext方法
【JuiceMaker】对象juiceMaker开始实例化
【JuiceMaker】调用InitializingBean接口的afterPropertiesSet方法
【JuiceMaker】执行自定义初始化方法
【JuiceMaker】对象juiceMaker实例化完成
这是一杯由贡茶饮品店,提供的大杯少糖橙汁
调用接口DisposableBean的destroy方法
【JuiceMaker】执行自定义销毁方法
假如不注册<bean id="beanPostProcessor" class="test4.BeanPostProcessorImpl"/>
结果如下:
【JuiceMaker】调用BeanNameAware接口的setBeanName方法
【JuiceMaker】调用BeanFactoryAware接口的setBeanFactory方法
【JuiceMaker】调用ApplicationContextAware接口的setApplicationContext方法
【JuiceMaker】调用InitializingBean接口的afterPropertiesSet方法
【JuiceMaker】执行自定义初始化方法
这是一杯由贡茶饮品店,提供的大杯少糖橙汁
调用接口DisposableBean的destroy方法
【JuiceMaker】执行自定义销毁方法