1、扩展IoC容器使用后处理器扩展

bean后处理器:对容器中的bean进行后处理,也就是额外的加强。

容器后处理:对IoC容器进行后处理,增强容器功能。

2、bean后处理器

     负责处理容器中的所有bean。

bean后处理器必须实现BeanPostProcessor接口,提供非方法有:

Object postProcessBeforeInitialization(Object bean,String name)throws BenasException:该方法第一个参数是系统即将进行后处理的bean实例,第二个参数是bean的配置id。在目标bean初始化之前被回调。

Object postProcessAfterInitialization(Object bean,String name)throws BenasException:该方法第一个参数是系统即将进行后处理的bean实例,第二个参数是bean的配置id。在目标bean初始化之后被回调。

举个例子:

MyBeanPostProcessor.java

package com.lfy.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; public class MyBeanPostProcessor implements BeanPostProcessor { @Override
public Object postProcessAfterInitialization(Object bean, String name) throws BeansException { System.out.println("bean后处理器在初始化之后对"+name+"进行增强处理...");
return bean;
} @Override
public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException { System.out.println("bean后处理器在初始化之前对"+name+"进行增强处理...");
return bean;
} }

Chinese.java

package com.lfy.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; public class Chinese implements InitializingBean,DisposableBean,BeanNameAware,ApplicationContextAware { private ApplicationContext ctx;
private String beanID;
private String someBodyName; public Chinese() {
System.out.println("-----无参构造器-----");
} @Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.ctx=ctx;
System.out.println("-----获取ApplicationContext容器ctx-----");
} @Override
public void setBeanName(String name) {
this.beanID=name;
System.out.println("-----获取bean id-----");
} /**
* 生命周期方法afterPropertiesSet
*/
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("-----依赖关系注入之后,生命周期方法afterPropertiesSet-----");
} /**
* 生命周期方法init
*/
public void init() {
System.out.println("-----依赖关系注入之后,生命周期方法init-----");
} /**
* 生命周期方法destory
*/
@Override
public void destroy() throws Exception {
System.out.println("-----bean销毁之前destroy-----");
} /**
* 生命周期方法close
*/
public void close() {
System.out.println("-----bean销毁之前close-----");
} /**
* setter方法
* @param name
*/
public void setSomeBodyName(String name) {
this.someBodyName=name;
System.out.println("-----property注入属性setter方法-----"+someBodyName);
} }

beans.xml

<?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 id="chinese" class="com.lfy.bean.Chinese" init-method="init" destroy-method="close">
<property name="someBodyName" value="至尊宝"/>
</bean> <bean class="com.lfy.bean.MyBeanPostProcessor"/>
</beans>

SpringTest.java

package com.lfy.main;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lfy.bean.Chinese; /**
*
* @author lfy
*
*/
public class SpringTest { public static void main(String[] args) { AbstractApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml"); Chinese chin=ctx.getBean("chinese", Chinese.class); ctx.registerShutdownHook();
System.exit(0);
} }

运行结果:

总结:容器会自动将实现了BeanPostProcessor接口的bean注册为后处理器。它们之间执行的先后顺序如上。后处理会在每个bean创建时自动执行。

使用BeanFactory作为spring容器,必须手动注册后处理器。

     bean后处理器的用处:

         1》BeanNameAutoProxyCreator:根据bean实例的name属性,创建bean实例的代理。

         2》DefaultAdvisorAutoProxyCreator:根据提供的Advisor,对容器中的所有bean实例创建代理。

3、容器后处理器

负责处理容器本身。

容器后处理器必须实现BeanFactoryPostProcessor接口,并实现postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory),在该方法中对spring容器进行自定义扩展。使用BeanFactory的容器需要手动注册后处理bean。

举个例子:

MyContainerPostProcessor.java

package com.lfy.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; public class MyContainerPostProcessor implements BeanFactoryPostProcessor { @Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("容器后处理器...spring容器是"+beanFactory);
} }

beans.xml

