文档章节

Web项目中获取SpringBean——在非Spring组件中获取SpringBean

 如月王子
发布于 2015/08/14 14:01
字数 851
阅读 7
收藏 0
点赞 0
评论 0

  最近在做项目的时候我发现一个问题:Spring的IOC容器不能在Web中被引用(或者说不能被任意地引用)。我们在配置文件中让Spring自动装配,但并没有留住ApplicationContext的实例。我们如果希望在我们的项目中任何位置都能拿到同一个ApplicationContext来获取IOC容器中的资源,就要让Spring将上下文环境填充到我们能获取的地方,比如下面的做法(来自网络资源):

  自定义一个工具类,实现自ApplicationContextAware接口,接口的方法是setApplicationContext,我们实现它,并让其为我们服务,因为Spring在load自己的时候会将上下文环境填充进来。我们所要做的就是将得到的ApplicationContext保存下来用。

 1 package org.coderecord.ccms.web.action.util;
 2 
 3 import org.springframework.beans.BeansException;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.ApplicationContextAware;
 6 
 7 /**
 8  * Spring IOC上下文工具类
 9  * 
10  * @author Ryan Shaw
11  * 
12  */
13 public class SpringUtil implements ApplicationContextAware {
14 
15     /**
16      * 当前IOC
17      */
18     private static ApplicationContext applicationContext;
19 
20     /**
21      * 设置当前上下文环境,此方法由spring自动装配
22      */
23     @Override
24     public void setApplicationContext(ApplicationContext arg0)
25             throws BeansException {
26         applicationContext = arg0;
27     }
28 
29     /**
30      * 从当前IOC获取bean
31      * 
32      * @param id
33      *            bean的id
34      * @return
35      */
36     public static Object getObject(String id) {
37         Object object = null;
38         object = applicationContext.getBean(id);
39         return object;
40     }
41 
42 }

  上文的类就是我们要用的,而其中的setApplicationContext是接口中需要实现的,Spring会自动进行填充。我们在Spring的配置文件中注册一下:

1 <bean id="springUtil" class="org.coderecord.ccms.web.action.util.SpringUtil" />

  这样就可以了,Spring把我们需要的东西给我们了。

  我们就可以在需要的地方这样做:

1 YouClass obj = (YouClass)SpringUtil.getObject("beanid");

  当然,前提是你需要让Spring自动装配哦。

  

  以下为方法二,使用了注解和静态化的方式来产生SpringFactory对象

  来自网络资源,修改于2013-04-11 15:25:57 

  上文的方法有个麻烦的地方:需要配置。而Spring2.5及之后的版本实际上加入了注解的方式进行依赖项的注入,使用如下代码也许更好:

 1 package org.ahe.util;
 2 
 3 import org.springframework.beans.factory.BeanFactory;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.web.context.support.SpringBeanAutowiringSupport;
 6 
 7 public class SpringWiredBean extends SpringBeanAutowiringSupport {
 8 
 9     /**
10      * 自动装配注解会让Spring通过类型匹配为beanFactory注入示例
11      */
12     @Autowired
13     private BeanFactory beanFactory;
14 
15     private SpringWiredBean() {
16     }
17 
18     private static SpringWiredBean instance;
19 
20     static {
21         // 静态块,初始化实例
22         instance = new SpringWiredBean();
23     }
24 
25     /**
26      * 实例方法
27      * 使用的时候先通过getInstance方法获取实例
28      * 
29      * @param beanId
30      * @return
31      */
32     public Object getBeanById(String beanId) {
33         return beanFactory.getBean(beanId);
34     }
35 
36     public static SpringWiredBean getInstance() {
37         return instance;
38     }
39 }

  如果使用@Autowired注解自动装配的话,继承SpringBeanAutowiringSupport类是不能少的。当然,使用@Component等注解也是可以的。使用注解的话配置就需要改动了,不过因为我们为支持Spring注解的配置是可以多用的,所以还好。如下:

1 <context:component-scan base-package="org.ahe"></context:component-scan>

  该配置即可让org.ahe下所有包(您依然可以通过子标签的正则表达式匹配来进行更多设置)下的注解起作用。

 

 欢迎您移步我们的交流群,无聊的时候大家一起打发时间:Programmer Union

 或者通过QQ与我联系:点击这里给我发消息

     (最后编辑时间2013-04-11 16:59:45)

本文转载自:http://www.cnblogs.com/Johness/archive/2012/12/25/2833010.html

共有 人打赏支持
粉丝 15
博文 177
码字总数 3194
作品 0
淮安
如何将Spring Bean注入到JSF Converter

在项目中,因为想在自定义的JSF Converter中使用Spring Bean,经过搜索和测试,有两种方式可以达到目的 1)使用工具类获取Spring Bean,这个是最容易想到的 //需要在Spring配置文件设置//<be...

huntering
2014/01/11
0
0
《AOSuite G1开发手册》之AOSuite G1服务端开发

《AOSuite G1开发手册》http://git.oschina.net/osworks/AOS/wikis/home AOSuite G1后端主要依赖被广泛使用的Spring和MyBatis框架。因此,大家的技术积累和经验在这里一样是通用的。所以,我...

