spring项目启动后,获取bean的方法总结
如果在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的方法总结的更多相关文章
- springboot 学习之路 9 (项目启动后就执行特定方法)
目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...
- ApplicationListener<ContextRefreshedEvent>接口,Spring启动后获取所有拥有特定注解的Bean
最近项目中遇到一个业务场景,就是在Spring容器启动后获取所有的Bean中实现了一个特定接口的对象,第一个想到的是ApplicationContextAware,在setApplicationCon ...
- Spring启动后获取所有拥有特定注解的Bean,注解的属性值
最近项目中遇到一个业务场景,就是在Spring容器启动后获取所有的Bean中实现了一个特定接口的对象,第一个想到的是ApplicationContextAware,在setApplicationCon ...
- 【Spring容器】项目启动后初始化数据的两种实践方案
早期业务紧急,没有过多的在意项目的运行效率,现在回过头看走查代码,发现后端项目(Spring MVC+MyBatis)在启动过程中多次解析mybatis的xml配置文件及初始化数据,对开发阶段开发人员 ...
- Springboot 项目启动后执行某些自定义代码
Springboot 项目启动后执行某些自定义代码 Springboot给我们提供了两种"开机启动"某些方法的方式:ApplicationRunner和CommandLineRun ...
- springboot2.X 在项目启动后执行一段自定义代码
场景: 项目需要在项目启动后从数据库初始化一些数据进入redis , 但是没有很适合 的监听器去实现 , 监听 老是在dao初始化之前触发. 解决方法:自定义类实现 ApplicationRunner ...
- 在web项目启动时,执行某个方法
在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...
- SpringBoot 项目打包后获取不到resource下资源的解决
SpringBoot 项目打包后获取不到resource下资源的解决 在项目中有几个文件需要下载,然后不想暴露真实路径,又没有CDN,便决定使用接口的方式来获取文件.最初的时候使用了传统的方法来获取文 ...
- spring项目启动报错BeanFactory not initialized or already closed
spring项目启动的时候报如下错误: java.lang.IllegalStateException: BeanFactory not initialized or already closed - ...
随机推荐
- 请妥善保管自己的QQ等网络帐号
自从2008年以来,太多的同学.朋友,QQ等网络帐号被盗. 然后,盗号者来骗钱.比如 借用账号.帮忙支付费用等. 盗号者固然可恶,传统骗子的网络版. 可是,这些帐号的主人就仅仅是可怜么? 自己的号被盗 ...
- 如何通过使用fiddler对Android系统设备抓包总结
http://www.open-open.com/lib/view/open1427509907668.html
- Activity转换为View和把图片转换为View
package com.example.viewpager01; import java.util.ArrayList; import java.util.List; import android.a ...
- absolute、relative,toggle()
測试代码例如以下: <div> <div class="global">不应用样式</div> <div class="glob ...
- UDP 打洞示例 包含 服务器 客户端
客户端示例: #include "Net.h" #include "../p2pInfo.h" int main() { CUdp udp; if (0!=u ...
- 读阮一峰《ECMAScript 6 入门》小结
读阮一峰<ECMAScript 6 入门>小结,http://es6.ruanyifeng.com/ 1. ES6简介 Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转 ...
- Flask项目之手机端租房网站的实战开发(十四)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- amazeui学习笔记二(进阶开发4)--JavaScript规范Rules
amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...
- 【编程】辨异 —— proxy 与 delegate
二者分别对应着设计模式中的代理模式和委托模式. proxy:译为代理, 被代理方(B)与代理方(A)的接口完全一致. 主要使用场景(语义)应该是:为简化编程(或无法操作B),不直接把请求交给被代理方( ...
- Android .getRGB得到是负数,解决方案
情景:ava.awt.color 下面的getRGB怎么得出的是负数???本来想通过getRGB得到一个整数,在另外的一个部分在根据这个整数构件一个color,因为参数规定只能能传整数!!!color ...