首页 > 代码库 > 自动创建代理
自动创建代理
在前面的例子中, 我们都通过ProxyFactoryBean创建织入切面的代理, 每一个需要被代理的bean都需要使用一个ProxyFactoryBean进行配置, 虽然可以使用父子bean进行改造,但还是很麻烦.对于小型系统而言,这种方法还可以将就使用, 但是对于很多需要代理的bean的系统, 再使用这种方法就会很麻烦.
幸运的是, spring为我们提供了自动创建代理的机制, 容器为我们自动生成代理, 把我们从繁琐的配置工作中解放出来.在内部, Spring使用BeanPostFactory完成这项工作.
1、实现类介绍
这些基于BeanPostProcessor的自动代理创建器的实现类,将根据一些规则自动在容器实例化Bean时为匹配的Bean生成代理实例。
1)基于Bean配置名规则的自动代理创建器:允许为一组特定配置名的Bean自动创建代理实例的代理创建器,实现类为BeanNameAutoProxyCreator;
2)基于Advisor匹配机制的自动代理创建器:它会对容器中所有的Advisor进行扫描,自动将这些切面应用到匹配的Bean中(即为目标Bean创建代理实例),实现类为DefaultAdvisorAutoProxyCreator;
3)基于Bean中AspjectJ注解标签的自动代理创建器:为包含AspectJ注解的Bean自动创建代理实例,它的实现类是AnnotationAwareAspectJAutoProxyCreator,该类是Spring 2.0的新增类。
2、BeanNameAutoProxyCreator
使用Bean名进行自动代理配置:
<bean id="waiterTarget" class="com.bao.bao.advisor.Waiter"/>
<bean id="sellerTarget" class="com.bao.bao.advisor.Seller"/>
<bean id="greetAdvice" class="com.bao.bao.advisor.GreetingBeforeAdvice"/>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="http://www.mamicode.com/*Target"/>
<property name="interceptorNames" value="http://www.mamicode.com/greetAdvice"/>
<property name="proxyTargetClass" value="http://www.mamicode.com/true"/>
</bean>
BeanNameAutoProxyCreator 有一个beanNames属性,它允许用户指定一组需要自动代理的Bean名称,Bean名称可以使用 * 通配符。
测试代码:
package com.bao.bao.advisor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by xinfengyao on 16-10-22.
*/
public class TestAdvisor {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-base.xml");
Waiter waiter = (Waiter) context.getBean("waiterTarget");
Seller seller = (Seller) context.getBean("sellerTarget");
waiter.greetTo("tom");
waiter.serveTo("tom");
seller.greetTo("tom");
}
}
运行结果:
Here are you! tom
waiter greetTo tom...
Here are you! tom
waiter serving tom...
Here are you! tom
seller greet to tom...
可以看到, 都自动织入了切面
3、DefaultAdvisorAutoProxyCreator
Advisor是切点和增强的复合体,Advisor本身已经包含了足够的信息:横切逻辑(要织入什么)以及连接点(织入到哪里)。DefaultAdvisorAutoProxyCreator能够扫描容器中的Advisor,并将Advisor自动织入到匹配的目标Bean中,即为匹配的目标Bean自动创建代理。
<bean id="waiterTarget" class="com.bao.bao.advisor.Waiter"/>
<bean id="sellerTarget" class="com.bao.bao.advisor.Seller"/>
<bean id="greetAdvice" class="com.bao.bao.advisor.GreetingBeforeAdvice"/>
<bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="greetAdvice"/>
<property name="patterns">
<list>
<value>.*greet.*</value>
</list>
</property>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
测试代码:
package com.bao.bao.advisor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by xinfengyao on 16-10-22.
*/
public class TestAdvisor {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-base.xml");
Waiter waiter = (Waiter) context.getBean("waiterTarget");
Seller seller = (Seller) context.getBean("sellerTarget");
waiter.greetTo("tom");
waiter.serveTo("tom");
seller.greetTo("tom");
}
}
运行结果:
Here are you! tom
waiter greetTo tom...
waiter serving tom...
Here are you! tom
seller greet to tom...
自动创建代理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。