文档章节

Web项目中获取SpringBean

战五渣
 战五渣
发布于 2015/11/15 19:26
字数 713
阅读 9
收藏 0

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

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

package org.coderecord.ccms.web.action.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * Spring IOC上下文工具类
 * 
 * @author Ryan Shaw
 * 
 */
public class SpringUtil implements ApplicationContextAware {

    /**
     * 当前IOC
     */
    private static ApplicationContext applicationContext;

    /**
     * 设置当前上下文环境,此方法由spring自动装配
     */
    @Override
    public void setApplicationContext(ApplicationContext arg0)
            throws BeansException {
        applicationContext = arg0;
    }

    /**
     * 从当前IOC获取bean
     * 
     * @param id
     *            bean的id
     * @return
     */
    public static Object getObject(String id) {
        Object object = null;
        object = applicationContext.getBean(id);
        return object;
    }

}

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

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

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

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

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

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

  

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

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

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

package org.ahe.util;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;

public class SpringWiredBean extends SpringBeanAutowiringSupport {

    /**
     * 自动装配注解会让Spring通过类型匹配为beanFactory注入示例
     */
    @Autowired
    private BeanFactory beanFactory;

    private SpringWiredBean() {
    }

    private static SpringWiredBean instance;

    static {
        // 静态块,初始化实例
        instance = new SpringWiredBean();
    }

    /**
     * 实例方法
     * 使用的时候先通过getInstance方法获取实例
     * 
     * @param beanId
     * @return
     */
    public Object getBeanById(String beanId) {
        return beanFactory.getBean(beanId);
    }

    public static SpringWiredBean getInstance() {
        return instance;
    }
}

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

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

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

© 著作权归作者所有

上一篇: 缓存和事务
战五渣
粉丝 15
博文 21
码字总数 20789
作品 0
海淀
程序员
私信 提问
《AOSuite G1开发手册》之AOSuite G1服务端开发

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

阿老表
2017/07/09
293
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.7K
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
如何将Spring Bean注入到JSF Converter

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

huntering
2014/01/11
516
0
Portal-Basic Java Web 应用开发框架 v2.6.2(源码、示例、文档及 v3.0 新特性介绍)

Portal-Basic Web 应用开发框架(简称 Portal-Basic)是一套功能完备的高性能 Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 访问接口(已内置 Hibernate、MyBatis 和 JDBC 支持)...

伤神小怪兽
2012/11/28
987
7

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
150
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部