(一)Spring容器相关操作
一、spring事件
spring的事件有如下两个成员。
1、ApplicationEvent,容器事件,由容器发布
2、ApplicationListener 监听器,可以由容器中的任何监听器Bean担任
(1)先顶一个spring的容器事件:
package cn.study.basic;
import org.springframework.context.ApplicationEvent;
public class EmailEvent extends ApplicationEvent {
private String address;
private String text;
public EmailEvent(Object source) {
super(source);
}
public EmailEvent(Object source, String address, String text) {
super(source);
this.address = address;
this.text = text;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
(2)编写容器监听器代码:
package cn.study.basic;
import org.springframework.context.ApplicationListener;
public class EmailListener implements ApplicationListener<EmailEvent> {
@Override
public void onApplicationEvent(EmailEvent arg0) {
System.out.println(arg0 instanceof EmailEvent);
if (arg0 instanceof EmailEvent) {
EmailEvent ee = (EmailEvent) arg0;
System.out.println("address:" + ee.getAddress());
} else {
System.out.println("container:" + arg0);
}
}
}
(3)、bean.xml文件中加入如下配置:
<bean class="cn.study.basic.EmailListener"></bean>
(4)、测试方法
package cn.study.basic.test; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.study.basic.EmailEvent; public class TestAMain {
@Test
public void testApp() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
EmailEvent emailEvent = new EmailEvent("object", "address", "test");
context.publishEvent(emailEvent);
}
}
运行代码,执行结果如下所示:
true
address:address
二、bean获取spring容器
在web开发的过程中,spring容器通常使用声明式方法配置产生,开发者只需要在web.xml中配置相应的Listener,在启动的时候就会初始化Spring容器,但是某些比较特殊的时候,容器中的Bean需要主动访问Spring容器,有如下两种方式。
(1)、实现BeanFactoryAware接口,在实现接口的同时,必须实现如下方法。
public void setBeanFactory(BeanFactory arg0) throws BeansException {
}
(2)、实现ApplicationContextAware接口,同时需要实现如下方法
@Override
public void setApplicationContext(ApplicationContext arg0) throws BeansException { }
下面使用第二种方法来实现以下小示例,首先实现接口,代码如下:
package cn.study.basic; import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; public class GetApContext implements ApplicationContextAware { private ApplicationContext ctx; @Override
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
this.ctx = arg0;
} public ApplicationContext getContext() {
return ctx;
} }
还需要在bean.xml文件中配置bean,如下
<bean class="cn.study.basic.GetApContext"></bean>
测试方法如下:
package cn.study.basic.test; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.study.basic.GetApContext; public class TestContext {
@Test
public void testContext() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
GetApContext ctx = (GetApContext) context.getBean("spContext");
System.out.println(ctx.getContext());
System.out.println(context==ctx.getContext());
}
}
测试结果如下所示:
--->org.springframework.context.support.ClassPathXmlApplicationContext@2c11b4c2: startup date [Fri Oct 03 14:04:27 CST 2014]; root of context hierarchy
true
三、几种后处理器
1、bean后处理器BeanPostProcessor,需要实现bean后处理,需要实现接口:BeanPostProcessor ,代码如下
(1)、实现接口BeanPostProcessor
package cn.study.basic.test6; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; public class MyBeanPostProcessor implements BeanPostProcessor { @Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Bean后处理器在初始化之前对【" + beanName + "】进行了增强处理");
return bean;
} @Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Bean后处理器在初始化之前对【" + beanName + "】进行了增强处理");
if (bean instanceof Chinese) {
Chinese chinese = (Chinese) bean;
chinese.useAxe();
}
return bean;
} }
(2)、bean.xml配置文件中:
<bean id="myBeanPostProcessor" class="cn.study.basic.test6.MyBeanPostProcessor"></bean>
(3)、测试方法
package cn.study.basic.test6; import org.junit.Test;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.ClassPathResource; import cn.study.basic.ContextUtils;
import cn.study.basic.test4.Person; public class TestMain {
@Test
public void testBeanFactory() throws Exception {
ApplicationContext ctx=ContextUtils.getContext();
ctx.getBean("dd");
}
}
2、容器后处理BeanFactoryPostProcessor
(1)、接口BeanFactoryPostProcessor
package cn.study.basic.test6; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; public class MyFactoryBeanFactoryProcessor implements BeanFactoryPostProcessor { @Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("the container of spring :" + beanFactory);
} }
(2)测试方法
package cn.study.basic.test6; import org.junit.Test;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.ClassPathResource; import cn.study.basic.ContextUtils;
import cn.study.basic.test4.Person; public class TestMain {
@Test
public void testMain() throws Exception {
ClassPathResource isr = new ClassPathResource("bean.xml");
XmlBeanFactory factory = new XmlBeanFactory(isr);
MyBeanPostProcessor prr = (MyBeanPostProcessor) factory.getBean("myBeanPostProcessor");
factory.addBeanPostProcessor(prr);
Person person = factory.getBean("dd", Person.class);
person.getName();
}
}
3、属性占位符配置器PropertyPlaceholderConfigurer,是一个容器后处理器,负责读取properties文件中的内容,并将这些数据设置为Spring配置文件的元数据
<!-- PropertyPlaceholderConfigurer是一个Bean后处理器,它会读取
属性文件信息,并将这些信息设置成Spring配置文件的元数据。 -->
<bean class=
"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>dbconn.properties</value>
</list>
</property>
</bean>
<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!-- 指定连接数据库的驱动 -->
<property name="driverClass" value="${jdbc.driverClassName}"/>
<!-- 指定连接数据库的URL -->
<property name="jdbcUrl" value="${jdbc.url}"/>
<!-- 指定连接数据库的用户名 -->
<property name="user" value="${jdbc.username}"/>
<!-- 指定连接数据库的密码 -->
<property name="password" value="${jdbc.password}"/>
</bean>
(一)Spring容器相关操作的更多相关文章
- Python容器相关操作
(集合与字典除外)的容器相关操作 (1)容器的拼接 >>> 'abc' + 'def' 'abcdef' (2)容器的重复 >>> (1, 2) * 3 (1, 2 ...
- spring学习(二)spring容器搭建与应用
本文只是对spring容器进行操作 最简单的一个案例: 一.导包 使用IDEA的maven工程 1.在pom.xml中导入依赖 <?xml version="1.0" enc ...
- spring容器初始化bean和销毁bean之前进行一些操作的定义方法
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种,通过在xml中定义init-method和destory-method方法 第二种, ...
- (反射+内省机制的运用)简单模拟spring IoC容器的操作
简单模拟spring IoC容器的操作[管理对象的创建.管理对象的依赖关系,例如属性设置] 实体类Hello package com.shan.hello; public class Hello { ...
- [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 深入理解 spring 容器,源码分析加载过程
Spring框架提供了构建Web应用程序的全功能MVC模块,叫Spring MVC,通过Spring Core+Spring MVC即可搭建一套稳定的Java Web项目.本文通过Spring MVC ...
- spring容器对bean生命周期的管理三中方式
spring容器对bean的生命周期管理主要在两个时间点:bean的初始化完成(包括属性值被完全注入),bean的销毁(程序结束,或者引用结束)方式一:使用springXML配置中的init-meth ...
- (spring-第1回【IoC基础篇】)Spring容器中Bean的生命周期
日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...
- 普通Java类获取spring 容器的bean的5种方法
方法一:在初始化时保存ApplicationContext对象方法二:通过Spring提供的工具类获取ApplicationContext对象方法三:继承自抽象类ApplicationObjectSu ...
随机推荐
- 11g OCM 考试感悟
11g OCM 考试感悟 PrudentWoo 累,累.真的很累.考前每天全场景的刷两遍.三遍不觉得累.总感觉练习时间不够.考中尽管时间足够.可是压力很大.尤其看到一些和平时训练不一样题目的时候,那种 ...
- 算法笔记_158:算法提高 逆序排列(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然后程序将把这个数组中的值按逆序重新存 ...
- Loadrunner定时执行脚本
# -*- coding: utf-8 -*- import timeimport os #格式为小时,分钟,脚本名称(包括盘符,最好是放在根目录下)#需要把LoadRunner安装路径的Bin加入系 ...
- 运用Unity实现AOP拦截器[结合异常记录实例]
本篇文章将通过Unity实现Aop异常记录功能:有关Unity依赖注入可以看前两篇文章: 1:运用Unity实现依赖注入[结合简单三层实例] 2:运用Unity实现依赖注入[有参构造注入] 另早期 ...
- taro 创建 Tabbar
1.代码 src/app.js import '@tarojs/async-await' import Taro, { Component } from '@tarojs/taro' import H ...
- Oracle中sign/decode/nvl/round/trunc/(+)/instr/substr/replace解释
1. sign函数 sign函数语法: sign(n); sign函数说明: 取数字n的符号,大于0返回1,小于0返回-1,等于0返回0(n可以是表达式,(n-200)) 例子: a=10; b=50 ...
- 电子商务(电销)平台中订单模块(Order)数据库设计明细(转载)
电子商务(电销)平台中订单模块(Order)数据库设计明细 以下是自己在电子商务系统设计中的订单模块的数据库设计经验总结,而今发表出来一起分享,如有不当,欢迎跟帖讨论~ 订单表 (order)|-- ...
- CentOS源码编译安装Nginx
安装编译用到的软件: yum install glib2-devel openssl-devel pcre-devel bzip2-devel gzip-devel 现在到http://nginx.o ...
- 查询清除SQL Server数据库备份还原历史记录
曾经遇到过一个用户MSDB数据库非常大,让我帮忙查查是什么原因.使用sp_spaceused找出了所有表的数据大小,发现问题是SQL Server备份和还原历史表数据太大.用户经常会做日志备份,但是从 ...
- C++刷题——2830: 递归求1*1+2*2+3*3+……+n*n
Description 定义一个递归函数sum int sum(int n); //函数声明,返回12+22+32+--+n2的和 注意:sum为递归函数 Input 正整数n的值 Output 12 ...