Spring 动态代理(三)

来源:互联网 发布:易语言单机游戏源码 编辑:程序博客网 时间:2024/06/15 10:36

BeanNameAutoProxyCreator

BeanNameAutoProxyCreator可以根据bean的名字来代理对象,它是通过BeanPostProcessor实现的,在bean初始化之后代理对象。它的父类AbstractAutoProxyCreator实现了BeanPostProcessor的postProcessAfterInitialization方法,内部是使用ProxyFactory根据bean的名字和interceptorNames生成对象的代理。

举例

接口
public interface People {    public void eat();}
实现类
public class Student implements People {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public void eat() {        System.out.println(this.getName() + " is eating");    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                '}';    }}
方法拦截
public class MyMethodInterceptor implements MethodInterceptor {    @Override    public Object invoke(MethodInvocation methodInvocation) throws Throwable {        System.out.println("--------before method interceptor---------");        Object object = methodInvocation.proceed();        System.out.println("----------after method interceptor----------");        return object;    }}
配置文件
 <bean id="student" class="com.lilongjiu.study.spring.aop.aposrc.Student">        <property name="name" value="zhangsan"></property>    </bean>    <bean id="myMethodInterceptor" class="com.lilongjiu.study.spring.aop.aposrc.MyMethodInterceptor"></bean>    <bean id="myBeanNameAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">        <property name="beanNames">            <list>                <value>student</value>            </list>        </property>        <property name="interceptorNames">            <list>                <value>myMethodInterceptor</value>            </list>        </property>    </bean>
main方法
public class Demo {    public static void main(String[] args) throws Exception {        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");        People people = (People) applicationContext.getBean("student");        people.eat();    }}
输出
--------before method interceptor---------zhangsan is eating----------after method interceptor----------

Spring 动态代理(一) - 代理模式

Spring 动态代理(二) - ProxyFactoryBean

Spring 动态代理(三) - BeanNameAutoProxyCreator

Spring 动态代理(四)- 动态代理核心类 - ProxyCreatorSupport

Spring 动态代理(五) - 自定义BeanTypeAutoProxyCreator

原创粉丝点击