<?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"> <!-- 遇到了个问题,destory-method="close"不能出现在<bean.../>,暂未明白原因 -->
<bean id="chinese" class="com.lfy.bean.Chinese" init-method="init" destroy-method="close">
<property name="someBodyName" value="至尊宝"/>
</bean> <bean class="com.lfy.bean.MyBeanPostProcessor"/>
<bean class="com.lfy.bean.MyContainerPostProcessor"/>
</beans>

运行结果:

总结:如果有需要,可以配置多个容器后处理器,多个容器后处理器可设置order属性来控制容器后处理器的执行顺序,但需要容器后处理器实现Ordered接口。

spring-第十二篇之两种后处理器的更多相关文章

  1. 8 -- 深入使用Spring -- 1...两种后处理器

    8.1 两种后处理器 Spring框架提供了很好的扩展性,出了可以与各种第三方框架良好整合外,其IoC容器也允许开发者进行扩展,这种扩展甚至无须实现BeanFactor或ApplicationCont ...

  2. 跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探

    SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如 ...

  3. Spring Cloud第十二篇 | 消息总线Bus

    ​ ​本文是Spring Cloud专栏的第十二篇文章,了解前十一篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring ...

  4. 第十二篇 SQL Server代理多服务器管理

    本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...

  5. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  6. Spring Boot(十二):spring boot如何测试打包部署

    Spring Boot(十二):spring boot如何测试打包部署 一.开发阶段 1,单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了. (1)在p ...

  7. 【译】第十二篇 SQL Server代理多服务器管理

    本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...

  8. 解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译)

    解剖SQLSERVER 第十二篇   OrcaMDF 行压缩支持(译) http://improve.dk/orcamdf-row-compression-support/ 在这两个月的断断续续的开发 ...

  9. Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)

    Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇) 目录 Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇) 1 Internal Locking Methods Row-Leve ...

随机推荐

  1. httplib模块:(一个相对底层的http请求模块)

    httplib是一个相对底层的http请求模块,期上有专门的包装模块,如urllib内建模块,goto第三方模块,但是封装的越高就约不灵活,比如urllib模块里的请求错误是就不会返回结果页的内容,只 ...

  2. 初步了解oracle

    1. Oracle的创始人 2. Oracle版本含义 3. Oracle安装:用户种类及初始密码 在oracle10g\11g中默认scott被锁定. 4. Oracle数据库的启动 a) 启动两个 ...

  3. java 中的引用类型

    GC基本原理 GC (Garbage Collection)的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征 ...

  4. 2018-8-27-C#-powshell-调用

    title author date CreateTime categories C# powshell 调用 lindexi 2018-8-27 16:20:4 +0800 2018-06-18 20 ...

  5. 一、bootstrap-upload

    一.bootstrap-upload 前端代码: @{ Layout = null; } <!DOCTYPE html> <html lang="zh-CN"&g ...

  6. EF core 实现读写分离解决方案

    我们公司2019年web开发已迁移至.NET core,目前有部分平台随着用户量增加,单一数据库部署已经无法满足我们的业务需求,一直在寻找EF CORE读写分离解决方案,目前在各大技术论坛上还没找到很 ...

  7. .h与.cpp

    本质上没什么区别. cpp:c plus plus,就表示为c++原文件. .h文件实现的功能是声明.cpp文件中需要使用的变量.函数及宏定义等. .h文件就像是一个接口,具体的实现可以在.cpp中, ...

  8. Kconfig的简单例子

    https://cloud.tencent.com/developer/article/1431908 使用Kconfig时,需要注意的地方 1.在Kconfig中定义的配置宏,前缀都没有" ...

  9. luogu2046 海拔

    题目链接[NOI2010]海拔 首先有个性质就是海拔只会有\(0\)和\(1\)两种. 证明:海拔下降和人数乘积为总消耗,确定了海拔下降总数,如果有个地方可以使得单位消耗最小,那么全部消耗不会更劣. ...

  10. AIX系统软件安装问题

    一.安装软件时一定要cd到介质目录中 二.选择accept new licence 三.更新系统时避免使用updata_all,要手动选择出要更新的软件 四.oracle11G的rac还要用到open ...