让Bean获取Spring容器

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

    在这种情况下,Spring容器中Bean通常不会需要访问容器中其他的Bean-采用依赖注入,让Spring把被依赖的Bean注入到依赖的Bean中即可。但是在一些特殊情况下,容器中的Bean可能需要主动访问Spring容器本身,实现BeanFactoryAware接口的Bean,拥有访问BeanFactory容器的能力,实现BeanFactoryAware接口的Bean的实列被容器创建以后,它会拥有一个引用,该引用指向创建它的BeanFactory。BeanFactoryAware接口只有如下一个方法:

    setBeanFactory(BeanFactory beanFactory):该方法有一个参数beanFactory,该参数指向创建它的BeanFactory。该方法由Spring来调用,当Spring调用该方法时,会将Spring容器作为参数传入该方法。与次类似的方法还有ApplicationContextAware接口的setApplicationContext(ApplicationConext applicationContext)。

package com.custle.spring;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class Chineses implements ApplicationContextAware {
	
	//将BeanFactory容器以成员变量保存
	private ApplicationContext ctx;
	
	/* 实现ApplicationContextAware接口必须实现的方法
	 * Spring通过该方法自动传入applicationContext容器
	 * applicationContext用于创建Bean实列
	 */
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.ctx = applicationContext;

	}
	
	//获取ApplicationContext方法
	public ApplicationContext getApplicationContext(){
		return ctx;
	}
}

    将该Bean配置在xml中:

<bean id="chineses" class="com.custle.spring.Chineses"></bean>

    通过实列化方法获取ApplicationContext和通过Chineses Bean来获取BeanFactory,并进行比较:

package com.custle.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextTest {

	public static void main(String[] args) {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext-spring.xml");
		Chineses chineses = (Chineses)applicationContext.getBean("chineses");
		System.out.println(chineses.getApplicationContext());
		//比较applicationContext对象是否相同
		System.out.println(chineses.getApplicationContext() == applicationContext);
	}
}

控制台输出:

org.springframework.context.support.ClassPathXmlApplicationContext@24e6d224: startup date [Mon Feb 05 14:31:23 CST 2018]; root of context hierarchy
true

实现ApplicationContextAware接口让Bean拥有了访问容器的能力,但污染了代码,导致代码与Spring接口耦合在一起。

转载于:https://my.oschina.net/u/3697923/blog/1618562

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值