文档章节

Spring中ApplicationContextAware使用说明

Josean_Luo
 Josean_Luo
发布于 2014/06/07 23:56
字数 812
阅读 1W
收藏 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
广州
程序员
私信 提问
加载中

评论(0)

Spring 4.2 感知接口

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

Leech
2015/08/07
0
1
通过ApplicationContextAware获取spirng容器里面的bean

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

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

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

嘴角轻扬30
2018/12/26
188
0
Spring中普通类调用bean的方法

参考网址 http://412887952-qq-com.iteye.com/blog/2292388 为什么要使用 因为有这样一类需求: 普通的Java类(没有在Spring容器中管理的类),想直接使用Spring容器管理的对象(比如@Servic...

karma123
2019/01/30
38
0
java线程中如何使用spring注入

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

學楽
2016/11/04
1.9K
4

没有更多内容

加载失败,请刷新页面

加载更多

仁怀哪里可以开餐饮费发票-中国新闻网

仁怀哪里可以开餐饮费发票【139 * 7⒏ б2 * 15 З9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

17054723687
52分钟前
44
0
资兴哪里可以开餐饮费发票-中国新闻网

资兴哪里可以开餐饮费发票【139 * 7⒏ б2 * 15 З9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

17054723480
今天
32
0
沅江哪里可以开餐饮费发票-中国新闻网

沅江哪里可以开餐饮费发票【139 * 7⒏ б2 * 15 З9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

17054723685
今天
36
0
天津哪里可以开餐饮费发票-中国新闻网

天津哪里可以开餐饮费发票【139 * 7⒏ б2 * 15 З9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

17054723617
今天
33
0
汨罗哪里可以开餐饮费发票-中国新闻网

汨罗哪里可以开餐饮费发票【139 * 7⒏ б2 * 15 З9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

17060820048
今天
38
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部