前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring之AOP

Spring之AOP

作者头像
用户1216491
发布2018-01-24 16:04:30
4780
发布2018-01-24 16:04:30
举报
文章被收录于专栏:xdecode

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

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

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

Advice

  • 前置MethodBeforeAdvice
  • 后置AfterReturnAdvice
  • 环绕MethodInterceptor
  • ThrowsAdvice
代码语言:javascript
复制
 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写法

代码语言:javascript
复制
 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实现, 则可以通过以下配置

代码语言:javascript
复制
1         <property name="optimize" value="true"/>

 或者

代码语言:javascript
复制
1         <property name="proxyTargetClass" value="true"/>

Advisor

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

NameMatchMethodPointcutAdvisor 名称匹配

代码语言:javascript
复制
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 正则匹配

代码语言:javascript
复制
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代理生成器

代码语言:javascript
复制
1         <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

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

Bean名称自动代理生成器

代码语言:javascript
复制
1         <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
2                 <property name="beanNames" value="someService"/>
3                 <property name="interceptorNames" value="myAdvisor"/>
4         </bean>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Advice
  •  CGlib代理
  • Advisor
  • 自动代理生成器
相关产品与服务
云顾问
云顾问(Tencent Cloud Smart Advisor)是一款提供可视化云架构IDE和多个ITOM领域垂直应用的云上治理平台,以“一个平台,多个应用”为产品理念,依托腾讯云海量运维专家经验,助您打造卓越架构,实现便捷、灵活的一站式云上治理。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档