在写代码的时候经常会碰到需要获取JavaBean的场景,使用Spring 的 @Resource/@Autowired 注入基本能覆盖80% 获取bean 的场景,但是在有的场景下不能使用注入的方式,如:在使用dubbo 的filter 功能时,因为dubbo 的filter不由Spring 管理,所以使用注入的方式会导致注入不成功。
此时,只能从容器中手动的获取Bean,那么获取JavaBean的方法有那些
1-- ApplicationContext context = new FileSystemXmlApplicationContext("web/WEB-INF/classes/spring_*.xml");
2--ApplicationContext context=new ClassPathXmlApplicationContext("pring_*.xml");
3--WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext(); 部分类里Spring无法注入bean时可以用这种
推荐通过实现ApplicationContextAware接口,获取ApplicationContext,然后通过getBeansOfType获取
继承ApplicationContextAware 来获取Bean
package com.example;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class ApplicationContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{
this.applicationContext = applicationContext;
}
public static ApplicationContext getContext() {
return applicationContext;
}
public static <T> T getBean(String name) {
if (applicationContext == null) {
return null;
}
return (T) applicationContext.getBean(name);
}
}
将ApplicationContextAware 配置进application-context.xml
<bean id="applicationContextUtil" class="com.example.ApplicationContextUtil"/>
在需要的地方获取bean
TestBean testBean = ApplicationContextUtil.getBean("testBean");
使用ContextLoader 获取bean
ApplicationContext app = ContextLoader.getCurrentWebApplicationContext();
TestBean testBean = app.getBean("testBean", TestBean.class);
继承 BeanFactoryAware 获取bean
在单元测试时,像dubbo filter这种场景,只能使用Spring 容器来获取bean了, 示例如下:
创建一个类继承BeanFactoryAware
package com.example;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
public class SpringBeanFactory implements BeanFactoryAware {
private static BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory factory) throws BeansException {
this.beanFactory = factory;
}
/**
* 根据beanName名字取得bean
* @param name
* @param <T>
* @return
*/
public static <T> T getBean(String name) {
if (beanFactory == null) {
return null;
}
return (T) beanFactory.getBean(name);
}
}
SpringBeanFactory 配置进application-context.xml
<bean id="springBeanFactory" class="com.example.SpringBeanFactory"/>
在需要的地方获取bean
TestBean testBean = SpringBeanFactory.getBean("testBean");
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。