`
zzc1684
  • 浏览: 1190469 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Java类获取Spring的ApplicationContext

阅读更多

实现

   1.创建一个类让其实现org.springframework.context.ApplicationContextAware接口来让Spring在启动的时候为我们注入ApplicationContext对象.

  import org.springframework.beans.BeansException;

  import org.springframework.context.ApplicationContext;

  import org.springframework.context.ApplicationContextAware;

 

  public class MyApplicationContextUtil implements ApplicationContextAware {

    private static ApplicationContext context;

    //声明一个静态变量保存

    public void setApplicationContext(ApplicationContext contex) throws BeansException {

      this.context=contex;

    }

    public static ApplicationContext getContext(){

      return context;

    }

    public final static Object getBean(String beanName){
      return context.getBean(beanName);
    }

    public final static Object getBean(String beanName, Class<?> requiredType) {
      return context.getBean(beanName, requiredType);
    }

  }

 

  2.在applicationContext.xml文件中配置此bean,以便让Spring启动时自动为我们注入ApplicationContext对象.

  例:

  <!-- 这个bean主要是为了得到ApplicationContext 所以它不需要其它属性-->

  <bean class="org.ing.springutil.MyApplicationContextUtil"></bean>

  3.有了这个ApplicationContext之后我们就可以调用其getBean("beanName")方法来得到由Spring 管理所有对象.

 

原理

Spring中提供一些Aware相关的接口,BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,其中最常用到的是ApplicationContextAware。 实现ApplicationContextAware的Bean,在Bean被初始后,将会被注入ApplicationContext的实例。 ApplicationContextAware提供了publishEvent()方法,实现Observer(观察者)设计模式的事件传播机,提供了 针对Bean的事件传播功能。通过Application.publishEvent方法,我们可以将事件通知系统内所有的 ApplicationListener。

Spring事件处理一般过程:

定义Event类,继承org.springframework.context.ApplicationEvent。
编写发布事件类Publisher,实现org.springframework.context.ApplicationContextAware接口。
覆盖方法setApplicationContext(ApplicationContext applicationContext)和发布方法publish(Object obj)。
定义时间监听类EventListener,实现ApplicationListener接口,实现方法onApplicationEvent(ApplicationEvent event)。

MessageEvent Java代码

import org.springframework.context.ApplicationEvent;

/**
* 定义事件信息
* @author new
*
*/
public class MessageEvent extends ApplicationEvent {

 private String message;

 public void setMessage(String message){
this.message = message;
 }

 public String getMessage(){
return message;
 }

 public MessageEvent(Object source, String message) {
super(source);
this.message = message;
// TODO Auto-generated constructor stub
 }

 private static final long serialVersionUID = 1L;
}

 

Publisher Java代码

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

public class Publisher implements ApplicationContextAware {

 private ApplicationContext context;

 @Override
 public void setApplicationContext(ApplicationContext arg0)
 throws BeansException {
// TODO Auto-generated method stub
this.context = arg0;
 }

 public void publish(String message){
context.publishEvent(new MessageEvent(this,message));
 }

 public static void main(String[] args) {
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Publisher pub = (Publisher) ctx.getBean("publisher");
pub.publish("Hello World!");
pub.publish("The quick brown fox jumped over the lazy dog");
 }
}

 

MessageEventListener Java代码

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class MessageEventListener implements ApplicationListener {

 @Override
 public void onApplicationEvent(ApplicationEvent event) {
// TODO Auto-generated method stub
if(event instanceof MessageEvent){
 MessageEvent msEvent = (MessageEvent)event;
 System.out.println("Received: " + msEvent.getMessage());
}
 }
}

 

在运行期,ApplicationContext会自动在当前的所有Bean中寻找ApplicationListener接口的实现,并将其作为事件接 收对象。当Application.publishEvent方法调用时,所有的ApplicationListener接口实现都会被激发,每个 ApplicationListener可根据事件的类型判断是否是自己需要处理的事件,如上面的ActionListener只处理 ActionEvent事件。

分享到:
评论

相关推荐

    Java后端开发-Spring库.zip

    4.测试:启动Spring,获取Hello示例。 二、Spring基于XML装配实验 说明:使用Spring IOC模拟实现账户添加功能程序 1.创建JavaBean类:Account.java 2.创建DAO类: AccountDao.java,模拟账户添加操作 3.创建Service...

    spring结合mongodb例子(maven java project)

    例子简单的实现了spring结合mongo的例子 spring:4.1.2 spring-data-mongodb:1.1.0 java:1.8 log4j:1.2.16 junit:4.12 commons-logging:1.1.1 maven:3 注意:spring的不同版本与...3.列出log日志的java代码获取方式

    SpringUtil.java

    SpringUtil工具类(获取applicationContext,通过name获取 Bean,通过class获取Bean,通过name,以及Clazz返回)

    获取spring管理的bean

    以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext. 在配置文件中注入&lt;bean class="xxx.xxx.SpringContextHolder" lazy-init="false" /&gt; 即可使用

    Util通用工具类(轮子类)

    避免重复造轮子,开发中常用封装...渲染工具类,资源文件相关的操作类,对比两个对象的变化的工具类,Spring的ApplicationContext的持有者,可以用静态方法的方式获取spring容器中的bean,sql语句工具类,高频方法集合类

    spring技术入门相关源码

    //创建spring的ApplicationContext ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); //输出spring容器 System.out.println(ctx); //打印加载的bean名称 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 5.4.2.1. 注册用户自定义的PropertyEditor 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 ...

    Spring 2.0 开发参考手册

    18.3. 使用Spring提供的辅助类实现EJB组件 19. JMS 19.1. 简介 19.2. 使用Spring JMS 19.2.1. JmsTemplate 19.2.2. 连接工厂 19.2.3. (消息)目的地管理 19.2.4. 消息侦听容器 19.2.5. 事务管理 19.3. 发送...

    Spring.3.x企业应用开发实战(完整版).part2

    4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 不同配置方式比较 4.13 小结 第5章 Spring容器高级主题 5.1 Spring容器技术内幕 5.1.1 内部工作机制 5.1.2 BeanDefinition 5.1.3 InstantiationStrategy 5.1.4 ...

    Spring中文帮助文档

    3.10. 以J2EE RAR文件的形式部署Spring ApplicationContext 3.11. 基于注解(Annotation-based)的配置 3.11.1. @Autowired 3.11.2. 基于注解的自动连接微调 3.11.3. CustomAutowireConfigurer 3.11.4. @...

    Spring API

    3.10. 以J2EE RAR文件的形式部署Spring ApplicationContext 3.11. 基于注解(Annotation-based)的配置 3.11.1. @Autowired 3.11.2. 基于注解的自动连接微调 3.11.3. CustomAutowireConfigurer 3.11.4. @...

    java8源码-Spring5:Spring5新特性

    通过加载配置文件、获取类的全路径、反射类 IOC接口(BeanFactory) IOC思想基于IOC容器完成,IOC容器底层就是对象工厂。 Spring提供IOC容器实现的2种方式: BeanFactory:IOC容器基本实现,Spring内部使用接口 加载...

    spring chm文档

    Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop ...18.3. 使用Spring提供的辅助类实现EJB组件 19. JMS 19.1. 简介 19.2. 使用Spring JMS ...

    Spring3.x企业应用开发实战(完整版) part1

    4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 不同配置方式比较 4.13 小结 第5章 Spring容器高级主题 5.1 Spring容器技术内幕 5.1.1 内部工作机制 5.1.2 BeanDefinition 5.1.3 InstantiationStrategy 5.1.4 ...

    springmybatis

    1.Configuration.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 &lt;typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/&gt; 这个别名...

    applicationContext-mybatis

    spring事务管理配置,redis配置,sql心跳配置,JNDI获取数据源。

    java查看sun包源码-learning-spring:Spring框架讲解

    java查看sun包源码 Spring 学习笔记 IOC 和 DI 的概述 IOC(Inversion of Controll) 思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源。作为回应,容器适时的返回资源。而应用了IOC之后...

    spring-best-practics:Spring最佳实践演示案例

    最佳实践总结了本人多年的Java开发中的一些开发经验以及工具类和Spring框架的应用采用了项目Demo的方式把零散的内容联系在一起去展示其用法,可以直接拿来作为种子项目,用于快速建造中小型的spring-boot项目项目...

    spring aop 实现源代码--xml and annotation(带lib包)

    并定义了一个 org.springframework.aop.framework.ProxyFactoryBean对象(messageSender),FactoryBean或ApplicationContext将使用ProxyFactoryBean来建立代理对象,在这里就是messageSenderImpl建立代理对象。...

    demo-akka-spring:“将Akka与Spring结合使用”文章和源代码-java source code

    首先,使用SpringActorProducer来创建actor,方法是通过按名称从ApplicationContext中将它们作为Spring bean获得(而不是通过Java反射从其类中创建actor)。 public class SpringActorProducer implements ...

Global site tag (gtag.js) - Google Analytics