您的位置:首页 > 编程语言 > Java开发

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

2016-12-12 23:24 357 查看
如果在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;
@Service
public 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring bean 异常 指针 web