三、自动代理的实现

1、使用BeanNameAutoProxyCreator

  通过Bean的name属性自动生成代理Bean。

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Target</value> <!-- 名字以Target结尾的bean将被拦截 -->
</list>
</property>
<property name="interceptorNames">
<list>
<value>personAroundAdvice</value>
</list>
</property>
</bean>

2、使用DefaultAdvisorAutoProxyCreator

DefaultAdvisorAutoProxyCreator允许我们只需定义相应的Advisor通知者,就可以完成自动代理。配置好DefaultAdvisorAutoProxyCreator受管Bean后,它会自动查找配置文件中定义的Advisor,并将它们作用于所有的Bean。

Spring提供了以下通知者:

RegexpMethodPointcutAdvisor

NameMatchMethodPointcutAdvisor

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

<bean id="nameMatchMethodPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="personAroundAdvice"/>
<property name="mappedNames">
<list>
<value>*info*</value>
</list>
</property>
</bean>

3、测试代码

ApplicationContext context = new FileSystemXmlApplicationContext("classpath:com/cjm/aop/beans.xml");
Person p = (Person)context.getBean("personTarget"); //此处获取的是具体的Bean,而不是代理Bean
p.info();

四、基于aop命名空间的AOP

1、切面类MyAspect的源码

public class MyAspect {
public void BeforeAdvice(JoinPoint point){
PersonImpl p = (PersonImpl)point.getTarget();
} public void AfterAdvice(JoinPoint point){
PersonImpl p = (PersonImpl)point.getTarget();
} public void AfterReturningAdvice(Object retValue){
System.out.println(retValue);
} public void AroundAdvice(ProceedingJoinPoint point)throws Throwable{
System.out.println("AroundAdvice >> 目标对象 前");
point.proceed(point.getArgs());
System.out.println("AroundAdvice >> 目标对象 后");
} public void ThrowingAdvice(Throwable throwing)throws Throwable{
System.out.println(throwing);
}
}

2、配置

<!-- 切面受管Bean -->
<bean id="myAspect" class="com.cjm.aop.MyAspect"/> <aop:config proxy-target-class="true">
<!-- 声明一个切面 -->
<aop:aspect ref="myAspect" order="0">
<!-- 声明一个切入点 -->
<aop:pointcut id="pointcut1" expression="execution(* com.cjm.aop..*(..))"/> <!-- 声明通知 -->
<aop:before pointcut-ref="pointcut1" method="BeforeAdvice"/>
<aop:after pointcut-ref="pointcut1" method="AfterAdvice"/>
<aop:after-returning pointcut-ref="pointcut1" method="AfterReturningAdvice" returning="retValue"/>
<aop:around pointcut-ref="pointcut1" method="AroundAdvice"/>
<aop:after-throwing pointcut-ref="pointcut1" method="ThrowingAdvice" throwing="throwing"/>
</aop:aspect>
</aop:config>

Spring AOP使用整理:自动代理以及AOP命令空间的更多相关文章

  1. Spring只定义接口自动代理接口实现类

    能够扫描到包 @ComponentScan("org.zxp.esclientrhl") ESCRegistrar类主要实现ImportBeanDefinitionRegistra ...

  2. Spring框架学习08——自动代理方式实现AOP

    在传统的基于代理类的AOP实现中,每个代理都是通过ProxyFactoryBean织入切面代理,在实际开发中,非常多的Bean每个都配置ProxyFactoryBean开发维护量巨大.解决方案:自动创 ...

  3. AOP的自动代理

    Spring的aop机制提供两类方式实现类代理.一种是单个代理,一种是自动代理. 单个代理通过ProxyFactoryBean来实现(就如上面的配置). 自动代理:自动代理能够让切面定义来决定那个be ...

  4. Spring -- aop(面向切面编程),前置&后置&环绕&抛异常通知,引入通知,自动代理

    1.概要 aop:面向方面编程.不改变源代码,还为类增加新的功能.(代理) 切面:实现的交叉功能. 通知:切面的实际实现(通知要做什么,怎么做). 连接点:应用程序执行过程期间,可以插入切面的地点. ...

  5. 死磕Spring之AOP篇 - Spring AOP自动代理(一)入口

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  6. 死磕Spring之AOP篇 - Spring AOP自动代理(二)筛选合适的通知器

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  7. 死磕Spring之AOP篇 - Spring AOP自动代理(三)创建代理对象

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  8. spring aop自动代理xml配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. spring aop自动代理注解配置之二

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

随机推荐

  1. Kindeditor(JSP)& 上传目录不存在

    一.基本配置 Kindeditor是一款富文本编辑器,作用跟博客园写文章用的这个编辑器一样,都是为了让文本加入各种各样的修饰元素. 使用方法如下,解压缩,把期中的ASP\NET\PHP文件夹都删除,然 ...

  2. 怎样写 OpenStack Neutron 的 Extension (三)

    通过上几章的介绍,我们现在的 myplugin 文件夹看上去应该是这样的: - neutron/ - plugins/ - myplugin/ - __init__.py - plugin.py - ...

  3. Jquery.validate.js表单验证插件的使用

    作为一个网站web开发人员,以前居然不知道还有表单验证这样好呀的插件,还在一行行写表单验证,真是后悔没能早点知道他们的存在. 最近公司不忙,自己学习一些东西的时候,发现了validation的一个实例 ...

  4. [USACO2005][poj2229]Sumsets(递推)

    http://poj.org/problem?id=2229 分析: 显然的递推 若n为奇数,那么肯定是在n-1的基础上前面每个数+1,即f[n]=f[n-1] 若n为偶数 当第一位数字是1的时候,等 ...

  5. c# winform 火狐浏览器 查看cookie

    c# winform 火狐浏览器 查看cookie Firefox的Cookie数据位于:%APPDATA%\Mozilla\Firefox\Profiles\ 目录中的xxx.default目录,名 ...

  6. 每天一个linux命令(23): chown命令

    chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝 ...

  7. maven初学(二)archeType插件使用

    archeType是一个maven插件,它的主要功能是根据模板来创建工程结构 创建工程结构: 1,创建工程目录 2,输入命令:mvn archetype:generate 3,选择需要的archety ...

  8. Java基础-jdk动态代理与cglib动态代理区别

    JDK动态代理 此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑. 代理模式在实际使用时需要指定具体的目标对象 ...

  9. linux更改文件所有者命令chown命令的使用困惑

    [berry@berry:practice] ls -lrt total -rwxrwxrwx berry berry Dec : f1.txt -rwxrwxrwx berry berry Dec ...

  10. HTTP 方法

    HTTP 方法 两种最常用的 HTTP 方法是:GET 和 POST. 什么是 HTTP? 超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信. HTTP 的工作方式是客户机与服务器之 ...