带有切点的切面,就是可以针对目标对象的某些方法进行增强。
使用普通
Advice
作为切面,将对目标类所有方法进行拦截,不够灵活,在实际开发中常采用带有切点的切面。
常用PointcutAdvisor实现类,它有两个接口:
1、DefaultPointcutAdvisor:最常用的切面类型,它可以通过任意Pointcut和Advice 组合定义切面
2、RegexpMethodPointcutAdvisor:构造正则表达式切点切面,一般使用这种。
下面,我们来开发带有切点的切面项目:
1、创建被代理对象
package com.js.demo1;
/**
* 目标对象
* @author JiangShuai
*
*/
public class OrderDao {
public void add() {
System.out.println("添加订单...");
}
public void delete() {
System.out.println("删除订单...");
}
public void update() {
System.out.println("修改订单...");
}
public void find() {
System.out.println("查询订单...");
}
}
2、编写增强类,这次试用环绕增强。
package com.js.demo1;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/**
* 增强的类
* 使用的是环绕增强
* @author JiangShuai
*
*/
public class MyAroundAdvice implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("环绕前增强===");
Object object=methodInvocation.proceed();//执行目标对象的方法
System.out.println("环绕后增强===");
return object;
}
}
3、生成代理:通过配置的方式:
<!-- 带有切点的切面 -->
<!-- 定义目标对象 -->
<bean id="orderDao" class="com.js.demo1.OrderDao"></bean>
<!-- 定义增强 -->
<bean id="aroundAdvice" class="com.js.demo1.MyAroundAdvice"></bean>
<!-- 定义切点切面: -->
<bean id="myPointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<!-- 定义表达式,规定哪些方法执行拦截 -->
<!-- . 任意字符 * 任意个 -->
<!-- <property name="pattern" value=".*"/> -->
<!-- <property name="pattern" value="cn\.itcast\.spring3\.demo4\.OrderDao\.add.*"/> -->
<!-- <property name="pattern" value=".*add.*"></property> -->
<property name="patterns" value=".*add.*,.*find.*"></property>
<!-- 应用增强 -->
<property name="advice" ref="aroundAdvice"/>
</bean>
<!-- 定义生成代理对象 -->
<bean id="orderDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 配置目标 -->
<property name="target" ref="orderDao"></property>
<!-- 针对类的代理 -->
<property name="proxyTargetClass" value="true"></property>
<!-- 在目标上应用增强 -->
<property name="interceptorNames" value="myPointcutAdvisor"></property>
</bean>
4、编写测试类:
package com.js.demo1;
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;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestDemo2 {
@Autowired
@Qualifier("orderDaoProxy")
private OrderDao orderDao;
@Test
public void demo1(){
orderDao.add();
orderDao.delete();
orderDao.find();
orderDao.update();
}
}
运行结果: