Spring学习-19:Spring的AOP:带有切点的切面
2017-04-11 16:21
344 查看
带有切点的切面,就是可以针对目标对象的某些方法进行增强。
使用普通Advice作为切面,将对目标类所有方法进行拦截,不够灵活,在实际开发中常采用带有切点的切面。
常用PointcutAdvisor实现类,它有两个接口:
1、DefaultPointcutAdvisor:最常用的切面类型,它可以通过任意Pointcut和Advice 组合定义切面
2、RegexpMethodPointcutAdvisor:构造正则表达式切点切面,一般使用这种。
下面,我们来开发带有切点的切面项目:
1、创建被代理对象
2、编写增强类,这次试用环绕增强。
3、生成代理:通过配置的方式:
运行结果:
使用普通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(); } }
运行结果:
相关文章推荐
- Spring学习-18:Spring的AOP:不带有切点的切面
- [原创]java WEB学习笔记107:Spring学习---AOP切面的优先级,重用切点表达式
- spring切点切面aop——xml非注解
- 重新学习之spring第二个程序,配置AOP面向切面编程
- Spring学习4-面向切面(AOP)之schema配置方式
- Spring-AOP:切面优先级和重用切点表达式
- Spring学习笔记(三)--面向切面编程AoP
- [置顶] spring切点切面aop——xml非注解
- Spring学习一:IOC(控制反转)和AOP(面向切面)的xml配置和注解方式
- Spring学习4-面向切面(AOP)之aspectj注解方式
- Spring学习(19)--- Schema-based AOP(基于配置的AOP实现) --- 配置切面aspect
- Jimoshi_Spring 框架学习(二)--AOP(面向切面)、AOP管理事务
- Spring学习4-面向切面(AOP)之Spring接口方式
- spring学习笔记(19)mysql读写分离后端AOP控制实例
- spring3.0 aop的annotation实现切面,新手学习
- java+spring切面编程(aop)spring控制反转(ioc)+hibenrate对象关系映射(ORM) 学习网址
- Spring学习4-面向切面(AOP)之aspectj注解方式
- Spring2.0 AOP @AspectJ注解定义切面学习示例。
- Spring AOP 之 实现切点、切面
- spring学习笔记(23)基于tx/aop配置切面增强事务