spring-第四篇之让bean获取所在的spring容器
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容器相关推荐
- java ssh cpu_初学Java ssh之Spring 第四篇
今天我来学习学习Spring中Bean. 在Spring中原来还有标签啊,它相当于标签的老爸,老爸可以有很多个儿子,但是老爸只有一个哦. 也就是说一个标签内可以有多个标签,每个标签代表一个java实例 ...
- 【Spring第四篇】DI注入以及c、p命名空间
DI注入以及c.p命名空间 编写实体类 Address @Data @AllArgsConstructor @NoArgsConstructor public class Address {priva ...
- spring boot实战(第四篇)分散配置
前言 分散配置是系统必不可少的一部分,将配置参数抽离出来为后期维护提供很大的便利.spring boot 默认支持两个格式的配置文件:.properties .yml. .properties与.ym ...
- 谈谈Spring中的对象跟Bean,你知道Spring怎么创建对象的吗?
本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 推荐阅读: Spring官网阅读 | 总结篇 Spring杂 ...
- 70.打印所有Spring boot载入的bean【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 问题的提出: 我们在开发过程当中,我们可能会碰到这样的问题:No qualifying bean 就是我们定义的bean无法进行注入,那到底是什 ...
- 17、Spring Boot普通类调用bean【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/52013017 我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个 ...
- security框架工作笔记001--- Shiro和Spring Security对比_智慧城市项目中选型用Spring Security
JAVA技术交流QQ群:170933152 Shiro简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Secu ...
- spring之旅第四篇-注解配置详解
spring之旅第四篇-注解配置详解 一.引言 最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会 ...
- springboot java获取版本号_深入实践Spring Boot 实战篇,大佬整理出的PDF文档
如何使用Spring Boot 本文章将会详细介绍如何使用Spring Boot.它覆盖了构建系统,自动配置和运行/部署选项等主题.我们也覆盖了一些Spring Boot最佳实践.尽管Spring B ...
- 4. Spring 如何通过 XML 文件配置Bean,以及如何获取Bean
在 Spring 容器内拼凑 bean 叫做装配.装配 bean 的时候,你是在告诉容器,需要哪些 bean ,以及容器如何使用依赖注入将它们配合在一起. 理论上,bean 装配的信息可以从任何资源获 ...
最新文章
- subview自适应superview的frame autosizingMask(转)
- 安川g7变频器说明书_安川机器人故障维修合集
- 复杂的动态布尔表达式性能评估(1)--Antlr4实现
- python 倒叙 数组_Python函数合集:68个内置函数请收好!
- Unlicensed ARC session – terminating!
- python程序员自我评价_写给程序员的简明 Python(1)
- java你可能不知道的事(2)--堆和栈
- (转)编码剖析Spring管理Bean的原理
- css滤镜使文字变3D效果
- 每天Leetcode 刷题 初级算法篇-数学问题-罗马数字转整数
- 2016计算机奥林匹克小学,NOIP2016复赛数据
- 15个网页数据采集中最常遇到的问题(干货)
- 如何将区块链技术用于版权保护?
- 关于node-pyg的路径问题导致build失败
- 使用WindowsLiveWriter发布51cto博客
- 英国内政部启动遣返程序 数百非法入境者或遭驱逐
- Matlab:创建字符串数组
- 滴滴小程序框架Mpx2.0
- 点分治+CDQ分治+整体二分全纪录
- 在Python中实现对称矩阵
热门文章
- 全网首发:怎样制作CDKEY(6)-CDKEY破解
- WIN7上安装OFFICE 2019(未成功)
- U盘的针脚板竟然掉了
- 面试记录:题都没答就走了
- 市场经济中,大家都象防贼一样保留证据,以用于欠薪仲裁
- STL的vector
- wps怎么把当前页面设置为横向_办公软件操作技巧011:如何将word文档的部分页面改为横向...
- win2012 定时自动备份mysql_SQL SERVER 2012数据库自动备份的方法
- C# 调用C++DLL声明 常规参数/结构体/指针/数组
- 1-10所有5个数的组合_121期大乐透:关注10+5、重点号6个