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,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: ...
随机推荐
- 小型单文件NoSQL数据库SharpFileDB初步实现
小型单文件NoSQL数据库SharpFileDB初步实现 我不是数据库方面的专家,不过还是想做一个小型的数据库,算是一种通过mission impossible进行学习锻炼的方式.我知道这是自不量力, ...
- Hystrix框架4--circuit
circuit 在Hystrix调用服务时,难免会遇到异常,如对方服务不可用,在这种情况下如果仍然不停地调用就是不必要的,在Hystrix中可以配置使用circuit,当达到一定程度错误,就会自动调用 ...
- C# 服务程序 - 调试服务
前言:本篇文章环境是VS2015,win10.如果有任何的差别,请注意 1. 创建服务程序 1)用VC创建服务程序,叫做 MyTestWindowsService 创建完成之后,可以看到 2)添加安装 ...
- JavaWeb配置外部应用的两种方式
原来我们的项目放到webapps下,现在放到外面,也希望tomcat可以找到它!把应用放到tomcat之外,这就是外部应用了.应用已经不在tomcat中了,这时我们需要在tomcat中配置外部应用的位 ...
- Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构
Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 按照存储结构划分btree,hash,bitmap,fulltext1 1.2. 索引的类型 按查找 ...
- jsp 分页, 判断是第一页,和最后一页.
<% //页的行数 int pagesize =20; //当前页 int currentPage = 1; try { currentPage = Integer.parseInt(reque ...
- Logical read, Physical read (SET STATISTICS IO)
在查询性能优化时,Logical Read非常重要,它的计数一般与查询出来的结果集数量成正比,与数据读取的速度也成正比. 1,SET STATISTICS IO 显式Disk IO的信息 Syntax ...
- Constraint3:check约束 和 null
Check约束用以限制单列或多列的可能取值范围. 1,在check约束中(check(expression)),如果expression返回的结果是Unknown,那么check返回的结果是true. ...
- 《JS语言精粹》学习笔记 函数部分の闭包
要理解闭包,首先要理解变量作用域,变量的作用域就两种,全局变量和局部变量,函数内部可以直接读取全局变量,函数外部无法读取函数内部的局部变量. 闭包定义:能读取函数内部局部变量的函数就是闭包,而只有函数 ...
- Hibernate4.0之HibernateSessionFactory源码详解
import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.cfg.Conf ...