Spring中的四种增强有那四种?

前置增强    后置增强  环绕增强  异常增强

先编写接口和实体类  ISomeService和SomeServiceImpl

package demo10;/*** Created by mycom on 2018/3/8.*/
public interface ISomeService {public void doSome();
}

package demo10;/*** Created by mycom on 2018/3/8.*/
public class SomeServiceImpl implements ISomeService {public void doSome() {System.out.println("=================");}
}

先来说第一个前置增强,直接用例子来说明

package demo10;import org.springframework.aop.MethodBeforeAdvice;import java.lang.reflect.Method;/*** Created by mycom on 2018/3/8.*/
public class BeforeAdvice implements MethodBeforeAdvice {public void before(Method method, Object[] objects, Object o) throws Throwable {System.out.println("=========before");}
}

在配置文件中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="service" class="demo10.SomeServiceImpl"></bean><bean id="beforeAdvice" class="demo10.BeforeAdvice"></bean><bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean"><property name="target" ref="service"></property><property name="interceptorNames" value="beforeAdvice"></property></bean></beans>

@Testpublic void t1(){ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextBefore.xml");ISomeService proxyService =(ISomeService) context.getBean("proxyService");proxyService.doSome();}

运行的结果是

2.后置增强和前置增强一样,只是改一改配置文件里的名称就可以

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="service" class="demo11.SomeServiceImpl"></bean><bean id="afterAdvice" class="demo11.AfterAdvice"></bean><bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean"><property name="target" ref="service"></property><property name="interceptorNames" value="afterAdvice"></property></bean></beans>

3.环绕增强

直接饮用上面的接口和实现类了

在创建另一个类 MethodAdvice

package demo12;import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;/*** Created by mycom on 2018/3/8.*/
public class MethodAdvice implements MethodInterceptor {public Object invoke(MethodInvocation methodInvocation) throws Throwable {System.out.println("前置增强");Object result = methodInvocation.proceed();System.out.println("后置增强");return result;}
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="service" class="demo12.SomeServiceImpl"></bean><bean id="methodAdvice" class="demo12.MethodAdvice"></bean><bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean"><property name="target" ref="service"></property><property name="interceptorNames" value="methodAdvice"></property></bean></beans>

4.异常增强

package demo13;import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.ThrowsAdvice;/*** Created by mycom on 2018/3/8.*/
public class MyThroesAdvice implements ThrowsAdvice {public void afterThrowing(Exception ex){System.out.println("网络出现错误");}
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="service" class="demo13.SomeServiceImpl"></bean><bean id="throwsAdvice" class="demo13.MyThroesAdvice"></bean><bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean"><property name="target" ref="service"></property><property name="interceptorNames" value="throwsAdvice"></property></bean></beans>

@Testpublic void t2(){ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextThrows.xml");ISomeService proxyService =(ISomeService) context.getBean("proxyService");try{proxyService.doSome();}catch (Exception ex){ex.printStackTrace();}

5.advisor  是顾问的意思  正对某一个方法增强

还有一个词是通知  advice  我自己的理解是  通知视同只所有人,顾问是针对某个人顾问,这样方便记忆,顾问包括通知

通知的方法有两种名称匹配方法切入点顾问和正则方法切入点顾问

先看第一种:

现在在ISomeService接口中在添加一个方法doAny(),在实现类中重写这个方法

那么在配置文件中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="service" class="demo14.SomeServiceImpl"></bean><bean id="beforeAdvice" class="demo14.BeforeAdvice"></bean><!--与其他不一样的地方--><bean id="advisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"><property name="advice" ref="beforeAdvice"></property><property name="mappedNames" value="do*"></property></bean><bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean"><property name="target" ref="service"></property><property name="interceptorNames" value="advisor"></property></bean></beans>

这个配置文件可以对比着之前写的配置文件看看有什么不同之处

@Testpublic void t2(){ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextAdvisor.xml");ISomeService proxyService =(ISomeService) context.getBean("proxyService");proxyService.doSome();proxyService.doAny();}

第二种方法:正则方法切入点顾问

同样是饮用上面的接口和实现类,在配置文件中:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="service" class="demo16.SomeServiceImpl"></bean><bean id="beforeAdvice" class="demo16.BeforeAdvice"></bean><bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"><property name="advice" ref="beforeAdvice"></property><property name="pattern" value=".*do.*"></property></bean><bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean"><property name="target" ref="service"></property><property name="interceptorNames" value="advisor"></property></bean></beans>

<property name="pattern" value=".*do.*"></property>

这个节点中name还有一个值是:patterns,其value值是:

<property name="patterns" value=".*Some,.*Any"></property>

这种方法用的是正则的符号

转载于:https://www.cnblogs.com/my-123/p/8533263.html

Spring(七)Spring中的四种增强和顾问相关推荐

  1. java按钮权限控制_详解Spring Security 中的四种权限控制方式

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...

  2. Spring Data JPA-JPA对象的四种状态

    Spring Data JPA-JPA对象的四种状态 JPA对象的四种状态 临时状态:刚创建出来,∙没有与EntityManager发生关系,没有被持久化,不处于EntityManager中的对象.实 ...

  3. aop的四种增强以及JDK动态代理、Cglib动态代理

    动态代理 AOP底层实现:有接口自动应用的就是JDK动态代理 (1).JDK 在运行时运行时注入 本质:在内存中构建出接口的实现类 特点:被代理对象,必须有接口 实例: import java.lan ...

  4. 后台CS代码中创建四种常用的SL动画效果

    http://www.cnblogs.com/chengxingliang/archive/2011/03/07/1974436.html后台CS代码中创建四种常用的动画效果[附带源码实例] 转载于: ...

  5. php 数组存入mysql_PHP将数组存入数据库中的四种方式

    1.implode()和explode()方式 2.print_r()和自定义函数方式 3.serialize()和unserialize()方式 4.json_encode()和json_decod ...

  6. java object 引用类型_java中的四种引用类型

    java中的四种引用类型 一.强引用 强引用是最常见的,把一个对象赋给一个引用变量,这个引用变量就是一个强引用.当一个对象被强引用变量引用时,他处于可达状态,它是不会被GC回收的,即使该对象以后永远不 ...

  7. 计算机网络中的时延有哪几部分,计算机网络中的四种延迟分别是什么?

    计算机网络中的四种延迟分别是:节点处理延迟 .排队延迟.发送延迟.传播延迟. 1.节点处理延迟 数据更改在一个服务器上完成与该更改出现在另一个服务器上之间所用的时间(例如在发布服务器上进行更改和该更改 ...

  8. Java 中的四种引用

    垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进行垃圾回收之前,虚拟 ...

  9. PHP将数组存入数据库中的四种方式

    最近突然遇到了一个问题,如何用PHP将数组存入到数据库中,经过自己的多方查找和研究,总结了以下四种方法: 1.implode()和explode()方式 2.print_r()和自定义函数方式 3.s ...

  10. java正则校验密码 长度不少于8位且至少包含大写字母、小写字母、数字和特殊符号中的四种组合 或者 其中任意三种组合

    java正则校验密码必须是包含大小写字母.数字.特殊符号的8位以上四种组合 或者 其中任意三种组合 一.排除法和详细解释 1.排除大写字母.小写字母.数字.特殊符号中1种组合.2种组合.3种组合,那么 ...

最新文章

  1. 网络设备转发数据包的整个流程_网络工程师(33):路由转发工作原理
  2. Windows IIS7 下安装配置 PHP7.0
  3. hive 导入hdfs数据_将数据加载或导入运行在基于HDFS的数据湖之上的Hive表中的另一种方法。
  4. 实践2.2 内核模块编译
  5. Spring同mybatis整合讲义(事物)
  6. ubuntu 本地源搭建
  7. 文荣:7月24日阿里云上海峰会网络大神
  8. python数据可视化之疫情地图爬虫(含完整代码以及具体报告)
  9. 防拷贝U盘在软件开发行业的应用,软件怎样防复制防拷贝?
  10. 蒋文华《博弈论》笔记及视频摘录
  11. Java 程序员新机必备程序清单
  12. CQF笔记Primer金融基础
  13. 从bam中截取指定位置的 reads 或深度
  14. 【360补天计划】记第一次漏洞提交
  15. python 从键盘输入若干个整数,当输入“-1““时输入结束,请统计最大值、最小值和平均数
  16. 阿里云虚拟主机共享和独享区别对比
  17. 谈谈工作 - 神州数码篇
  18. char *str 和 char str[] 的区别
  19. 基于JSP的网上订餐管理系统餐厅餐饮系统
  20. jquery 方法参数显示is not defined

热门文章

  1. ASP.NET加密和解密数据库连接字符串
  2. Linux中tshark(wireshark)抓包工具使用方法详解
  3. thinkPHP 空模块和空操作、前置操作和后置操作 详细介绍(十四)
  4. CentOS修改时区
  5. js动态修改onclick的响应函数后,IE无效的解决方案
  6. 大刀阔斧,抽丝剥茧:评红黑树系列文章
  7. OSPF 的六种 LSA类型
  8. Linux O(n)调度器
  9. netlink 0005 -- Generic Netlink详解
  10. netlink 0001 --- 基础简介