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; @Override
public 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容器。
spring-第四篇之让bean获取所在的spring容器的更多相关文章
- Spring第四篇
在spring第三篇中介绍了bean元素属性 在第四篇中介绍spring注入的方式 1 set方法注入 建立一个User类 创建私有的属性 set get 方法 重写toString方法 代码如下 ...
- SSH框架之Spring第四篇
1.1 JdbcTemplate概述 : 它是spring框架中提供的一个对象,是对原始JdbcAPI对象的简单封装.spring框架为我们提供了很多的操作模板类. ORM持久化技术 模板类 JDBC ...
- Spring Boot 使用Java代码创建Bean并注册到Spring中
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/catoop/article/details/50558333 声明同一个类下的多个实例: packa ...
- (41)Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
已经好久没有讲一些基础的知识了,这一小节来点简单的,这也是为下节的在Spring Boot中使用多数据源做准备. 从Spring 3.0开始,增加了一种新的途径来配置Bean Definition,这 ...
- Spring第四篇【Intellij idea环境下、Struts2和Spring整合】
前言 Spring的第二和第三篇已经讲解了Spring的基本要点了[也就是Core模块]-本博文主要讲解Spring怎么与Struts2框架整合- Struts2和Spring的整合关键点: acti ...
- 初学Java ssh之Spring 第四篇
今天我来学习学习Spring中Bean. 在Spring中原来还有<beans.../>标签啊,它相当于<bean.../>标签的老爸,老爸可以有很多个儿子,但是老爸只有一个哦 ...
- 第四课:通过配置文件获取对象(Spring框架中的IOC和DI的底层就是基于这样的机制)
首先在D盘创建一个文件hero.txt,内容为:com.hero.Hero(此处必须是Hero的完整路径) 接下来是Hero类 package com.hero; public class Hero ...
- 【第四篇】- Maven 构建生命周期之Spring Cloud直播商城 b2b2c电子商务技术总结
Maven 构建生命周期 Maven 构建生命周期定义了一个项目构建跟发布的过程. 一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的: 阶段 处理 描述 验证 ...
- spring使用注解的方式创建bean ,将组件加入容器中
第一种使用@Bean的方式 1.创建一个bean package com.springbean; public class Person { private String name; private ...
随机推荐
- 攻防世界--ReverseMe-120
测试文件:https://adworld.xctf.org.cn/media/task/attachments/a5c0e8322d9645468befabddfe0cb51d.exe 1.准备 获取 ...
- vue.js(15)--vue的生命周期
生命周期钩子 生命周期钩子=生命周期函数=生命周期事件 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等 ...
- websocket无法注入bean问题解决方案
websocket服务端往往需要和服务层打交道,因此需要将服务层的一些bean注入到websocket实现类中使用,但是呢,websocket实现类虽然顶部加上了@Component注解,依然无法通过 ...
- 编辑器和IDE的区别以及WebStorm和PhpStorm的区别
编辑器和IDE的区别: 编辑器就是纯粹编辑文本的编辑器,识别级别在文字级,只显示你想写入和打开的文本内容,不管你写什么内容,只提供接收与显示功能,Windows自带的写字板就是最简单的编辑器.举个生活 ...
- 定时器,定时发邮件JavaMail
一.定时器用法: 1.1先导入jar包 <!--spring整合其他文件时要用的jar包--> <dependency> <groupId>org.springfr ...
- split 分割文件
1.命令功能 split将文件分割成多个碎片文件. 2.语法格式 split option input prefix split 选项 输入文件名 输出文件名前缀 参数说明 参数 参 ...
- POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)
$ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 ...
- mobiscroll实现二级联动菜单
mobiscroll是一款非常使用的移动端选择控件,一般用来日期时间的选择的多,其实从官网上可以看到它有很多方面的使用,这里就不一一介绍了,有兴趣可以去官网上查阅一下 https://demo.mob ...
- oppo面试题
1.synchronized和Lock有什么区别?哪个可重入?哪个效率高? synchronized和Lock都用于线程同步的场景中. synchronized是jdk的关键字,用来构造同步代码块或者 ...
- Curl命令、Elinks命令、lynx命令、Wget命令、lftp命令
一.Curl命令 语法 curl(选项)(参数) 选项 -a/--append 上传文件时,附加到目标文件 -A/--user-agent <string> 设置用户代理发送给服务器 -a ...