spring入门(四)【面向切面编程】
开发过程中很多时候会用到日志、事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而面向切面编程则侧重于事务的一个方面。在面向切面编程过程中有几个比较重要的概念:切面、切点、连接点、通知,
通知:描述了切面要完成的工作,例如,要向某个方法注入日志功能,这里的日志功能就是通知;通知分为5种:Before、After、After-returning、After-throwing、Around
切点:定义了通知被应用的地方,如,某个类上的某个方法;例如,在test类的print方法;
切面:横切关注点被模块化的类,由通知和切点组成,换句话来说切面定义了要向目标程序注入的全部内容;规定了在目标方法上执行什么样的动作;
连接点:程序执行过程中切面可以被插入的一个点,如方法调用、成员变量初始化,在spring中只支持方法调用;
面向切面编程有两种实现方式,一种是预编译,另一种是动态代理,AspectJ属于预编译,springAOP属于运行期动态代理方式。spring实现了对AspectJ的支持。下面看springAOP和AspectJ的使用方式,
springAOP
这里使用配置文件的方式,实现springAOP,看配置文件,
<aop:config>
<!--声明一个切面类 可以有多个-->
<aop:aspect id="myAspect" ref="aspect">
<!--声明一个切点-->
<aop:pointcut id="point1" expression="execution(* com.cn.study.day6.Test.*(..))"/>
<!--通知-->
<aop:before method="before" pointcut-ref="point1" />
<aop:around method="around" pointcut-ref="point1"/>
</aop:aspect> </aop:config>
<!--配置切面类-->
<bean id="aspect" class="com.cn.study.day6.Aspect"></bean>
要配置AOP,在spring中使用了<aop:config>标签,在这个标签中可以配置多个切面标签(<aop:aspect>),每个切面代表了一种横切关注点,从前面的阐述中可以知道一个切面包含两部分,一个是切点,另一个是通知,在<aop:aspect>标签中定义切点(<aop:pointcut>)和通知(aop:before 前置通知),在切点中配置了通知被应用的位置,即匹配Test类的任何方法(execution(* com.cn.study.day6.Test.*(..))),在通知标签中配置了执行目标方法前通知,切点是point1;下面看具体的切面类,
package com.cn.study.day6; import org.aspectj.lang.ProceedingJoinPoint; //切面类
public class Aspect {
//前置通知调用的方法
public void before(){ System.out.println("我是前置通知!"); }
public Object around(ProceedingJoinPoint jp){
System.out.println("我是环绕通知!"); Object object=null;
try {
System.out.println("方法执行前");
object = jp.proceed();
System.out.println("方法执行之后");
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return object;
} }
切面类中的方法要和通知中method属性的方法名字保持一致,下面是目标方法,
package com.cn.study.day6; import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
@Component
public class Test { public void method1(){
System.out.println("业务方法!");
}
}
上面是一个简单的业务方法,
总结下这个切面类的含义,即在执行com.cn.study.day6.Test类中的任何方法之前都会首先执行com.cn.study.day6.Aspect切面类中的before方法,看打印结果,
我是前置通知!
业务方法!
结果显示首先执行了切面类中的before方法,然后执行的是目标类中的method1方法。
上面就完成了一个面向切面编程的例子,我们实现的是在方法被调用之前实现横切,那么面向切面编程到底有什么用处呢?我们在最后进行说明,接着看AspectJ
AspectJ
AspectJ是AOP的另一种实现,要使用AspectJ必须打开自动代理,如下
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
这是对AspectJ的自动代理,然后就可以使用AspectJ了,看下面的切面类
package com.cn.study.day7; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class AspectTest {
//前置通知调用的方法 通知
@Before("pointCut1()")
public void before(){ System.out.println("我是前置通知!"); }
//切点
@Pointcut("execution(* com.cn.study.day7.Test.*(..))")
public void pointCut1(){ } }
由于加了@AspectJ的类无法被自动识别,所以需要加载@Component注解,有了这两个注解之后,此类便是一个切面类了,在切面类里可以声明切点和通知,我们定义了一个pointCut1的切点,此方法的返回值必须是void,此切点对com.cn.study.day7.Test下的所有方法有效,接着使用@Before定义了一个前置通知,且使用的切点为pointCut1(),打印结果如下,
我是前置通知!
业务方法!
上面便完成了使用AspectJ的切面编程;另,在定义通知的之后也可以直接使用表达式(execution(* com.cn.study.day7.Test.*(..)))而不必引用某个切点,引用某个切点的好处是,在定义了切点之后可以复用。
综上,是两种实现AOP的配置,AOP的使用场景是在不破坏原有代码的基础上,增加新的功能,比如日志、事务控制,使用AOP可以很好地减少代码的侵入,在原有代码不变的基础上轻松实现日志、事务控制、权限控制等。这两种方式在实际开发过程当中使用的都很广泛,具体使用哪种方式可根据自己的情况而定。
有不足之处,欢迎指出!
spring入门(四)【面向切面编程】的更多相关文章
- Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...
- Spring之AOP(面向切面编程)_入门Demo
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...
- Spring AOP(面向切面编程)
一.AOP简介 1.AOP概念:Aspect Oriented Programming 面向切面编程 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 …… 3.情景举例 ①数学 ...
- Spring中的面向切面编程(AOP)简介
一.什么是AOP AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面 ...
- 程序员笔记|Spring IoC、面向切面编程、事务管理等Spring基本概念详解
一.Spring IoC 1.1 重要概念 1)控制反转(Inversion of control) 控制反转是一种通过描述(在java中通过xml或者注解)并通过第三方去产生或获取特定对象的方式. ...
- Spring AOP:面向切面编程,AspectJ,是基于spring 的xml文件的方法
导包等不在赘述: 建立一个接口:ArithmeticCalculator,没有实例化的方法: package com.atguigu.spring.aop.impl.panpan; public in ...
- Spring AOP:面向切面编程,AspectJ,是基于注解的方法
面向切面编程的术语: 切面(Aspect): 横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象 通知(Advice): 切面必须要完成的工作 目标(Target): 被通知的对象 代理(Pr ...
- Spring:AOP面向切面编程
AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...
- Spring框架 AOP面向切面编程(转)
一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...
- Spring的AOP面向切面编程
什么是AOP? 1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: ...
随机推荐
- 解决 Visual Studio 2017 RC 不兼容低版本 Visual Studio 创建的 MVC 4 项目的问题
1.使用文本编辑器(如Visual Studio Code 或 notepad)打开 MVC 4 项目的 .csproj 文件 2.找到代码(可能会有不同)<ProjectTypeGuids&g ...
- 移动APP服务端设计开发注意要点
2014年,移动APP的热度丝毫没有减退,怎么为您的移动端app设计良好的服务器端接口(API)呢? 下面谈谈我个人的一些想法. 2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站 ...
- com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK assets/com.xx.xx
完整的Error 信息(关键部分) Error:Execution failed for task ':fanwe_o2o_47_mgxz_dingzhi:transformResourcesWith ...
- SQL Server 自动增长过大
一.背景 我们遇到的问题如下图所示:自动增长无端端就按照这样的比例进行增长: (Figure1:问题所在) 尝试使用SSMS修改自动增长值,就会出现下面的错误: (Figure2:错误信息) 遇到上面 ...
- HTML5系列:HTML5结构
1. 主体结构元素 在HTML5中,为了使文档的结构更加清晰明确,增加几个与页眉.页脚.内容区块等文档结构相关联的结构元素. 1.1 article元素 article元素表示文档.页面或应用程序中独 ...
- Html 特殊符号
HTML特殊符号对照表 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 Α Α Α Β Β Β Γ Γ Γ Δ Δ Δ Ε Ε Ε Ζ Ζ Ζ Η Η Η Θ Θ Θ Ι Ι Ι Κ ...
- 字典 Key值转换为数组
public static string[] GetCategories() { Dictionary<string, int> itemMap = new Dictionary<s ...
- Create views of OpenCASCADE objects in the Debugger
Create views of OpenCASCADE objects in the Debugger eryar@163.com Abstract. The Visual Studio Natvis ...
- py2exe使用中遇到的几个问题
问题: 在使用py2exe对所写的python脚本打包成.exe可执行程序时,遇到两个问题: 问题1: RuntimeError: maximum recursion depth exceeded w ...
- 在.NET开发面向Oracle数据库的应用程序
其实这个不是一个什么新的话题.但是之前在多次项目中,总是遇到大家针对Oracle数据库的访问时,会有各种各样的问题,最基本的就是要在客户端安装各种client,版本不一样的话还有各种问题. 静下心来看 ...