Spring笔记——10.两种后处理器

我们可以通过Bean后处理器跟容器后处理器来拓展Ioc容器。前者能增强bean的功能,后者能增强容器功能。

Bean后处理器

这是一种特殊的bean,不对外提供服务,也无需id属性,只负责对其它的正常bean执行后处理,比如为容器中的bean生成代理等。它会在正常bean创建后被创建,必须实现BeanPostProcessor接口。里面的两个方法会在目标bean初始化之前之后被调用。

使用ApplicationContext作为容器的话,架构会自动扫描哪个是bean后处理器。它对每个正常bean都有效。虽说它叫做后处理器,但是作用时间却还是bean创建前后。执行顺序是:

  1. 构造器生成实例
  2. set方法设定值
  3. postProcessBeforeInitialization方法
  4. afterPropertiesSet接口方法
  5. init-method方法
  6. postProcessAfterInitialization方法

如果使用BeanFactory容器,则需要额外手动注册bean后处理器。需要现使用容器通过id获取bean后处理器,然后向beanFactory中添加BeanPostProcessor。

Spring架构还提供了两个常用的后处理器。BeannameAutoProxyCreator能够根据bean实例的name属性创建Bean实例的代理。DefaultAdvisorAutoProxyCreator能够根据提供的Advisor对容器中的所有Bean实例创建代理。所谓代理Bean就是对目标bean进行增强,在其功能上进行修改得到新的bean。

容器后处理器

bean后处理器负责处理容器中所有的bean,而容器后处理器则负责处理容器本身。容器后处理器必须实现BeanFactoryPostProcessor接口种的postProcessBeanFactory方法,方法体就是对容器(ApplicationContext或者BeanFactory)的处理,可以扩展容器。ApplicationContext也可以自动检测容器后处理器病自动注册。BeanFactory也是同样需要手动注册。在xml中配置它,就把它当做一个普通bean就好了。Spring架构提供了如下几个常用的容器后处理器:

  1. PropertyPlaceholderConfigurer:属性占位符配置器
  2. PropertyOverrideConfigurer:重写占位符配置器
  3. CustomAutowireConfigurer:自定义自动装配的配置器
  4. CustomScopeConfigurer:自定义作用于的配置器

属性占位符配置器

可以读取properties属性文件里的顺序性,并将这些属性设置成Spring配置文件的数据。

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderCongifurer">
    <property name="locations">
        <list>
            <value>dbconn.properties</value>
            <value>1.properties</value>
            <value>2.properties</value>
        </list>
    </property>
</bean>
<!--定义数据源bean-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"
    p:driverClass="${jdbc.driverClassName}"
    p:jdbcUrl="${jdbc.url}"
    P:user="${jdbc.username}"
    p:password="${jdbc.password}"/>

${jdbc.url}这种写法会使架构去上面读取的properties文件中找名为jdbc.url的属性,然后取出属性值。这样我们就无需操作xml文件,仅仅修改properties文件就可对全局的常量进行控制。

重写占位符配置器

PropertyOverrideConfigurer是Spring提供的另一个容器后处理器。它的属性文件指定的信息可以直接覆盖xml中的元数据。它的属性文件中的key应该有如下格式:beanid.property。比如说书中的例子是这样写的:

datasource.user=root

datasource.password=123

如果这样写的话,架构就会自动把root跟123付给id名为datasource的bean的user跟password属性。相比于上面的后处理器,这个更为方便,xml中代码更为简洁。

<bean class="org.springframework.beans.factory.config.PropertyOverrideCongifurer">
    <property name="locations">
        <list>
            <value>dbconn.properties</value>
        </list>
    </property>
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" />

属性文件如下:

dataSource.user=root
dataSource.password=123

当多个覆盖同时存在时,最后一个有效。如下Schema配置可以更简洁地配置重写占位符配置器。

<context:property-override location="classpath:db.properties"/>
时间: 2024-11-01 21:29:48

Spring笔记——10.两种后处理器的相关文章

Spring-----13、两种后处理器

iOS开发笔记-两种单例模式的写法

iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" static ServiceManager *defaultManager; @implementation ServiceManager +(ServiceManager *)defaultManager{ if(!defaultManager) defaultManager=[[self allocWith

java笔记线程两种方式模拟电影院卖票

1 public class SellTicketDemo { 2 public static void main(String[] args) { 3 // 创建三个线程对象 4 SellTicket st1 = new SellTicket(); 5 SellTicket st2 = new SellTicket(); 6 SellTicket st3 = new SellTicket(); 7 8 // 给线程对象起名字 9 st1.setName("窗口1"); 10 st2.

spring 事务的两种用法

spring事务两种使用方法 [email protected] 注解 2.AOP 配置 xml (需要依赖包:aopalliance-1.0.jar/ aspectjweaver-1.8.8.jar / spring-aspects-4.2.5.RELEASE.jar) 重要说明: spring-aspects-4.2.5.jar 与 aspectjweaver-1.8.8.jar 是版本匹配的.如果版本不正确会报错误: java.lang.IllegalStateException: Exp

Spring中IoC - 两种ApplicationContext加载Bean的配置

说明:Spring IoC其实就是在Service的实现中定义了一些以来的策略类,这些策略类不是通过 初始化.Setter.工厂方法来确定的.而是通过一个叫做上下文的(ApplicationContext)组建来加载进来的.这里介绍两种Context组建的构件过程 前提条件:在Gradle工程的build.gradle文件中引入对Spring framework 的支持 repositories { mavenCentral() } dependencies { compile group: '

Spring与Hibernate两种组合方式

Spring与Hibernate大致有两种组合方式,主要区别是一种是在Hibernate中的hibernate.cfg.xml中配置数据源,一种是借助Spring的jdbc方式在Spring的applicationContext.xml文件中配置数据源,然后在Spring配置sessionFactory的bean有些区别 下面大致的说明一下 第一种 1.hibernate.cfg.xml文件 xml version='1.0' encoding='utf-8'?> "-//Hibernat

spring aop的两种写法aspect和advisor

本文转自:https://www.cnblogs.com/leiOOlei/p/3709607.html 首先看个例子,如下 接口代码: package com.lei.demo.aop.schema; public interface IHello { public void sayHello(); } 接口实现: package com.lei.demo.aop.schema; public class HelloService implements IHello { public void

Spring容器托管两种方法

Spring最核心的就是IOC(控制反转)和AOP(面向切面编程). IOC可以理解为把Spring当做一个容器,用来管理各种service.dao等.不用再去手动new. 将service.dao等注册到spring容器中,有两种办法: 1.在xml中定义bean,比如: <bean class="com.xxx.trade.common.xxx.xxx"/> 2.通过注解. 常用的注解有 @Controller  主要是controller层. @Service  业务

spring-两种后处理器

1.扩展IoC容器使用后处理器扩展 bean后处理器:对容器中的bean进行后处理,也就是额外的加强. 容器后处理:对IoC容器进行后处理,增强容器功能. 2.bean后处理器      负责处理容器中的所有bean. bean后处理器必须实现BeanPostProcessor接口,提供非方法有: Object postProcessBeforeInitialization(Object bean,String name)throws BenasException:该方法第一个参数是系统即将进行