疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

spring 获取bean的几种方法


 

 
实现BeanFactoryAware
 
public class ServiceLocator implements BeanFactoryAware {
 
private static BeanFactory beanFactory;
 
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
ServiceLocator.beanFactory = beanFactory;
}
 
/**
* 根据提供的bean名称得到相应的服务类
* @param servName
* bean名称
*/
public static Object getService(String servName) {
return beanFactory.getBean(servName);
}
 
}
spring配置文件
 
<bean id="serviceLocator" class="com.taobao.appcenter.common.ServiceLocator" lazy-init="false"/>
实现ApplicationContextAware
 
public class SpringContextsUtil implements ApplicationContextAware {
 
private static ApplicationContext applicationContext;    //Spring context   
 
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextsUtil.applicationContext = applicationContext;
}
 
/**
 * @return ApplicationContext
 */
 public static ApplicationContext getApplicationContext() {
   return applicationContext;
 }
 
 /**
 * 获取对象  
 * @param name
 * @return Object 一个以所给名字注册的bean的实例
 * @throws BeansException
 */
 public static Object getBean(String name) throws BeansException {
   return applicationContext.getBean(name);
 }
}
spring xml配置文件
<bean id="springContext" class="com.taobao.appcenter.common.SpringContext" lazy-init="false"/>
通过servlet 或listener设置spring的ApplicationContext,以便后来引用,这个是针对web 工程的
 
public class SpringContext {
private static ApplicationContext applicationContext; // Spring应用上下文环境
 
public static void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContext.applicationContext = applicationContext;
}
 
/**
* @return ApplicationContext
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
 
public static Object getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
}
上面的SpingContext谁没实现任何接口的,不是回调的方式。而是在listener或者servlet中set进来
 
public class SpringContextLoaderListener extends ContextLoaderListener {
 
 
public void contextInitialized(ServletContextEvent event){
super.contextInitialized(event);
SpringContext.setApplicationContext(WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()));
}
 
 
}
替换web.xml文件的listener为上面的文件
 
<listener>
<listener-class>com.taobao.appcenter.common.SpringContextLoaderListener</listener-class>
</listener>
servlet的代码如下
 
public class SpringContextLoaderServlet extends ContextLoaderServlet {
 private ContextLoader contextLoader;
    public void init() throws ServletException {
        this.contextLoader = createContextLoader();
        SpringContext.setApplicationContext(this.contextLoader.initWebApplicationContext(getServletContext()));
    }
}
然后配置web.xml中的servlt和mapping即可。
调用
 
由于使用的都是静态函数,使用getBean(Stirng name)或者getService(String serviceName)就可以获得xml配置的业务自己bean。