您的位置:首页 > 编程语言 > Java开发

Spring学习-19:Spring的AOP:带有切点的切面

2017-04-11 16:21 344 查看
带有切点的切面,就是可以针对目标对象的某些方法进行增强。

使用普通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();
}
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: