文档章节

Spring中ApplicationContextAware使用说明

Josean_Luo
 Josean_Luo
发布于 2014/06/07 23:56
字数 812
阅读 7305
收藏 8

Spring 中提供一些Aware相关接口,像是BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,实作这些 Aware接口的Bean在被初始之后,可以取得一些相对应的资源,例如实作BeanFactoryAware的Bean在初始后,Spring容器将会 注入BeanFactory的实例,而实作ApplicationContextAware的Bean,在Bean被初始后,将会被注入 ApplicationContext的实例等等。
 Bean取得BeanFactory、ApplicationContextAware的实 例目的是什么,一般的目的就是要取得一些档案资源的存取、相 关讯息资源或是那些被注入的实例所提供的机制,例如ApplicationContextAware提供了publishEvent()方法,可以支持基 于Observer模式的事件传播机制。
 ApplicationContextAware接口的定义如下:

ApplicationContextAware.java

public interface ApplicationContextAware {
    void setApplicationContext(ApplicationContext context);
}


 我们这边示范如何透过实作ApplicationContextAware注入ApplicationContext来实现事件传播,首先我们的HelloBean如下: 

HelloBean.java

package onlyfun.caterpillar;
 
import org.springframework.context.*;
public class HelloBean implements ApplicationContextAware {
    private ApplicationContext applicationContext;
    private String helloWord = "Hello!World!";
   
    public void setApplicationContext(ApplicationContext context) {
        this.applicationContext = context;
    }
   
    public void setHelloWord(String helloWord) {
        this.helloWord = helloWord;
    }
   
    public String getHelloWord() {
        applicationContext.publishEvent(
               new PropertyGettedEvent("[" + helloWord + "] is getted"));
        return helloWord;
    }
}


ApplicationContext会由Spring容器注入,publishEvent()方法需要一个继承ApplicationEvent的对象,我们的PropertyGettedEvent继承了ApplicationEvent,如下: 

PropertyGettedEvent.java

package onlyfun.caterpillar;
 
import org.springframework.context.*;

public class PropertyGettedEvent extends ApplicationEvent {
    public PropertyGettedEvent(Object source) {
        super(source);
    }
}


 当ApplicationContext执行publishEvent()后,会自动寻找实作ApplicationListener接口的对象并通知其发生对应事件,我们实作了PropertyGettedListener如下: 

PrppertyGettedListener.java

package onlyfun.caterpillar;
 
import org.springframework.context.*;
 
public class PropertyGettedListener implements ApplicationListener {
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println(event.getSource().toString());   
    }
}

 Listener必须被实例化,这我们可以在Bean定义档中加以定义: 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="propertyGetterListener" class="onlyfun.caterpillar.PropertyGettedListener"/>
 
    <bean id="helloBean" class="onlyfun.caterpillar.HelloBean">
        <property name="helloWord"><value>Hello!Justin!</value></property>
    </bean>
</beans>


 我们写一个测试程序来测测事件传播的运行: 

Test.java

package onlyfun.caterpillar;
 
import org.springframework.context.*;
import org.springframework.context.support.*;
 
public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
       
        HelloBean hello = (HelloBean) context.getBean("helloBean");
        System.out.println(hello.getHelloWord());
    }
}

 执行结果会如下所示: 

log4j:WARN No appenders could be found for logger 
(org.springframework.beans.factory.xml.XmlBeanDefinitionReader).
log4j:WARN Please initialize the log4j system properly.
org.springframework.context.support.ClassPathXmlApplicationContext: 
displayName=[org.springframework.context.support.ClassPathXmlApplicationContext;
hashCode=33219526]; startup date=[Fri Oct 29 10:56:35 CST 2004]; 
root of ApplicationContext hierarchy
[Hello!Justin!] is getted
Hello!Justin!


 以上是以实作事件传播来看看实作Aware接口取得对应对象后,可以进行的动作,同样的,您也可以实作ResourceLoaderAware接口: 

ResourceLoaderAware.java

public interface ResourceLoaderAware {
    void setResourceLoader(ResourceLoader loader);
}


 实作ResourceLoader的Bean就可以取得ResourceLoader的实例,如此就可以使用它的getResource()方法,这对于必须存取档案资源的Bean相当有用。
 基本上,Spring虽然提供了这些Aware相关接口,然而Bean上若实现了这些界面,就算是与Spring发生了依赖,从另一个角度来看,虽然您可以直接在Bean上实现这些接口,但您也可以透过setter来完成依赖注入,例如: 

