自动创建代理(基于后处理Bean.在Bean创建的过程中完成的增强.生成Bean就是代理.)
BeanNameAutoProxyCreator :按名称生成代理
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 自动代理 -->
<!--定义目标对象 -->
<bean id="customerDao" class="cn.aop.CustomerDaoImpl"></bean>
<bean id="orderDao" class="cn.aop2.OrderDao"></bean>
<!-- 定义增强 -->
<bean id="beforeAdvice" class="cn.aop.BeforeAdvice"></bean>
<bean id="aroundAdvice" class="cn.aop2.AroundAdvice"></bean>
<!-- 自动代理:按名称的代理基于后处理Bean不需要配置ID ;使用BeanNameAutoProxyCreator类-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="*Dao"/>
<property name="interceptorNames" value="beforeAdvice"/>
</bean>
</beans>
DefaultAdvisorAutoProxyCreator :根据切面中定义的信息生成代理
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--自动代理 -->
<!--定义目标对象 -->
<bean id="customerDao" class="cn.aop.CustomerDaoImpl"></bean>
<bean id="orderDao" class="cn.aop2.OrderDao"></bean>
<!-- 定义增强 -->
<bean id="beforeAdvice" class="cn.aop.BeforeAdvice"></bean>
<bean id="aroundAdvice" class="cn.aop2.AroundAdvice"></bean>
<!-- 定义一个带有切点的切面 -->
<bean id="MyPointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="pattern" value=".*add"/>
<property name="advice" ref="aroundAdvice"></property>
</bean>
<!-- 基于后处理bean自动生成代理的第二种:DefaultAdvisorAutoProxyCreator类是根据切面中定义的信息生成代理-->
<!-- 不用写id -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
</bean>
</beans>
测试类:
package cn.defaulter.proxy;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import cn.aop.CustomerDao;
import cn.aop2.OrderDao;
/**
* 自动代理测试类
* @author Administrator
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext3.xml")
public class SpringTest {
@Autowired
@Qualifier("customerDao")//自动代理注入目标对象
private CustomerDao customerDao;
@Autowired
@Qualifier("orderDao")
private OrderDao orderDao;
@Test
public void test(){
customerDao.add();
customerDao.find();
System.out.println("*******************");
orderDao.add();
}
}
还有一种是:AnnotationAwareAspectJAutoProxyCreator 基于Bean中的AspectJ 注解进行自动代理
在自动代理之前是通过ProxyFactoryBean生成一个代理类来实现代理;
基于ProxyFattoryBean的代理与自动代理区别?
ProxyFactoryBean:先有被代理对象,将被代理对象传入到代理类中生成代理.
自动代理基于后处理Bean.在Bean的生成过程中,就产生了代理对象,把代理对象返回.生成Bean已经是代理对象.