Spring 动态代理(三) - BeanNameAutoProxyCreator

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值