HelloBean.java

package onlyfun.caterpillar;
 
import org.springframework.context.*;
 
public class HelloBean {
    private ApplicationContext applicationContext;
    private String helloWord = "Hello!World!";
   
    public void setApplicationContext(ApplicationContext context) {
        this.applicationContext = context;
    }
   
    public void setHelloWord(String helloWord) {
        this.helloWord = helloWord;
    }
   
    public String getHelloWord() {
        applicationContext.publishEvent(new PropertyGettedEvent("[" + helloWord + "] is getted"));
        return helloWord;
    }
}


 注意这次我们并没有实作ApplicationContextAware,我们在程序中可以自行注入ApplicationContext实例: 

ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
       
HelloBean hello = (HelloBean) context.getBean("helloBean");
hello.setApplicationContext(context);
System.out.println(hello.getHelloWord());


 就Bean而言,降低了对Spring的依赖,可以比较容易从现有的框架中脱离。


本文转载自:http://hi.baidu.com/java6666/item/aff06134c0af1a362e0f81ef

共有 人打赏支持
Josean_Luo
粉丝 7
博文 21
码字总数 5148
作品 0
广州
程序员
私信 提问
通过ApplicationContextAware获取spirng容器里面的bean

一、实现 1、ApplicatinContextHelper 2、spring 配置 二、原理 ApplicatinContextHelper继承了spring的ApplicationContextAware接口,并实现了setApplicatinContext方法spring容器在启动过程...

漂泊者及其影子
2016/09/08
30
1
SpringContextHolder工具类

1.工具类用途? 该工具类主要用于那些没有归入spring框架管理的类却要调用spring容器中的bean提供的工具类,在spring中要通过IOC依赖注入来取得对应的对象,但是该类通过实现ApplicationCont...

嘴角轻扬30
2018/12/26
0
0
Spring 4.2 感知接口

1 ApplicationContextAware 当一个ApplicationContext创建一个实现org.springframework.context.ApplicationContextAware接口的实例时,为实例提供一个ApplicationContext引用。 public int......

Leech
2015/08/07
0
1
java线程中如何使用spring注入

在线程或其他协议访问系统时使用@Resource无法自动注入 查了很多资料,说spring为了安全所以不会自动注入。 我的架构是 spring mvc+spring+mybatis 我们系统中有我们自定义的协议访问我们系统...

學楽
2016/11/04
1K
4
【springMVC基础】spring获取bean的几种方法

1、ApplicationContext对象 说明:Spring框架程序通过配置文件手工初始化Spring的情况。 2、通过Spring提供的工具类获取ApplicationContext对象 说明:通过ServletContext对象获取Applicati...

卯金刀GG
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sql根据日期查询,本周,本月,本年,今日相关统计

sql根据日期查询,本周,本月,本年,今日相关统计 昨天 select * from tb where datediff(day, 时间字段 ,getdate()) = 1 今天 select * from tb where datediff(day, 时间字段 ,getdate()) = ...

BraveLN
31分钟前
3
0
Delphi 折叠代码编译变量$REGION

编译变量$REGION,用于在delphi2006以后版本的折叠代码显示,非常方便。 procedure TForm1.Button1Click(Sender: TObject); var uStr: UnicodeString; begin {$REGION '显示uStr变量内容'} ......

dillonxiao
32分钟前
1
0
【更新】SyntaxEditor发布v2018.1,可共享相同代码库

SyntaxEditor最新版本下载 SyntaxEditor是一款强大的代码语法检验控件,采用了当今最前沿的代码编辑的技术,可以为你代码编辑提供强大的管理功能。最新版支持Visual Studio 2013和Windows 8...

电池盒
32分钟前
3
0
如何在基于Bytom开发过程中集成IPFS

本文介绍了基于Bytom开发过程中集成IPFS。 step1: 搭建bytom节点 比原相关资料:https://github.com/Bytom-Community/Bytom_Docs 搭建bytom节点有很多方式,然后开启RPC调用模式。这里推荐用...

比原链Bytom
36分钟前
1
0
sqlyog注册码

sqlyog注册码 1.方式一 用户名: 随意填写 秘钥: ccbfc13e-c31d-42ce-8939-3c7e63ed5417 a56ea5da-f30b-4fb1-8a05-95f346a9b20b a0fe8645-3916-45d4-9976-cb6b88fecc6c b70d7f66-dac2-4462-......

dragon_tech
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部