`
jiagyao
  • 浏览: 96266 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

spring的两种后处理器

阅读更多
              bean后处理器和容器后处理器

1.bean后处理器

这种处理器会对容器中的bean进行后处理,对bean的功能进行额外加强

bean的后处理器必须实现接口BeanPostProcessor,该接口包含两个方法

public Object postProcessBeforeInitialization(Object bean, String beanName)

public Object postProcessAfterInitialization(Object bean, String beanName)

下面定义一个bean后处理器

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;


public class MyBeanPostProcessor implements BeanPostProcessor {

public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
  System.out.println(bean);
  System.out.println("bean后处理器在bean初始化之前对"+beanName+"进行增强处理!"); 
  return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName)
   throws BeansException {
  System.out.println("bean后处理器在bean初始化之后对"+beanName+"进行增强处理!");
  if(bean instanceof American){
   American a = (American)bean;
   a.setName("后处理器重新设置的值");
  }
  return bean;
}

下面是测试使用的bean类

斧头的接口

public interface Axe {
String chop();
}

普通人的接口
public interface Person {
void useAxe();
}

斧头的实现类
import com.spring.being.Axe;

public class SteelAxe implements Axe {

private int count;

public SteelAxe(){
  System.out.println("SteelAxe的无参构造器被调用......");
}

public String chop() {
 
  return "铁斧用了"+(++count)+"次";
}

}

普通人的实现类(实现接口Person和InitializingBean )

import org.springframework.beans.factory.InitializingBean;

import com.spring.being.Axe;
import com.spring.being.Person;

public   class American implements Person,InitializingBean {

private Axe axe;
private String name;

public American(){
  System.out.println("Chinese的无参构造器被调用.......");
}

public American(Axe axe){
  this.axe=axe;
  System.out.println("Chinese的有参构造器被调用.......");
}


//public abstract Axe createAxe();//设置一个抽象类,该方法由spring负责实现

public void setAxe(Axe axe) {
  System.out.println("Spring执行依赖关系注入.......");
  this.axe = axe;
}

  
public Axe getAxe() {
  return axe;
}

public String getName() {
  return name;
}

public void setName(String name) {
  this.name = name;
}

public void useAxe() {
  System.out.println("美国人使用:"+axe.chop());
  System.out.println("参数name:"+name);
}
public void init(){   //查看bean后处理器是在bean初始化之前还是之后起作用的呢,书写该方法该类必须在配置市加上属性init-method="init",方法名是任意的,只要一致就行
  System.out.println("正在执行初始化方法init......");
}


public void afterPropertiesSet() throws Exception { //查看bean后处理器是在bean初始化之前还是之后起作用的呢,书写该方法该类必须实现接口InitializingBean
  System.out.println("正在执行初始化方法afterPropertiesSet......");
 
}

}

书写配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="axe" class="com.spring.being.impl.SteelAxe" scope="prototype"/>

<bean id="steelAxe" class="com.spring.being.impl.SteelAxe" scope="prototype"/>
<bean id="American" class="com.spring.postprocessor.American" init-method="init">
   <property name="axe" ref="steelAxe" />
   <property name="name" value="依赖注入的值"/>
</bean>

<!--配置bean后处理器 -->
<bean id="beanPostProcessor" class="com.spring.postprocessor.MyBeanPostProcessor" />
</beans>



书写一个测试类

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.spring.being.Person;

public class Test {
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-deppen.xml");//用该方法加载可以自动注册bean后处理器,否则需要手动注册
Person p = (Person)factory.getBean("American");
p.useAxe();
}
}



测试结果:

bean后处理器在bean初始化之前对American进行增强处理!
正在执行初始化方法afterPropertiesSet......
正在执行初始化方法init......
bean后处理器在bean初始化之后对American进行增强处理!
美国人使用:铁斧用了1次
参数name:后处理器重新设置的值 //bean的参数值已被后处理器修改了





spring提供的两种常用的后处理器

BeanNameAutoProxyCreator

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



2.容器后处理器

容器必须实现接口BeanFactoryPostProcessor,该接口有方法:

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)   throws BeansException
书写一个容器后处理器:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
   throws BeansException {
  System.out.println("本程序对spring所做的beanfactory的初始化没有意见。。。。");
  System.out.println("spring容器是:"+beanFactory);
  System.out.println("可以取得bean:"+beanFactory.getBean("American"));
}

}

配置文件

在上面的配置文件再加上

<!--配置容器后处理器 -->
<bean id="beanFactoryPostProcessor" class="com.spring.postprocessor.MyBeanFactoryPostProcessor" />




测试类

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.spring.being.Person;

public class Test {
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-deppen.xml");
Person p = (Person)factory.getBean("American");
p.useAxe(); 
}
}

输出结果:

本程序对spring所做的beanfactory的初始化没有意见。。。。
spring容器是:org.springframework.beans.factory.suppor



spring提供的几种常见的容器后处理器

1.PropertyPlaceholderConfigurer属性占位符配置器

2.PropertyOverrideConfigurer重写占位符配置器



对PropertyPlaceholderConfigurer的测试如下:

配置文件applicationContext-deppen.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="axe" class="com.spring.being.impl.SteelAxe" scope="prototype"/>

<bean id="steelAxe" class="com.spring.being.impl.SteelAxe" scope="prototype"/>
<bean id="American" class="com.spring.postprocessor.American" init-method="init">
   <property name="axe" ref="steelAxe" />
   <property name="name" value="${person.name}" />
</bean>

<!-- 配置属性占位符配置器 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
           <value>person.properties</value>
        </list>
    </property>
</bean>

</beans>
配置文件person.properties:

person.name=\u4F9D\u8D56\u6CE8\u5165\u7684\u503C



测试类:

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.spring.being.Person;

public class Test {
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-deppen.xml");
Person p = (Person)factory.getBean("American");
p.useAxe(); 
}
}

输出结果:

Chinese的无参构造器被调用.......
SteelAxe的无参构造器被调用......
Spring执行依赖关系注入.......
正在执行初始化方法afterPropertiesSet......
正在执行初始化方法init......
美国人使用:铁斧用了1次
参数name:依赖注入的值

分享到:
评论

相关推荐

    Spring MVC 入门实例

    基于 Spring 的 Web 应用程序接收到 http://localhost:8080/hello.do(事实上请求路径是 /hello.do) 的请求后, Spring 将这个请求交给一个名为 helloController 的程序进行处理, helloController 再调用 一个名为 ...

    Spring攻略(第二版 中文高清版).part1

    2.11 创建Bean后处理器 85 2.11.1 问题 85 2.11.2 解决方案 85 2.11.3 工作原理 86 2.12 外部化Bean配置 89 2.12.1 问题 89 2.12.2 解决方案 89 2.12.3 工作原理 90 2.13 解析文本消息 91 2.13.1...

    【2019版】Spring4.3入门视频课程

    自动装配、FactoryBean、两种后处理器 二、Spring AOP AOP简介、实现原理、代理技术 Spring AOP的配置实现 AspectJ表达式 三、Spring注解配置 注解简介 IOC注解 AOP注解 四、Spring整合 Spring整合Web Spring整合...

    Spring MVC 员工管理系统

    ③ 当DispatcherServlet从HandlerMapping中得到当前请求对应的处理器后,它就将请求分派给这个处理器。处理器根据请求的信息执行相应的业务逻辑,一个设计良好的处理器应该通过调用Service层的业务对象完成业务处理...

    Spring攻略(第二版 中文高清版).part2

    2.11 创建Bean后处理器 85 2.11.1 问题 85 2.11.2 解决方案 85 2.11.3 工作原理 86 2.12 外部化Bean配置 89 2.12.1 问题 89 2.12.2 解决方案 89 2.12.3 工作原理 90 2.13 解析文本消息 91 2.13.1...

    在spring中如何使用aop

    详细的介绍了在spring中如何使用和配置aop的5种处理器。从注解和配置文件两个方面都进行了介绍。主要从注解的方式进行了介绍

    SpringDynamicMessageProcessor:MavenSpring-BootSpring-Integration项目,用于执行动态确定的处理阶段路径

    两种配置都可以工作,核心配置是测试配置的先决条件。 系统总览 设定值 在文件Constants.java中设置了编译时所需的一些元参数,这些参数包括标头值,通道名称,超时值以及类似的东西。 src / main / resources / ...

    本地缓存之王Caffeine 保姆级教程(值得珍藏)

    根据其部署和应用范围,缓存可以分为本地缓存和分布式缓存两种类型。Caffeine是一种非常优秀的本地缓存解决方案,而Redis则广泛用于分布式缓存场景。 Caffeine是一个基于Java 1.8的高性能本地缓存库,源自Guava的...

    test-conditonal-error:条件中已识别上下文访问错误的样本

    确定的问题在条件条件流程fr.elecomte.test.configs.OnSomethingCondition中,有两种类型的Bean搜索可用:一种仅使用Bean名称,一种在其中加载Bean实例。 由于条件在Spring-boot上下文生命周期中很早就已处理,因此...

    墨斗:找到两种颜色之间的颜色过渡功能

    ttle 有没有想过要使用哪种颜色转换从一种颜色转换为另一种颜色? 说#ae465f至#aeae46吗? 掩盖了您。 因为那是头足类动物互相做的。API参考suggest(from, to[, preprocessor]) 建议颜色功能,从地图上from颜色到to...

    matlab光照模型代码-EPICS_Rock_Rover_Sensors_Subsystem:EPICS普渡大学,赵继元创建,2014年Sp

    由赵继元创建,2014年Spring 什么是相机和传感器子模块? 该子模块由两个主要部分组成。 Pixy(CMUcam5)视觉传感器Pixy是由卡内基梅隆大学(Carnegie Mellon University)建立的快速视觉传感器,可以快速“教”以...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    下面就以两种不同的用户来分析博客网站的需求。 4.2.1注册博友 首先必须在博客首页中登录填写用户名和密码,这样才能执行一些相关操作,不然就是普通用户只能查看一些信息,而不能发表博文。可以在管理页面上添加...

    freemarker总结

    运算符的用法有如下两种: variable!或variable!defaultValue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象. 使用!指定默认值时,并不要求默认值的类型和变量类型...

    java开源包1

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包11

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包2

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包3

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包6

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包5

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

Global site tag (gtag.js) - Google Analytics