1、如上一篇文章所述,有时候bean想发布一些容器事件,就需要先获取spring容器,然后将Event交由spring容器将事件发布出去。

为了让bean获取它所在的spring容器,可以让该bean实现BeanFactoryAware接口,BeanFactoryAware接口只有一个方法。

 setBeanFactory(BeanFactory beanFactory):beanFactory参数指向创建它的BeanFactory。这个setter方法与我们往常的setter方法的使用有些差别,它并不是由我们来使用,而是由spring调用,spring调用该方法时会将spring容器作为参数传入该方法。

与BeanFactoryAware接口类似的有ApplicationContextAware接口,实现该接口的bean需要实现setApplicationContext(ApplicationContext applicationContext)方法,该方法也是由spring调用。spring容器调用该方法时,将会把自身作为参数传入该方法。

2、还是对上一篇文章的例子做一些修改来说明

目录结构

增加一个Person.java业务bean,其实现了ApplicationContextAware接口。

package com.lfy.bean;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;import com.lfy.event.EmailEvent;public class Person implements ApplicationContextAware {private ApplicationContext ctx;@Overridepublic void setApplicationContext(ApplicationContext arg0) throws BeansException {this.ctx=arg0;}/*** 模拟人发送邮件业务,发送邮件将触发EmailEvent事件* @param event*/public void sendEmail(EmailEvent event) {System.out.println("\n执行了Person.sendEmail()方法,模拟发出了一封邮件...\n");this.ctx.publishEvent(event);}}

修改beans.xml,将Person注册到spring容器中

<?xml version="1.0" encoding="UTF-8"?>
<!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"><!-- 注册监听器 --><bean class="com.lfy.listener.EmailNotifier"/><bean id="person" class="com.lfy.bean.Person"/>
</beans>

修改SpringListenerTest.java,模拟某人发送邮件,触发了邮件发送监听事件。

package com.lfy.main;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.lfy.bean.Person;
import com.lfy.event.EmailEvent;public class SpringListenerTest {public static void main(String[] args) {//创建spring容器ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");EmailEvent ele=new EmailEvent("test","spring_test@163.com","this is a test");//发布容器事件//ctx.publishEvent(ele);Person p=ctx.getBean("person", Person.class);p.sendEmail(ele);}}

启动运行我们的测试程序:

3、总结

spring容器会检测容器中的所有bean(比如本例中的Person bean),如果发现某个bean实现了ApplicationContextAware接口,spring容器会在创建该bean后,自动调用该bean的setApplicationContext()方法,调用该方法,会将spring容器本身作为参数传递该方法,总而实现让bean获取所在的spring容器。

转载于:https://www.cnblogs.com/ZeroMZ/p/11324352.html

spring-第四篇之让bean获取所在的spring容器相关推荐

  1. java ssh cpu_初学Java ssh之Spring 第四篇

    今天我来学习学习Spring中Bean. 在Spring中原来还有标签啊,它相当于标签的老爸,老爸可以有很多个儿子,但是老爸只有一个哦. 也就是说一个标签内可以有多个标签,每个标签代表一个java实例 ...

  2. 【Spring第四篇】DI注入以及c、p命名空间

    DI注入以及c.p命名空间 编写实体类 Address @Data @AllArgsConstructor @NoArgsConstructor public class Address {priva ...

  3. spring boot实战(第四篇)分散配置

    前言 分散配置是系统必不可少的一部分,将配置参数抽离出来为后期维护提供很大的便利.spring boot 默认支持两个格式的配置文件:.properties .yml. .properties与.ym ...

  4. 谈谈Spring中的对象跟Bean,你知道Spring怎么创建对象的吗?

    本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 推荐阅读: Spring官网阅读 | 总结篇 Spring杂 ...

  5. 70.打印所有Spring boot载入的bean【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 问题的提出: 我们在开发过程当中,我们可能会碰到这样的问题:No qualifying bean  就是我们定义的bean无法进行注入,那到底是什 ...

  6. 17、Spring Boot普通类调用bean【从零开始学Spring Boot】

    转载:http://blog.csdn.net/linxingliang/article/details/52013017 我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个 ...

  7. security框架工作笔记001--- Shiro和Spring Security对比_智慧城市项目中选型用Spring Security

    JAVA技术交流QQ群:170933152 Shiro简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Secu ...

  8. spring之旅第四篇-注解配置详解

    spring之旅第四篇-注解配置详解 一.引言 最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会 ...

  9. springboot java获取版本号_深入实践Spring Boot 实战篇,大佬整理出的PDF文档

    如何使用Spring Boot 本文章将会详细介绍如何使用Spring Boot.它覆盖了构建系统,自动配置和运行/部署选项等主题.我们也覆盖了一些Spring Boot最佳实践.尽管Spring B ...

  10. 4. Spring 如何通过 XML 文件配置Bean,以及如何获取Bean

    在 Spring 容器内拼凑 bean 叫做装配.装配 bean 的时候,你是在告诉容器,需要哪些 bean ,以及容器如何使用依赖注入将它们配合在一起. 理论上,bean 装配的信息可以从任何资源获 ...

最新文章

  1. subview自适应superview的frame autosizingMask(转)
  2. 安川g7变频器说明书_安川机器人故障维修合集
  3. 复杂的动态布尔表达式性能评估(1)--Antlr4实现
  4. python 倒叙 数组_Python函数合集:68个内置函数请收好!
  5. Unlicensed ARC session – terminating!
  6. python程序员自我评价_写给程序员的简明 Python(1)
  7. java你可能不知道的事(2)--堆和栈
  8. (转)编码剖析Spring管理Bean的原理
  9. css滤镜使文字变3D效果
  10. 每天Leetcode 刷题 初级算法篇-数学问题-罗马数字转整数
  11. 2016计算机奥林匹克小学,NOIP2016复赛数据
  12. 15个网页数据采集中最常遇到的问题(干货)
  13. 如何将区块链技术用于版权保护?
  14. 关于node-pyg的路径问题导致build失败
  15. 使用WindowsLiveWriter发布51cto博客
  16. 英国内政部启动遣返程序 数百非法入境者或遭驱逐
  17. Matlab:创建字符串数组
  18. 滴滴小程序框架Mpx2.0
  19. 点分治+CDQ分治+整体二分全纪录
  20. 在Python中实现对称矩阵

热门文章

  1. 全网首发:怎样制作CDKEY(6)-CDKEY破解
  2. WIN7上安装OFFICE 2019(未成功)
  3. U盘的针脚板竟然掉了
  4. 面试记录:题都没答就走了
  5. 市场经济中,大家都象防贼一样保留证据,以用于欠薪仲裁
  6. STL的vector
  7. wps怎么把当前页面设置为横向_办公软件操作技巧011:如何将word文档的部分页面改为横向...
  8. win2012 定时自动备份mysql_SQL SERVER 2012数据库自动备份的方法
  9. C# 调用C++DLL声明 常规参数/结构体/指针/数组
  10. 1-10所有5个数的组合_121期大乐透:关注10+5、重点号6个