spring项目启动后,获取bean的方法总结

来源:互联网 发布:海康网络视频解码器 编辑:程序博客网 时间:2024/04/28 21:38

如果在web项目中,用到定时器的朋友可能会遇到使用spring注解的方式获取bean的时候报空指针的异常。这是就可以使用手工的方法获取spring容器中的bean了。
下面是具体的方法:

1。先说一个最简单的方法

ContextLoaderListener.getCurrentWebApplicationContext().getBean ("beanName");

只要传入bean的name就可以获取了,简单方便。

2。实现BeanFactoryAware接口

package cn.cupcat.util;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.BeanFactoryAware;import org.springframework.stereotype.Service;@Servicepublic class BeanFactotyUtil implements BeanFactoryAware{    private static BeanFactory beanFactory=null;    @Override    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {        this.beanFactory = beanFactory;    }    public static <T> T getBean(String beanName){        return (T)beanFactory.getBean(beanName);     }}

说明:
这个类的意思大体这么几个意思:

1,实现BeanFactoryAware接口,这个接口可以让我们在项目启动后获取bena工厂的实例,从而随心所欲的获取我们想要的bean实例。2,setBeanFactory()方法是用的spring的依赖注入,set方法是三种注入方式之一。这样实例才会注入到该类里。既然要注入,那么我们必须设置BeanUtils这个类也要在项目启动的时候被spring实例化,我这里是采用注解的方式@service来实现。3,静态getBean方法,这里方法必须是静态的,因为你如果自己去new这个BeanUtils类的话,beanFactory是不会被注入进去的。

测试:

@RequestMapping("test")    public void test(){        DaoSupport bean = BeanFactotyUtil.getBean("daoSupport");        System.out.println(bean);    }

访问url:http://www.xy.com:8080/news/addressee/test
控制台打印:

cn.cupcat.dao.DaoSupport@113f0e57  

成功获取

3。方法三

写一个工具类类继承ApplicationObjectSupport,并将这个加入到spring的容器

4。方法四

写一个工具类类继承WebApplicationObjectSupport,并将这个加入到spring的容器

5。方法五

写一个工具类实现ApplicationContextAware接口,并将这个加入到spring的容器

示例:

import java.util.Map;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;/** * 获取ApplicationContext和Object的工具类 * @author yzl * */@SuppressWarnings({ "rawtypes", "unchecked" })public class SpringContextUtils implements ApplicationContextAware {    private static ApplicationContext applicationContext;    public void setApplicationContext(ApplicationContext arg0)            throws BeansException {        applicationContext = arg0;    }    /**     * 获取applicationContext对象     * @return     */    public static ApplicationContext getApplicationContext(){        return applicationContext;    }    /**     * 根据bean的id来查找对象     * @param id     * @return     */    public static Object getBeanById(String id){        return applicationContext.getBean(id);    }    /**     * 根据bean的class来查找对象     * @param c     * @return     */    public static Object getBeanByClass(Class c){        return applicationContext.getBean(c);    }    /**     * 根据bean的class来查找所有的对象(包括子类)     * @param c     * @return     */    public static Map getBeansByClass(Class c){        return applicationContext.getBeansOfType(c);    }}

方法六:

ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)

获取不到报错
方法七:

ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)

获取不到返回null

本文参考了:https://my.oschina.net/u/1454202/blog/521204
http://www.cnblogs.com/yangzhilong/p/3949332.html

0 0