7.4.5:让Bean获取Spring容器

前面的程序都是先创建Spring容器,再调用Spring容器的 getBean(String name) 方法来获取Spring容器中的Bean。在这种访问模式下,程序中总是持有Spring容器的引用。

但在实际应用中,尤其是Web应用中,Spring容器通常采用声明式方式配置产生:开发者只要在web.xml文件中配置一个Listener,该Listener将会负责初始化Spring容器。前端MVC框架可以直接调用Spring容器(无须访问Spring容器本身)。在这种情况下,容器中的Bean处于容器管理下,无须主动访问容器,只需接受容器的注入管理即可。Bean实例的依赖关系通常由容器动态注入,无须Bean实例主动请求。

在这种情况下,Spring容器中Bean通常不会需要访问容器中其他的Bean------采用依赖注入,让Spring把被依赖的Bean注入到依赖Bean中即可。但在某些特殊情况下,容器中的Bean可能需要主动访问Spring容器本身,Spring也为这种需求做好了准备。

实现 BeanFactoryAware接口 的Bean,拥有访问BeanFactory容器的能力,实现BeanFactoryAware接口的Bean实例被容器创建以后,它会拥有一个引用,该引用指向创建它的BeanFactory。BeanFactoryAware接口只有如下一个方法:

setBeanFactory(BeanFactory beanFactory):beanFactory参数指向创建它的BeanFactory。

这个setBeanFactory方法将由Spring调用,Spring调用该方法时会将Spring容器作为参数传入该方法。与BeanFactoryAware接口类似的有:ApplicationContextAware接口,实现该接口的Bean需要实现一个setApplicationContext(ApplicationContext applicationContext)方法------该方法也不是由程序员负责调用的,而是由Spring来调用的。当Spring容器调用该方法时,它会把自身作为参数传入该方法。

public class Person implements ApplicationContextAware {
	
	private ApplicationContext ctx;
	
	@Override
	public void setApplicationContext(ApplicationContext ctx)
			throws BeansException {
		this.ctx=ctx;
	}
	
	public ApplicationContext getContext(){
		return ctx;
	}

}
上面Person类实现了ApplicationContextAware接口,并实现了setApplicationContext方法,这就使得该Bean实例可以直接访问到创建它的Spring容器。

部署核心代码:

<bean id="person" class="com.bean.Person"/>

Test.java :

public class Test {

	public static void main(String[] args) {
		
		ApplicationContext ctx=new ClassPathXmlApplicationContext("bean.xml");
		Person p=(Person) ctx.getBean("person");
		System.out.println(p.getContext()==ctx);//true
	}

}
运行Test.java,控制台输出true。

实现ApplicationContextAware接口让Bean拥有了访问容器的能力,但是污染了代码,导致代码与Spring接口耦合在一起。因此如果不是特别必要,建议不要直接访问容器。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值