Spring(五)AOP简述
一、AOP简述
AOP全称是:aspect-oriented programming,它是面向切面编号的思想核心,
AOP和OOP既面向对象的编程语言,不相冲突,它们是两个相辅相成的设计模式型
AOP技术弥补了面向对象编程思想的不足,spring aop是实现aop的一种技术,srping aop是spring框架中某个子框架或者子功能所依赖的核心。
SPring的容器并不依赖于AOP
这意味着程序员可以自己选择是否使用aop技术,aop提供强大的中间件解决方案,这使用spring ioc容器更加的完善
二、一些术语
2.1、术语
- Cross-cutting concern:系统层面上的服务穿插到业务逻辑的处理流程之中
- Aspect:当需要时,将其放到应用程序之上,不需要时,将其从应用程序中脱离出来
- Advcie:是Aspect具体的实现,advice包括cross-cutting conerns的行为或者所提供的服务
- Joinpoint:Aspect在应用程序执行时加入业务流程的时机
- Pointcut:指定某个aspect在那些joinpoint时被穿插至应用程序之上
- Target:一个advice被应用的对象或者目标对象
- Instruction:为已经编写,编译完成的类,在执行时期动态的加入一些方法而不用修改或者增加任何代码
- Weave:被应用 到对象之上的过程
2.2、Spring对AOP的支持
纯Java语言来编写
定义pointcutes可以使用配置文件
不支持属性成员的jointpoints.(spring 设计思想认为支持属性成员的jointpoints会破坏对象的封装性)
三、Spring创建Advice
3.1、Before Advice
目标对象的方法执行之前被调用
通过实现MethodBeforeAdvice接口来实现
MethodBeforeAdvice 继承自BeforeAdvice,而BeforeAdvice又继承Advice接口,before方法会在目标对象target所指定的方法执行之前被调用执行。before返回值为void 没有返回返回值,在before方法执行完成之后,才开始执行目标对象的方法.
3.2、实例
package com.pb;
/**
* 接口
* @author Administrator
*
*/
public interface IHello { public void sayHello(String str); }
package com.pb;
/**
* 接口实现类
* @author Administrator
*
*/
public class Hello implements IHello { @Override
public void sayHello(String str) {
System.out.println("Hello "+str); } }
代理类
package com.pb; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice;
/**
* 在方法执行前调用
* @author Administrator
*实现了MethodBeforeAdvcie接口
*/
public class SayHelloBeforeAdvice implements MethodBeforeAdvice { @Override
public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
System.out.println("====在方法执行前调用======"); } }
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <!-- 建立目标对象实例 -->
<bean id="hello" class="com.pb.Hello"/>
<!-- 设定Advice实例-->
<bean id="sayBeforeAdvice" class="com.pb.SayHelloBeforeAdvice" />
<!-- 建立代理对象 -->
<bean id="hellProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 设置代理接口 -->
<property name="proxyInterfaces">
<value>com.pb.IHello</value>
</property>
<!-- 设置目标对象实例-->
<property name="target">
<ref local="hello"/>
</property>
<!-- 设定Advice实例-->
<property name="interceptorNames">
<list>
<value>sayBeforeAdvice</value>
</list>
</property>
</bean> </beans>
测试类
package com.pb; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* 测试类
* @author Administrator
*
*/
public class Test { public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
IHello iHello=(IHello) context.getBean("hellProxy");
iHello.sayHello("AOP"); } }
结果:
====在方法执行前调用======
Hello AOP
3.3、After Advice
在目标对象方法执行之后被调用
通过实现AfterReturningAdvice接口来实现
在以上代码上增加
package com.pb; import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice;
/*
* 在方法执行完后调用
* 实现 AfterRetruningAdvice接口
*/
public class SayAfterAdvice implements AfterReturningAdvice { @Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
System.out.println("=========在方法执行完后调用======="); } }
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <!-- 建立目标对象实例 -->
<bean id="hello" class="com.pb.Hello"/>
<!-- 设定beforAdvice实例-->
<bean id="sayBeforeAdvice" class="com.pb.SayHelloBeforeAdvice" />
<!-- 设定AfterAdvice实例 -->
<bean id="sayAfterAdvice" class="com.pb.SayAfterAdvice" />
<!-- 建立代理对象 -->
<bean id="hellProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 设置代理接口 -->
<property name="proxyInterfaces">
<value>com.pb.IHello</value>
</property>
<!-- 设置目标对象实例-->
<property name="target">
<ref local="hello"/>
</property>
<!-- 设定Advice实例-->
<property name="interceptorNames">
<list>
<value>sayBeforeAdvice</value>
<value>sayAfterAdvice</value>
</list>
</property>
</bean>
</beans>
测试类不变,结果:
====在方法执行前调用======
Hello AOP
=========在方法执行完后调用=======
3.4、Around Advice
在方法执行之间和之后来执行相应的操作
要实现接口MethodInterceptor接口
package com.pb; import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation; public class SayAroundAdvice implements MethodInterceptor { @Override
public Object invoke(MethodInvocation arg0) throws Throwable {
System.out.println("=========在方法执行之前做点事情");
Object result=arg0.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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <!-- 建立目标对象实例 -->
<bean id="hello" class="com.pb.Hello"/>
<!-- 设定beforAdvice实例-->
<bean id="sayBeforeAdvice" class="com.pb.SayHelloBeforeAdvice" />
<!-- 设定AfterAdvice实例 -->
<bean id="sayAfterAdvice" class="com.pb.SayAfterAdvice" />
<!-- 设定AroundAdvice实例 -->
<bean id="sayRoundAdvice" class="com.pb.SayAroundAdvice" />
<!-- 建立代理对象 -->
<bean id="hellProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 设置代理接口 -->
<property name="proxyInterfaces">
<value>com.pb.IHello</value>
</property>
<!-- 设置目标对象实例-->
<property name="target">
<ref local="hello"/>
</property>
<!-- 设定Advice实例-->
<property name="interceptorNames">
<list>
<!-- <value>sayBeforeAdvice</value>
<value>sayAfterAdvice</value> -->
<value>sayRoundAdvice</value>
</list>
</property>
</bean> </beans>
3.5、THrowsAdvice
异常发生的时候,通知某个服务对象做处理
实现ThrowsAdvice接口
package com.pb; import java.lang.reflect.Method; import org.springframework.aop.ThrowsAdvice; public class SayThowsAdvice implements ThrowsAdvice { public void afterThrowing(Method method,Object[] objs,Object target,Throwable ta){
System.out.println("异常发生: "+ta+" 抛出异常的是: "+method);
}
}
四、基于XML Schema
简化代码实现
容易对应程序进行维护
所有元素都定义在<aop:config>中
五、基于Annotation
以注解的方式对Java普通类进行标注
Spring(五)AOP简述的更多相关文章
- 跟着刚哥学习Spring框架--AOP(五)
AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入 ...
- Spring框架第五篇之Spring与AOP
一.AOP概述 AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充.面向对象编程是从静态角度考虑程序的结构,而面向切面编程是从动态角度考虑程序运 ...
- Spring 学习十五 AOP
http://www.hongyanliren.com/2014m12/22797.html 1: 通知(advice): 就是你想要的功能,也就是安全.事物.日子等.先定义好,在想用的地方用一下.包 ...
- Spring学习之旅(五)--AOP
什么是 AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是 OOP(Object-Oriented Programing,面向对象编程)的补充和完善. OO ...
- Spring5.0源码学习系列之Spring AOP简述
前言介绍 附录:Spring源码学习专栏 在前面章节的学习中,我们对Spring框架的IOC实现源码有了一定的了解,接着本文继续学习Springframework一个核心的技术点AOP技术. 在学习S ...
- Spring实现AOP的4种方式
了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“ ...
- spring的AOP
最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spr ...
- Spring 实践 -AOP
Spring 实践 标签: Java与设计模式 AOP引介 AOP(Aspect Oriented Programing)面向切面编程采用横向抽取机制,以取代传统的纵向继承体系的重复性代码(如性能监控 ...
- Spring实现AOP的4种方式(转)
转自:http://blog.csdn.net/udbnny/article/details/5870076 Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定 ...
随机推荐
- JS文档和Demo自动化生成工具 - SmartDoc发布
曾几何时,当你码神附体,一路披荆斩棘的完成代码后,带着“一码在手,天下我有”的傲然环顾之时,却发现单元测试.API文档.Demo实例陆续向你砸来,顿时有木有一种冰水挑战后的感觉.而这时你应该:哟哟,快 ...
- tcp为什要三次握手
准备知识: 单工:信息只能单向传递.发送-->接收,单向,不能返回响应. 双工:指的是信息可双向发送. 全双工:信息可同时双向传递. 半双工:不能同时,单行道,一边传输完了,另一边才能发起传输. ...
- fzu 2107 Hua Rong Dao(状态压缩)
Problem 2107 Hua Rong Dao Accept: 106 Submit: 197 Time Limit: 1000 mSec Memory Limit : 32768 K ...
- Android自定义之仿360Root大师水纹效果
很简单的一个效果.我直接上图了. 代码就不详细说了,贴出关键代码就行了. @Override protected void onDraw(Canvas canvas) { s ...
- LoRaWAN协议(二)--LoRaWAN MAC数据包格式
名词解析 上行:终端的数据发送经过一个或多个网关中转到达网络服务器. 下行:由网络服务器发送给终端设备,每条消息对应的终端设备是唯一确定的,而且只通过一个网关中转. LoRaWAN Classes L ...
- SQL Server 2016里TempDb的提升
几个星期前,SQL Server 2016的最新CTP版本已经发布了:CTP 2.4(目前已经是CTP 3.0).这个预览版相比以前的CTP包含了很多不同的提升.在这篇文章里我会谈下对于SQL Ser ...
- python内置模块(4)
这一部分是python内置模块系列的最后一部分,介绍了一些小巧有用的内置模块. 目录: 1.random 2.shelve 3.getpass 4.zipfile 5.tarfile 6.bisect ...
- Android的init过程(二):初始化语言(init.rc)解析
Android的init过程(一) 本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 在上一篇文章中介绍了init的初始化第一阶段,也就是处理各种属性.在本文将会详细分析i ...
- javaScript一些函数包括调试方法(二)
Number():设法把括号里面的值,转换成一个数,转换不了为数字的话,就返回NaN. 注意:Number()函数,会拒绝任何包含,非数字字符的字符串(阿拉伯数字.一个有效的小数位.+.-符号是允许的 ...
- .NET生成缩略图并下载
缩略图:比喻一张图片宽度为1000px,大小为800K,经过缩略后变成一张宽度100px,大小10K的图片. 先给出界面: 总体的流程分5步如下图: 1.添加一个html:GetminPic.html ...