IOC和AOP使用扩展之AOP详解实现类
摘要:
“Depend on yourself” is what nature says to every man. Parents can help you. Teachers can help you. others still can help you. But all these only help you to help yourself |
“自立”是自然对每个人的要求.也许你的父母、老师能够帮助你,其他人也可以帮助你,但是所有这些人都只是帮你更加自主、自立。
最近完结了有关于AOP相关知识的学习,接下来就给大家讲讲我对AOP的一些见解。
既然学习AOP大家知道AOP是什么嘛?那么就开始喽~
AOP(Aspect Oriented Programming):面向切面编程,也是一种变成思想。(静态角度)
OOP(Object Oriented Programming):面向对象编程。(动态代理:JDK动态代理 CGLIB动态代理)
代理模(Proxy):为其他对象提供一个代理以控制对这个对象的访问。
适合的场合:远程代理 虚拟代理 安全代理(只需要简单了解不做详解)
↑ ↑ ↑ ↑ ↑ ↑只是关于代理的图片展示稍后会有详细代码
基本术语(一些名词):
(1)切面(Aspect)
切面泛指[*交叉业务逻辑*]。事务处理和日志处理可以理解为切面。常用的切面有通知(Advice)与顾问(Advisor)。实际就是对主业务逻辑的一种增强。
(2)织入(Weaving)
织入是指将切面代码插入到目标对象的过程。代理的invoke方法完成的工作,可以称为织入。
(3) 连接点(JoinPoint)
连接点是指可以被切面织入的方法。通常业务接口的方法均为连接点
(4)切入点(PointCut)
切入点指切面具体织入的方法
注意:被标记为final的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的。
(5)目标对象(Target)
目标对象指将要被增强的对象。即包含主业务逻辑的类的对象。
(6)通知(Advice)
通知是切面的一种实现,可以完成简单的织入功能。通知定义了增强代码切入到目标代码的时间点,是目标方法执行之前执行,还是执行之后执行等。切入点定义切入的位置,通知定义切入的时间。
(7)顾问(Advisor)
顾问是切面的另一种实现,能够将通知以更为复杂的方式织入到目标对象中,是将通知包装为更复杂切面的装配器。
Spring的经典AOP配置方案
1、使用的是Aspectj第三方框架,实现了AOP思想
2、注解配置的AOP
3、纯POJO 就是一个普通的类<aop:config>
接下来进入代码模式:
代码模式一:纯POJO(通过POJO来实现一个前置增强类)
定义一个简单的UserBiz类给它一个方法:
package cn.happy.biz; public class UserBiz {
public void addStu(UserInf user){
System.out.println("add ok");
}
}
在aop包下BeforeAdvice前置增强类,它需要实现MethodBeforeAdvice接口的before方法:
import org.springframework.aop.MethodBeforeAdvice; /**
* before
*
*/
public class BeforeAdvice implements MethodBeforeAdvice{ /**
*
* @param method 被代理的目标的方法
* @param args 传递给目标方法的参数
* @param obj 被代理的目标对象 * @throws Throwable
*/
@Override
public void before(Method method, Object[] args , Object obj)
throws Throwable {
System.out.println("========before======");
}
配置文件(注意引入的命名空间)<aop:config>配置下实现切面:
......
<bean id="biz" class="cn.happy.biz.UserBiz"></bean> <!-- 前置 -->
<bean id="beforeAdvice" class="cn.happy.aop.BeforeAdvice"></bean>
<!-- aop配置切面 -->
<aop:config>
<!-- 定义切点 -->
<aop:pointcut expression="execution(public void *(cn.happy.biz.UserInf))" id="pointcut"/>
<!-- 增强处理和切点结合 -->
<aop:advisor advice-ref="beforeAdvice" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterAdivice" pointcut-ref="pointcut"/>
</aop:config>
......
测试类:
public void testOne(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
UserBiz biz = (UserBiz)ctx.getBean("biz");
biz.addStu(new UserInf()); }
=========================华丽的分割线==================================
用注解配置的AOP:前置通知,后置通知,返回通知,异常通知,环绕通知
定义一个接口:
public interface ISomeService {
//1.1 执行事务
public void doTransaction();
//1.2 书写日志
public String doLog();
}
实现接口的实现类:
public class SomeServiceImpl implements ISomeService { public void doTransaction() {
System.out.println("开启事务");
} public String doLog() {
System.out.println("书写日志"+5/0);
return "我是书写日志的返回值哦!!!!!";
} }
增强类用注解写:
@Aspect
public class MyAspect {
//前置通知
@Before(value="execution(public * *(..))")
public void MyBefore(){
System.out.println("这是前置通知哦!!!!!!!在执行目标对象之前执行");
} //后置通知
@AfterReturning(value="execution(public * *(..))")
public void MyAfterReturning(){
System.out.println("这是后置通知哦!!!!!!!在执行目标对象之前执行");
} //环绕通知
/* @Around(value="execution(public * *(..))")
public void MyAround(ProceedingJoinPoint pjp){
System.out.println("这是环绕通知前哦!!!!!!!在执行目标对象之前执行");
try {
pjp.proceed();
System.out.println("这是环绕通知后哦!!!!!!!在执行目标对象之前执行");
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/ //异常通知
@AfterThrowing(value="execution(public * *(..))")
public void MyAfterThrowing(){
System.out.println("这是异常通知哦!!!!!!!在执行目标对象之前执行");
} //最终通知
@After(value="execution(public * *(..))")
public void MyAfter(){
System.out.println("这是最终通知哦!!!!!!!在执行目标对象之前执行");
}
}
配置文件:
<!-- 目标对象 -->
<bean id="someService" class="cn.happy.enetity.SomeServiceImpl"></bean> <!-- 切面: -->
<bean id="myAspect" class="cn.happy.aspece.MyAspect"></bean>
<!--aop:aspectj可以启动对@AspectJ注解支持-->
<aop:aspectj-autoproxy/>
</beans>
测试类:
public void testOne(){ ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
ISomeService service = (ISomeService)ctx.getBean("someService");
service.doTransaction();
String result = service.doLog();
System.out.println(result);
}
=========================华丽的分割线==================================
使用的是Aspectj第三方框架,实现了AOP思想XML的方式(就是一个普通类通过配置实现 )
定义一个接口:
1 public interface ISomeService {
2 //1.1 执行事务
3 public void doTransaction();
4 //1.2 书写日志
5 public String doLog();
6 }
实现类:
public class SomeServiceImpl implements ISomeService { public void doTransaction() {
System.out.println("开启事务");
} public String doLog() {
/*System.out.println("书写日志"+5/0);*/
System.out.println("书写日志");
return "我是书写日志的返回值哦!!!!!";
} }
定一个增强类就是一个普通类通过配置实现 :
public class MyAspect {
// 前置通知execution(public * *(..))
public void MyBefore() {
System.out.println("这是前置通知哦!!!!!!!在执行目标对象之前执行");
} // 后置通知execution(public * *(..))
public void MyAfterReturning() {
System.out.println("这是后置通知哦!!!!!!!在执行目标对象之前执行");
} // 异常通知
public void MyAfterThrowing() {
System.out.println("这是异常通知哦!!!!!!!在执行目标对象之前执行");
} // 最终通知
public void MyAfter() {
System.out.println("这是最终通知哦!!!!!!!在执行目标对象之前执行");
} //环绕通知
public String MyAround(ProceedingJoinPoint pjp){
System.out.println("这是环绕通知前哦!!!!!!!在执行目标对象之前执行");
try {
Object result=pjp.proceed();
System.out.println("这是环绕通知后哦!!!!!!!在执行目标对象之前执行");
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "result";
}
}
配置文件:
......
<!-- 目标对象 -->
<bean id="someService" class="enetity.SomeServiceImpl"></bean> <!-- 切面: -->
<bean id="myAspect" class="aspece.MyAspect"></bean> <!-- aop的配置 -->
<aop:config>
<!-- 切点 -->
<aop:pointcut expression="execution(public * *(..))" id="dopointcut"/>
<aop:aspect ref="myAspect"> <aop:before method="MyBefore" pointcut-ref="dopointcut"/>
<aop:after-returning method="MyAfterReturning" pointcut-ref="dopointcut"/>
<!-- <aop:after-throwing method="MyAfterThrowing" pointcut-ref="dopointcut"/> -->
<aop:after method="MyAfter" pointcut-ref="dopointcut"/>
<aop:around method="MyAround" pointcut-ref="dopointcut"/>
</aop:aspect> </aop:config>
</beans>
......
测试类:
public void testOne(){ ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
ISomeService service = (ISomeService)ctx.getBean("someService");
service.doTransaction();
String result = service.doLog();
System.out.println(result);
}
以上就是我对AOP相关知识代码层面的讲解。学的不是很好,也是早上请教了同学才能更深一层了解AOP。就如文章开头:
“自立”是自然对每个人的要求.也许你的父母、老师能够帮助你,其他人也可以帮助你,但是所有这些人都只是帮你更加自主、自立。
希望可以鼓励那些在快学不下去的时候去请教下同学,老师...
IOC和AOP使用扩展之AOP详解实现类的更多相关文章
- PHP扩展代码结构详解
PHP扩展代码结构详解: 这个是继:使用ext_skel和phpize构建php5扩展 内容 (拆分出来) Zend_API:深入_PHP_内核:http://cn2.php.net/manual/ ...
- unity3D游戏开发之详解Animation类和Animator类
详解Animator类和Animation类 链接: http://wenku.baidu.com/link?url=SiaUYcdrNYjOYrWVDJSKGAYdJOntMTOhsVJtyBk2i ...
- 【python进阶】详解元类及其应用1
前言 元类在python中是很重要的一部分,我将分两次去讲解元类及其应用,此篇为详解元类及其应用第一篇,下面开始今天的说明~~~ 1. 类也是对象 在⼤多数编程语⾔中,类就是⼀组⽤来描述如何⽣成⼀个对 ...
- 【python进阶】详解元类及其应用2
前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...
- Unity3D - 详解Quaternion类(二)
OK,不做引子了,接上篇Unity3D - 详解Quaternion类(一)走起! 四.Quaternion类静态方法 Quaternion中的静态方法有9个即:Angle方法.Dot方法.Euler ...
- Unity3D - 详解Quaternion类(一)
一.简介 Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念.四元数的乘法不符合交换律.从明确地角度而言,四元数是复数的不可交 ...
- 【spring基础】AOP概念与动态代理详解
一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...
- Kotlin——最详解的类(class)的使用
在任何一门面向对象编程的语言里,类(class)是非常基础.但也是非常重要的一项组成,通俗的说就是万般皆对象,而所说的对象就是我们生成的类.Kotlin也是如此,下面详细为大家介绍Kotlin中的类的 ...
- 详解 Arrays类
请关注本人博文--<详解 普通数组 -- Arrays类 与 浅克隆> Arrays类: 概述: 针对数组进行操作的工具类.它提供了对于数组的值的排序.查找等功能. 现在,本人来展示一下A ...
随机推荐
- 从零构建vue项目(三)--vue常用插件
一.直接拉取的模板中,package.json如下: { "name": "vuecli2-test", "version": " ...
- 深入理解java:2.1. volatile的使用及其原理
引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”. 可见性的意思是 ...
- 前端 CSS 盒子模型 目录
CSS盒子模型介绍 padding border属性
- vue点击除了某组件本身的其它地方, 隐藏该组件的方法
点击emoji表情标签, 出现标签组件,点击其它地方, 改组件消失的效果; <template> <div class="writeZoon"> <d ...
- [BZOJ 3456]城市规划(cdq分治+FFT)
[BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...
- POJ 3410 Split convex polygon(凸包)
题意是逆时针方向给你两个多边形,问你这两个多边形通过旋转和平移能否拼成一个凸包. 首先可以想到的便是枚举边,肯定是有一对长度相同的边贴合,那么我们就可以n2枚举所有边对,接下来就是旋转点对,那么假设多 ...
- P2217 [HAOI2007]分割矩阵
传送门 首先均方差公式: $\sigma = \sqrt{\sum_{i}^{K}\frac{(sum[i]-\bar{sum})^2}{n}}$ 其中 $\bar{sum}$ 为小矩阵的平均值,显然 ...
- TCP滑动窗体
TCP的滑动窗体攻克了端到端的流量控制问题,同意接受方对传输进行限制.直到它拥有足够的缓冲空间来容纳很多其他的数据.滑动窗体的大小由接收方确定,接收方在发送确认信号给发送方的同一时候告诉发送方自己的缓 ...
- 开发jquery插件小结
用jquery开发插件其实很简单.今天实现了一个入门级别的功能. 随便来个DIV,便于理解. div{ height:100px;width:100px;display:block;backgroun ...
- git Permanently added the RSA host key for IP address '13.250.177.223' to the list of known hosts.
只要把那个ip地址添加进hosts列表中就可解决. 参见:https://blog.csdn.net/hunhun1122/article/details/79752125