神盾局-局座
2017/07/09
145
0
在非Spring组件中获取SpringBean

最近项目开始用spring。最恼火的地方是在spring外部实例化的bean需要获得ioc的功能。 发现有俩种模式。 1.BeanFactoryAware接口方式。需要myclass extends BaseAutoAware。 用于第三方组件通...

朱坤朋
2013/10/23
0
0
spring的三种主要的装配机制

本文中使用一个接口类UserInterface以及接口的实现类UserInterfaceImpl,调用接口UserInterface的UserCall类来做示例。 在下面,我们即将为UserCall注入一个UserInterface的实现类,一个字符...

idaren
2016/06/18
34
0
快速学会用SpringMVC搭建最小系统(超详细)

前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群。 本文介绍如何用eclipse一步一步搭建SpringMVC的...

花的鱼
06/29
0
0
三分钟学会用SpringMVC搭建最小系统(超详细)

前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群。 本文介绍如何用eclipse一步一步搭建SpringMVC的...

qq58edeba279279
06/26
0
0
掰弯Wicket: 让wicketstuff-restannotations与wicket-spri

啊哈,掰弯Wicket这个题目有点吓人啊,真实的情况是为了让已经带有Spring属性的wicket与rest化,吾想破了脑壳,找遍了google,花了大半天才找到解决方法,详细情况看我娓娓道来~ 起因 公司的...

奋斗到天明
2015/11/19
0
0
jfinal spring 整合 集成 事务--spring-jfinal

spring-jfinal 作用于 spring 和 jfinal 的整合。 依赖 jar jfinal、javassist v3.*、Spring v3+(3.2.0之前需要依赖cglib) 使用Maven <dependency> 1、web.xml <context-param> 以上通过 Sp......

ylx252
2015/03/09
6.2K
3
苦涩的决断/spring-jfinal

#spring-jfinal 作用于 spring 和 jfinal(理论上支持所有版本) 的整合。 #依赖 jar jfinal、javassist v3.*、Spring v3+(3.2.0之前需要依赖cglib) #使用 Maven cc.ecorespring-jfinal-plugin......

苦涩的决断
2015/03/11
0
0
基于Groovy实现Spring Bean的动态加载

Spring对Groovy有着良好的支持,能把Groovy实现类作为Bean来使用,在前一篇Blog《Spring对Groovy Bean的支持》有详细的描述http://my.oschina.net/joshuazhan/blog/137940。基于Groovy Bean...

joshuazhan
2013/07/15
0
12

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知识点总结

jq如何拿到data-info的自定义属性 1.1 原生可以获取到所有属性el.attrbutes 1.2 jq的$(el).attr('属性名称') 继承的几种方式,原型链 2.1 扩展原型对象实现继承 2.2 替换原型对象实现继承 2....

litCabbage
11分钟前
0
0
python语言规范

http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/...

ghou-靠墙哭
15分钟前
0
0
istio 监控,遥测 (理论)

Istio提供了一种灵活的模型来强制执行授权策略并收集网格中服务的遥测。 基础架构后端旨在提供用于构建服务的支持功能。它们包括诸如访问控制系统,遥测捕获系统,配额执行系统,计费系统等之...

xiaomin0322
17分钟前
0
0
阿里资深专家面试问题收集

corejava hashcode相等的两个对象一定相等吗?equals呢?反过来相等吗? 介绍一下集合框架? hashtable,hashmap底层实现是什么?hashtable和concurrenthashmap底层实现的区别? hashmap和treemap的...

undefine
18分钟前
8
0
alpine安装软件指定安装源

linux-alpine安装软件指定安装源 一、永久修改apk下载源地址 vi etc/apk/repositories 替换成阿里源 http://mirrors.aliyun.com/alpine/v3.8/main/http://mirrors.aliyun.com/alpine/v3...

我心中有猛狗
18分钟前
0
0
Centos7通过yum安装nginx

添加源地址(直接install可能不是最新版本的) sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 安装 sudo yum install -y ng......

iplusx
20分钟前
0
0
ef .core Dapper Helper

using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Threading.Tasks; using Dapper; using Dap......

Lytf
22分钟前
0
0
iOS 小笔记

1.以下代码打印什么     __block int val = 10;    void (^blk)(void) = ^{        printf("val=%d\n",val);        };       val = 2;    blk(); /...

风了个1
24分钟前
0
0
【Spring Boot 系列 Spring Boot示例程序】

入门程序步骤,创建一个Maven项目。继承Spring Boot官方提供的父工程。再引入一个Web的应用启动器。 1、选择一个合适的IDEA工具 创建一个Maven工程,并添加如下配置 <parent> <...

HansonReal
25分钟前
0
0
217. Contains Duplicate - LeetCode

Question 217. Contains Duplicate Solution 题目大意:判断数组中是否有重复元素 思路:构造一个set,不重复就加进去,重复返回true,如果数据量大的话,可以用布隆过滤器 Java实现: publ...

yysue
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部