这里说的自动代理说的是自动代理bean对象,就是说在xml中不用再配置代理工厂,就可以自动代理
下面来说第一种
第一种自动代理:默认自动代理生成器(DefaultAdvisorAutoProxyCreator)
第一步:定义接口,在接口中声明几个方法
package demo17;
/**
* Created by mycom on 2018/3/8.
*/
public interface ISomeService {
public void select();
public void insert();
public void delete();
public void update();
}
第二步:编写实现类,重写接口中的方法
package demo17;
/**
* Created by mycom on 2018/3/8.
*/
public class SomeServiceImpl implements ISomeService {
public void select() {
System.out.println("select ok!");
}
public void insert() {
}
public void delete() {
}
public void update() {
}
}
第三步:写一个前置增强
package demo17;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
/**
* Created by mycom on 2018/3/12.
*/
public class BeforeAdvice implements MethodBeforeAdvice {
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("before=======");
}
}
第四步:配置xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!--1.目标对象-->
<bean id="service" class="demo17.SomeServiceImpl"></bean>
<!--通知-->
<bean id="beforeAdvice" class="demo17.BeforeAdvice"></bean>
<!--顾问-->
<bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="beforeAdvice"></property>
<property name="patterns" value=".*e.*"></property>
</bean>
<!--默认自动代理-->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>
</beans>
最后一步:编写测试方法,进行单测
//默认自动代理
@Test
public void t1() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextauto01.xml");
ISomeService service =(ISomeService) context.getBean("service");
service.select();
}
运行结果如下:

第二种:名称自动代理生成器(BeanNameAutoProxyCreator)
步骤和上述的一样,在这里我就直接用上一种的接口和实现类了,xml中的配置有所不同
这里我有创建了一个接口和实现类,如果要配置多个对象,应该怎么配?
新创建的接口和实体类
package demo17;
/**
* Created by mycom on 2018/3/12.
*/
public interface IBookService {
public void select();
}
package demo17;
/**
* Created by mycom on 2018/3/12.
*/
public class BookServiceImpl implements IBookService {
public void select() {
System.out.println("Book select");
}
}
配置文件中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!--1.目标对象-->
<bean id="service" class="demo17.SomeServiceImpl"></bean>
<bean id="bookService" class="demo17.BookServiceImpl"></bean>
<!--通知-->
<bean id="beforeAdvice" class="demo17.BeforeAdvice"></bean>
<!--顾问-->
<bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="beforeAdvice"></property>
<property name="patterns" value=".*e.*"></property>
</bean>
<!--名称自动代理-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="service,bookService"></property>
<property name="interceptorNames" value="advisor"></property>
</bean>
</beans>
编写测试类
//名称自动代理
@Test
public void t2() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextauto02.xml");
ISomeService service =(ISomeService) context.getBean("service");
service.select();
IBookService bookService =(IBookService) context.getBean("bookService");
bookService.select();
}
