Spring之AOP

之前在另外一篇博文里介绍过AOP的概念, 这边不在赘述, 可以参考 AOP与动态代理

本文主要介绍Spring中AOP的应用.

切入点: 具体实现类的方法 连接点: 接口中的方法

Advice

  • 前置MethodBeforeAdvice
  • 后置AfterReturnAdvice
  • 环绕MethodInterceptor
  • ThrowsAdvice
 1 public class MyServiceBeforeAdvice implements MethodBeforeAdvice{
 2     @Override
 3     public void before(Method method, Object[] args, Object target) throws Throwable {
 4         System.out.println("MyServiceBeforeAdvice");
 5     }
 6 }
 7 
 8 public class MyServiceAfterService implements AfterReturningAdvice{
 9     @Override
10     public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
11         System.out.println("MyServiceAfterService");
12     }
13 }
14 
15 
16 public class MyMethodInterceptor implements MethodInterceptor{
17     @Override
18     public Object invoke(MethodInvocation invocation) throws Throwable {
19         System.out.println("before");
20         Object result = invocation.proceed();
21         System.out.println("after");
22         return result;
23     }
24 }

对应的xml写法

 1         <bean id="someService" class="day1207.ServiceImpl"/>
 2 
 3         <bean id="myAdvice" class="day1207.MyServiceBeforeAdvice"/>
 4         <bean id="myAdvice2" class="day1207.MyServiceAfterService"/>
 5         <bean id="myAdvice3" class="day1207.MyMethodInterceptor"/>
 6 
 7         <bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
 8                 <property name="target" ref="someService"/>
 9                 <property name="interceptorNames" value="myAdvice, myAdvice2, myAdvice3"/>
10         </bean>

 CGlib代理

 Spring中默认有接口的对象直接用的jdk动态代理实现的AOP, 无接口的对象用CGlib实现的.

如果想要强制都用CGlib实现, 则可以通过以下配置

1         <property name="optimize" value="true"/>

 或者

1         <property name="proxyTargetClass" value="true"/>

Advisor

PointcutAdvisor: 可以指定具体切入点位置.

NameMatchMethodPointcutAdvisor 名称匹配

1         <bean id="myAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
2                 <property name="advice" ref="myAdvice2"/>
3                 <!-- 匹配对象是简单方法名 -->
4                 <property name="mappedNames" value="doFirst, doSecond"/>
5         </bean>

RegexpMethodPointcutAdvisor 正则匹配

1         <bean id="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
2                 <property name="advice" ref="myAdvice2"/>
3                 <!--匹配全限定性方法路径-->
4                 <property name="pattern" value=".*S.*"/>
5         </bean>

自动代理生成器

用于解决多个Bean需要对应多个代理的问题.

Advisor代理生成器

1         <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

缺点: 范围太广, 无法指定差异化Bean处理, 不能选择切面类型, 只能Advisor. 内部实现是用的BeanPostProcessor.

Bean名称自动代理生成器

1         <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
2                 <property name="beanNames" value="someService"/>
3                 <property name="interceptorNames" value="myAdvisor"/>
4         </bean>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring之IOC

    IOC 控制反转, 将由程序直接操控的对象调用权交给容器, 通过容器来实现对象的装配和管理. 容器即applicationContext.xml 第一个spri...

    用户1216491
  • 初识AOP与动态代理

    AOP AOP是指在jvm运行时, 动态将代码切入到指定位置. OOP是一个维度上写代码, AOP是把他切开来, 变成立体的. 这样的好处是: 业务逻辑跟辅助逻...

    用户1216491
  • Spring MVC核心技术

    目录 异常处理 类型转换器 数据验证 文件上传与下载 拦截器 ----  异常处理 Spring MVC中, 系统的DAO, Service, Controll...

    用户1216491
  • java SSL

    防止抵赖,能够检查签名之后内容是否有更改。通过单向散列算法对内容进行求值,相当于对内容进行提取了指纹。

    良辰美景TT
  • Quartz组件使用一 原

    南郭先生
  • Appium之获取app信息及界面定位方法

    在使用android自动化测试工具monkeyrunner和appium中启动应用时,需要填写被测程序的包名和启动的Activity,以下有几种查看应用包名pa...

    用户6367961
  • Mybais映射文件笔记----查询

    SuperHeroes
  • DamID-seq分析(三)

    质控分析: https://www.jianshu.com/p/e0bfa7b75ccb

    liu_ll
  • Java解析XML文件的方式

    在项目里,我们往往会把一些配置信息放到xml文件里,或者各部门间会通过xml文件来交换业务数据,所以有时候我们会遇到“解析xml文件”的需求。一般来讲,...

    用户1153489
  • Android用户界面开发概述

    相信通过前面15期的学习,Android的开发环境已经基本掌握了,如果仍有问题,欢迎到Android零基础入门技术讨论微信群交流,从本期开始正式来一步一...

    分享达人秀

扫码关注云+社区

领取腾讯云代金券