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

带有切点的切面,就是可以针对目标对象的某些方法进行增强。

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

运行结果:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值