spring 的bean的配置
bean被载入到容器中时,他的生命周期就开始 了。bean工厂在一个bean可以使用前完成很多 工作:
1.容器寻找bean的定义信息并实例化。
2.使用依赖注入,spring按bean定义信息配置bean的所有属性。 3.若bean实现了BeanNameAware接口,工厂调用Bean的setBeanName ()方法传递bean的ID。 4.若bean实现了BeanFactoryAware接口,工厂调用setBeanFactory() 方法传入工厂自身。 5.若BeanPostProcessor和bean关联,则它们的 postProcessBeforeInitialization()方法被调用。 6.若bean指定了ini-method方法、,它将被调用。 7.最后,若有BeanPostProcessor和bean关联,则它们的 postProcessAfterInitialization()方法被调用、。
代码说明Spring中bean的生命周期
1、创建一个实体bean
- package www.csdn.spring1.dao;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.BeanFactory;
- import org.springframework.beans.factory.BeanFactoryAware;
- import org.springframework.beans.factory.BeanNameAware;
- import org.springframework.beans.factory.DisposableBean;
- import org.springframework.beans.factory.InitializingBean;
- publicclass HelloWordDaoImpl implements HelloWordDao,BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean {
- private String context;
- publicvoid setContext(String context) {
- System.out.println("----" + context);
- this.context = context;
- }
- publicvoid close(){
- System.out.println("关闭操作");
- }
- publicvoid init(){
- System.out.println("初始化操作");
- }
- @Override
- publicvoid sayHello() {
- System.out.println("不管与你的路有多苦----不管有多苦。那英---daoImpl");
- }
- @Override
- publicvoid setBeanName(String beanId) {
- System.out.println("输出beanName"+beanId);
- }
- @Override
- publicvoid setBeanFactory(BeanFactory factory) throws BeansException {
- System.out.println("输出factory"+factory.getClass());
- }
- @Override
- publicvoid afterPropertiesSet() throws Exception {
- System.out.println("afterPro");
- }
- @Override
- publicvoid destroy() throws Exception {
- System.out.println("销毁的操作");
- }
- }
package www.csdn.spring1.dao; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; public class HelloWordDaoImpl implements HelloWordDao,BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean { private String context; public void setContext(String context) { System.out.println("----" + context); this.context = context; } public void close(){ System.out.println("关闭操作"); } public void init(){ System.out.println("初始化操作"); } @Override public void sayHello() { System.out.println("不管与你的路有多苦----不管有多苦。那英---daoImpl"); } @Override public void setBeanName(String beanId) { System.out.println("输出beanName"+beanId); } @Override public void setBeanFactory(BeanFactory factory) throws BeansException { System.out.println("输出factory"+factory.getClass()); } @Override public void afterPropertiesSet() throws Exception { System.out.println("afterPro"); } @Override public void destroy() throws Exception { System.out.println("销毁的操作"); } }
2、
创建BeanPostProcessor实现类
- package www.csdn.spring1.dao;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.config.BeanPostProcessor;
- publicclass BeanPostProcessorImpl implements BeanPostProcessor {
- @Override
- public Object postProcessAfterInitialization(Object bean, String beanName)
- throws BeansException {
- System.out.println("初始化之后" + beanName);
- return bean;
- }
- @Override
- public Object postProcessBeforeInitialization(Object bean, String beanName)
- throws BeansException {
- System.out.println("初始化之前" + beanName);
- return bean;
- }
- }
package www.csdn.spring1.dao; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class BeanPostProcessorImpl implements BeanPostProcessor { @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化之后" + beanName); return bean; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化之前" + beanName); return bean; } }
3、
在配置文件中配置实体Bean和BeanPostProcessorImpl特殊的Bean
- <?xmlversion="1.0"encoding="UTF-8"?>
- <beansxmlns="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.xsd">
- <beanid="helloWordDaoImpl"class="www.csdn.spring1.dao.HelloWordDaoImpl"scope="singleton"lazy-init="default"
- init-method="init"destroy-method="destroy"
- >
- <propertyname="context"value="我不会"></property>
- </bean>
- <beanid="beanPostProcessorImpl"class="www.csdn.spring1.dao.BeanPostProcessorImpl"></bean>
- </beans>
<?xml version="1.0" encoding="UTF-8"?> <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.xsd"> <bean id="helloWordDaoImpl" class="www.csdn.spring1.dao.HelloWordDaoImpl" scope="singleton" lazy-init="default" init-method="init" destroy-method="destroy" > <property name="context" value="我不会"></property> </bean> <bean id="beanPostProcessorImpl" class="www.csdn.spring1.dao.BeanPostProcessorImpl"></bean> </beans>
4、测试类
- <preclass="java"name="code">package www.csdn.spring1.bean.cyle;
- import org.junit.Test;
- import org.springframework.beans.factory.config.ConfigurableBeanFactory;
- import org.springframework.beans.factory.xml.XmlBeanFactory;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.ConfigurableApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import org.springframework.core.io.ClassPathResource;
- import www.csdn.spring1.dao.BeanPostProcessorImpl;
- import www.csdn.spring1.dao.HelloWordDaoImpl;
- public class BeanDemoTest {
- //ApplicationContext中bean的生命周期
- @Test
- public void test() throws Exception{
- ApplicationContext context=new ClassPathXmlApplicationContext("classpath:spring_dao.xml");
- ConfigurableApplicationContext cont = (ConfigurableApplicationContext) context;
- cont.close();
- }
- }
- </pre><br>
- <pre></pre>
- <preclass="html"name="code"></pre>
- <p>在BeanFactory中bean的生命周期测试</p>
- <p><br>
- <br>
- </p>
- <preclass="java"name="code">package www.csdn.spring1.bean.cyle;
- import org.junit.Test;
- import org.springframework.beans.factory.config.ConfigurableBeanFactory;
- import org.springframework.beans.factory.xml.XmlBeanFactory;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.ConfigurableApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import org.springframework.core.io.ClassPathResource;
- import www.csdn.spring1.dao.BeanPostProcessorImpl;
- import www.csdn.spring1.dao.HelloWordDaoImpl;
- public class BeanDemoTest {
- //BeanFactory中bean的生命周期
- @Test
- public void test2(){
- //创建资源对象
- ClassPathResource resource=new ClassPathResource("spring_dao.xml");
- //采用BeanFactory初始化容器
- ConfigurableBeanFactory cbf=new XmlBeanFactory(resource);
- //bean后置处理器必须通过addBeanPostProcessor(new BeanPostProcessorImpl())手动添加
- cbf.addBeanPostProcessor(new BeanPostProcessorImpl());
- cbf.getBean("helloWordDaoImpl", HelloWordDaoImpl.class);
- cbf.destroySingletons();
- }
- }
- </pre>
- <p><br>
- </p>