多种方式实现AOP
一、使用代理工厂完成声明式增强
1.创建业务接口
public interface IdoSomeService { public void doSomething(); }
2.创建接口实现类
public class IdoSomeServiceImpl implements IdoSomeService{ @Override public void doSomething() { System.out.println("真实业务"); } }
3.创建切面类
/** * 切面 */ public class MyBeforeAdvice implements MethodBeforeAdvice { @Override public void before(Method method, Object[] objects, Object o) throws Throwable { System.out.println("前置增强"); } }
4.编写applicationContext.xml配置文件
<!--注入业务Bean--> <bean id="idoSomeService" class="cn.spring.proxyfactory.IdoSomeServiceImpl"></bean> <!--增强:切面--> <bean id="myBeforeAdvice" class="cn.spring.proxyfactory.MyBeforeAdvice"></bean> <!--使用代理工厂实现增强--> <bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean"> <!--将增强和业务织入 到一起 --> <property name="target" ref="idoSomeService"></property> <!--拦截增强类--> <property name="interceptorNames" value="myBeforeAdvice"></property> </bean>
5.创建测试类
public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); //获取代理工厂 IdoSomeService idoSomeService=(IdoSomeService)context.getBean("proxyFactory"); idoSomeService.doSomething(); } }
二、使用代理工厂完成环绕增强
1.创建业务接口
public interface IdoSomeService { public void doSomething(); }
2.创建业务接口实现类
public class IdoSomeServiceImpl implements IdoSomeService{ @Override public void doSomething() { System.out.println("真实业务"); } }
3.创建切面类
public class MyAroundAdvice implements MethodInterceptor { @Override public Object invoke(MethodInvocation methodInvocation) throws Throwable { System.out.println("环绕前"); //调用核心业务方法也可以获取方法内的参数 也可以获取目标对象 Object proceed = methodInvocation.proceed(); Object aThis = methodInvocation.getThis(); System.out.println(aThis); System.out.println("环绕后"); return proceed; } }
4.编写applicationContext.xml配置文件
环绕增强 <bean id="idoSomeService" class="cn.spring.around.IdoSomeServiceImpl"></bean> <bean id="myAroundAdvice" class="cn.spring.around.MyAroundAdvice"></bean> <bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean"> <!--将增强和业务织入到一起--> <property name="target" ref="idoSomeService"></property> <property name="interceptorNames" value="myAroundAdvice"></property> <!--更换代理方式 proxyTargetClass默认值为false 默认是jdk动态代理,但是当目标对象没有接口时,自动改为cglib--> <property name="proxyTargetClass" value="true"></property> </bean>
4.创建测试类
public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); //获取代理工厂 IdoSomeService idoSomeService=(IdoSomeService)context.getBean("proxyFactory"); idoSomeService.doSomething(); }
三、使用工厂代理工厂完成异常增强
1.创建业务接口
public interface IdoSomeService { public void doSomething() throws Exception; }
2.创建业务接口实现类
public class IdoSomeServiceImpl implements IdoSomeService { @Override public void doSomething() throws Exception{ int result=5/0; System.out.println("真实业务"); } }
3.创建切面类
public class MyThrowAdvice{ public void afterThrowing(Exception ex){ System.out.println("=====发生了异常,执行增强操作==============="); } }
4.编写applicationContext.xml配置文件
<!--环绕增强--> <bean id="idoSomeService" class="cn.spring.around.IdoSomeServiceImpl"></bean> <bean id="myAroundAdvice" class="cn.spring.around.MyAroundAdvice"></bean> <bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean"> <!--将增强和业务织入到一起--> <property name="target" ref="idoSomeService"></property> <property name="interceptorNames" value="myAroundAdvice"></property> <!--更换代理方式 proxyTargetClass默认值为false 默认是jdk动态代理,但是当目标对象没有接口时,自动改为cglib--> <property name="proxyTargetClass" value="true"></property> </bean>
5.创建测试类
public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); //获取代理工厂 IdoSomeService idoSomeService=(IdoSomeService)context.getBean("idoSomeService"); try{ idoSomeService.doSomething(); }catch (Exception e){ e.printStackTrace(); } System.out.println("2222222222222"); }
四、使用代理工厂实现最终增强
1.创建业务接口
public interface IdoSomeService { public void doSomething() throws Exception; }
2.创建业务接口实现类
public class IdoSomeServiceImpl implements IdoSomeService { @Override public void doSomething() throws Exception{ int result=5/0; System.out.println("真实业务"); } }
3.创建切面类
public class MyThrowAdvice{ public void afterAdvice(){ System.out.println("======执行最终异常==============="); } }
4.编写applicationContext.xml配置文件
<bean id="idoSomeService" class="cn.spring.throwadvice.IdoSomeServiceImpl"></bean> <bean id="myAdvice" class="cn.spring.throwadvice.MyThrowAdvice"></bean> <aop:config> <aop:pointcut id="pointcut" expression="execution(* *..throwadvice.*.*(..))"/> <aop:aspect ref="myAdvice"> <aop:after-throwing method="afterThrowing" throwing="ex" pointcut-ref="pointcut"></aop:after-throwing> <aop:after method="afterAdvice" pointcut-ref="pointcut"></aop:after> </aop:aspect> </aop:config>
5.创建测试类
public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); //获取代理工厂 IdoSomeService idoSomeService=(IdoSomeService)context.getBean("idoSomeService"); try{ idoSomeService.doSomething(); }catch (Exception e){ e.printStackTrace(); } System.out.println("2222222222222"); }
多种方式实现AOP的更多相关文章
- 特性attribute,声明和使用attribute,应用attribute,AOP面向切面,多种方式实现AOP
1 特性attribute,和注释有什么区别2 声明和使用attribute3 应用attribute4 AOP面向切面5 多种方式实现AOP ---------------------------- ...
- IOC和AOP使用扩展 多种方式实现依赖注入
多种方式实现依赖注入 1.Spring 使用setter访问器实现对属性的赋值, 2.Spring 构造constructor方法赋值, 3.接口注入 4.Spring P命名空间注入直接量 sett ...
- Spring学习总结(一)——Spring实现IoC的多种方式
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...
- idea打包jar的多种方式
这里总结出用IDEA打包jar包的多种方式,以后的项目打包Jar包可以参考如下形式: 用IDEA自带的打包形式 用Maven插件maven-shade-plugin打包 用Maven插件maven-a ...
- Java中测试异常的多种方式
使用JUnit来测试Java代码中的异常有很多种方式,你知道几种? 给定这样一个class. Person.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- PDO多种方式取得查询结果
PDO多种方式取得查询结果 01 December 2009 1:26 Tuesday by Sjolzy PDO最大的特点之一是它的灵活性,本节将介绍如何取得查询结果,包括: 数组(数值或关联数组) ...
- java 获取classpath下文件多种方式
java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...
- sql语句分页多种方式ROW_NUMBER()OVER
sql语句分页多种方式ROW_NUMBER()OVER 摘自: http://www.cnblogs.com/CodingArt/articles/1692468.html 方式一 select to ...
- JavaScript中判断为整数的多种方式
之前记录过JavaScript中判断为数字类型的多种方式,这篇看看如何判断为整数类型(Integer). JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示,和Java的d ...
随机推荐
- HTML文档简介
HTML简介 HTML标签 html文档标签: html源代码就好像word文档,有特殊的语法结构定义自己的功能. html文档标签 html标签,其下由两个主要节点标签head.body. head ...
- asp.net core IdentityServer4 概述
概览 现代应用程序看上去大都是这样的: 最常见的交互是: 浏览器与Web应用程序通信 Web应用程序与Web API通信(有时是独立的,有时是代表用户的) 基于浏览器的应用程序与Web API通信 本 ...
- JavaSE知识点总结(一)
第一章 课程介绍第二章 java语言概述 课时2:作业 1.常用软件分为那两类? 系统软件 应用软件 2.人机交互的两种方式是哪两种? 图形化界面 代码行命令 课时3:作业 1.java语言的特性有哪 ...
- Xshell无法连接Linux虚拟机问题
遇到的情况是,在虚拟机下安装了Linux后,xshell无法连接远程的虚拟机. 我遇到的情况是虚拟机可以ping 主机,主机确ping不了虚拟机. 使用的VM设置了两个网卡,一个nat 一个host ...
- 基于Docker搭建大数据集群(一)Docker环境部署
本篇文章是基于Docker搭建大数据集群系列的开篇之作 主要内容 docker搭建 docker部署CentOS 容器免密钥通信 容器保存成镜像 docker镜像发布 环境 Linux 7.6 一.D ...
- Spring MVC-从零开始-第一个控制器(不考虑命名规范)
1.目录结构 (log4j.properties.mybatis-config.xml可忽略) 2.配置web.xml文件 <?xml version="1.0" encod ...
- Python将自己写的模块进行打包
将项目打包成模块的想法来自于flask文档教程,这不是在PyCon上和阿明合了照嘛,这不得多看看人家的东西.有兴趣的可以看看文档的项目可安装化部分,作者将flask项目打包成一个包,使其可以再任何地方 ...
- MongoDB的全文索引
Table of Contents 背景 如何使用 准备工作:插入数据 建立全局索引 查询结果 使用中存在哪些问题? 英文存在停止词 中文无法采用全文索引 前面了解了多种索引方式,比如单键索引,多 ...
- 在window里面安装ubuntu子系统并安装图形化界面
一.开启windows子系统 1. 在win10设置里面开启开发人员选项 (设置-->更新安全--> 开发者选项 )选择开启 2.在控制面板里面开启windows子系统 (启用或关闭wi ...
- 去掉文件 BOM 头
什么是 BOM? BOM 全称是 Byte Order Mark,意思是字节顺序标记.常用来当作标示文件是以 UTF-8.UTF-16 或者 UTF-32 编码的标记. 去除 BOM 头方法 vim ...