spring-两种后处理器

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接口。

原文地址:https://www.cnblogs.com/ZeroMZ/p/11332370.html

时间: 2024-10-10 10:29:26

spring-两种后处理器的相关文章

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

我们可以通过Bean后处理器跟容器后处理器来拓展Ioc容器.前者能增强bean的功能,后者能增强容器功能. Bean后处理器 这是一种特殊的bean,不对外提供服务,也无需id属性,只负责对其它的正常bean执行后处理,比如为容器中的bean生成代理等.它会在正常bean创建后被创建,必须实现BeanPostProcessor接口.里面的两个方法会在目标bean初始化之前之后被调用. 使用ApplicationContext作为容器的话,架构会自动扫描哪个是bean后处理器.它对每个正常bean

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

半夜思考之查漏补缺, Spring 的 Bean 后处理器

有一篇写的是容器后处理器, 这篇是 Bean 后处理器 , 我对这个 Bean 后处理器的理解就是一个 AOP 编程 . Bean 后处理器 : 是一种特殊的 Bean , 这种 Bean 不对外提供服务 , 可以不需要 id 属性, 主要负责对容器中的其他Bean 执行后处理 , 例如为容器中的目标 Bean 生成代理等 . Spring 容器中提供两个常用的 Bean 后处理器 : BeanNameAutoProxyCreator : 根据 Bean 实例的 name 属性 ,创建 Bean

Spring两种代理区别

Spring的两种代理JDK和CGLIB的区别浅谈: Java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用invokeHandler类来处理: 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码的子类来处理. 1>如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP: 2>如果目标对象实现了接口,可以强制使用cglib实现AOP: 3>如果目标对象没有实现了接口,必须采用cglib库,Spring会自动

从SqlSessionFactoryBean的引用浅谈spring两种bean模式

mybatis是以一个 SqlSessionFactory 的实例为中心的.SqlSessionFactory可以通过SqlSessionFactoryBuilder获得实例.使用mybatis-spring时,session创建,可以让SqlSessionFactoryBean来替代. <bean name="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">

Spring Bean后处理器以及容器后处理器【转】

Bean后处理器:即当spring容器实例化Bean实例之后进行的增强处理. 容器后处理器:对容器本身进行处理,并总是在容器实例化其他任何Bean之前读取配置文件的元数据并可能修改这些数据. 一.Bean后处理器 实现了BeanPostProcessor接口的类即可作为一个Bean后处理器,以下是一个Bean后处理器的范例 1.编写一个实现了BeanPostProcessor接口的MyBeanPostProcessor类 [java] view plain copy package org.me

Spring Bean后处理器

Spring提供了两类后处理器 1.Bean后处理器 2.容器后处理器 Spring的很多功能就是通过这些后处理来提供高质量的服务.而程序员只需要简单几部同样可以自定义功能强大的后处理器,今天我们将简述Bean后处理器 一.Bean后处理器 用来加强Spring容器中的bean处理.可以在bean在spring容器中初始化前后对bean进行自定义处理. 1.自定义一个自定义一个bean后处理器:        public class MyBeanProcessor implements Bea

Spring声明式事务配置的两种策略SpringAop和Bean后处理器的代理BeanNameAutoProxyCreator

Spring的事务配置有两种:1编程式事务管理配置:2声明式事务管理配置.下面介绍两种声明式事务的配置,声明式事务相比于编程式事务代码耦合更低,无序书写任何事务管理的先关代码.两种声明式事务配置策略分别是:SpringAop事务管理和Bean后处理器的代理BeanNameAutoProxyCreator管理事务. 1.SpringAop事务管理配置 1.1.配置数据源: <bean id="pycDataSource" class="com.mchange.v2.c3p

spring Bean的作用域、生命周期和后处理器

1. Bean的几种作用域 singleton 单例, 在整个spring IoC 容器只存在唯一对象 prototype 多例, 每次进行getBean 创建新的对象 request ,创建Bean, 放入request范围 request.setAttribute session ,创建Bean ,放入session范围 session.setAttribute globalSession 全局会话, 分布式多个系统, 共享同一个会话 单例Bean,在ApplicationContext对象