1、Bean如何获取Spring容器:
1)、实际开发中,项目一般都是在web.xml中配置一个监听器来初始化Spring容器,而有时候Bean需要有访问Spring容器的能力,此时有两种方式来获取 2)、第一种:实现BeanFactoryAware接口,这个接口里面有一个方法,void setBeanFactory(BeanFactory beanFactory),方法的参数指向创建这个Bean的BeanFactory。只要Bean实现了这个接口,Spring会自动把当前容器作为参数注入到这个方法中。 3)、与之类似的第二种:实现ApplicationContextAware接口,这个接口里有一个方法,void setApplicationContext(ApplicationContext applicationContext)。
2、创建一个实现了ApplicationContextAware接口的类:
package com.sxit.service; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; //实现了ApplicationContextAware接口,表示这个实例可以直接访问创建自己的Spring容器 public class Chinese implements ApplicationContextAware { private ApplicationContext apc; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.apc = applicationContext; } public ApplicationContext getApc() { return apc; } }
3、xml配置文件:
<?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-3.0.xsd "> <bean id="chinese" class="com.sxit.service.Chinese" /> </beans>
4、测试类:
package com.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.sxit.service.Chinese; public class Test2 { public static void main(String[] args) { ApplicationContext apc = new ClassPathXmlApplicationContext("Bean3.xml"); Chinese chinese = apc.getBean("chinese", Chinese.class); System.out.println("chinese中的容器:"+chinese.getApc()); System.out.println("容器:"+apc); System.out.println(chinese.getApc()==apc); } }
5、打印信息:
chinese中的容器:org.springframework.context.support.ClassPathXmlApplicationContext@c1b531: startup date [Tue Nov 06 08:41:52 GMT 2012]; root of context hierarchy 容器:org.springframework.context.support.ClassPathXmlApplicationContext@c1b531: startup date [Tue Nov 06 08:41:52 GMT 2012]; root of context hierarchy true
6、总结:
1)、实现了ApplicationContextAware接口的Bean虽然让它拥有了访问容器的能力,但是会使代码与Spring接口耦合在一起,所以并不建议这样做。