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 动态代理(二) - ProxyFactoryBean
Spring 动态代理(三) - BeanNameAutoProxyCreator