AOP原理:

AOP,面向方面的编程,使用AOP,你可以将处理方面(Aspect)的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect。AOP可以防止代码混乱。AOP的应用范围包括:持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等。

AOP概念:

  — 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。

  — 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

  — 通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。

  — 切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。

  — 引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。

  — 目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。

  — AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。

  — 编织(Weaving):组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

通知类型:

  —  Around通知:包围一个连接点的通知,如方法调用。这是最强大的通知。Aroud通知在方法调用前后完成自定义的行为,它们负责选择继续执行连接点或通过返回它们自己的返回值或抛出异常来短路执行。

  —  Before通知:在一个连接点之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。

  —  Throws通知:在方法抛出异常时执行的通知。Spring提供强制类型的Throws通知,因此你可以书写代码捕获感兴趣的异常(和它的子类),不需要从Throwable或Exception强制类型转换。

  —  After returning通知:在连接点正常完成后执行的通知,例如,一个方法正常返回,没有抛出异常。

  Around通知是最通用的通知类型。大部分基于拦截的AOP框架(如Nanning和Jboss 4)只提供Around通知。

  如同AspectJ,Spring提供所有类型的通知,我们推荐你使用最为合适的通知类型来实现需要的行为。例如,如果只是需要用一个方法的返回值来更新缓存,你最好实现一个after returning通知,而不是around通知,虽然around通知也能完成同样的事情。使用最合适的通知类型使编程模型变得简单,并能减少潜在错误。例如,你不需要调用在around通知中所需使用的MethodInvocation的proceed()方法,因此就调用失败。

  切入点的概念是AOP的关键,它使AOP区别于其他使用拦截的技术。切入点使通知独立于OO的层次选定目标。例如,提供声明式事务管理的around通知可以被应用到跨越多个对象的一组方法上。 因此切入点构成了AOP的结构要素。

AOP的实现方式主要有两种:

第一种:配置文件中配置pointcut,在java中用编写实际的aspect 类,针对切入点进行相关的业务处理。

第一步编写目标对象类

 1 package com.aop;
2
3 public class CommonEmployee implements Employee{
4
5 private String name;
6
7 public String getName() {
8 return name;
9 }
10
11 public void setName(String name) {
12 this.name = name;
13 }
14
15 public void signIn() {
16 System.out.println("打印出了:"+name);
17 }
18 }

第二步编写通知类:

 1 package com.aop;
2
3 import java.util.Date;
4 import org.aspectj.lang.ProceedingJoinPoint;
5
6 public class Logger{
7
8 //spring中Before通知
9 public void logBefore() {
10 System.out.println("logBefore");
11 }
12
13 //spring中After通知
14 public void logAfter() {
15 System.out.println("logAfter");
16 }
17
18 //spring中Around通知
19 public Object logAround(ProceedingJoinPoint joinPoint) {
20 System.out.println("logAround开始"); //方法执行前的代理处理
21 Object[] args = joinPoint.getArgs();
22 Object obj = null;
23 try {
24 obj = joinPoint.proceed(args);
25 } catch (Throwable e) {
26 e.printStackTrace();
27 }
28 System.out.println("logAround结束"); //方法执行后的代理处理
29 return obj;
30 }
31
32 }

Spring配置:

 1 <bean id="employee" class="com.aop.CommonEmployee">
2 <property name="name" value="good"></property>
3 </bean>
4 <bean id="advice" class="com.aop.Logger" />
5 <aop:config >
6 <aop:aspect ref="advice">
7 <aop:pointcut id="pointcut" expression="execution(*com.aop.CommonEmployee.sign*(..))"/>
8 <aop:before method="logBefore" pointcut-ref="pointcut"/>
9 <aop:after method="logAfter" pointcut-ref="pointcut"/>
10 <aop:around method="logAround" pointcut-ref="pointcut"/>
11 </aop:aspect>
12 </aop:config>

编写测试类:

 1 package com;
2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 import com.aop.Employee;
7
8 public class Test {
9 public static void main(String[] args) throws Exception{
10 ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
11 Employee e = (Employee)act.getBean("employee");
12 e.signIn();
13
14 }
15 }

最后结果:

logBefore

logAround开始

打印出了:good

logAfter

logAround结束

第二种方式:

采用注解来做aop, 主要是将写在spring 配置文件中的连接点, 写到注解里面。

首先,在spring配置文件中加入如下配置(用来申明spring对@AspectJ的支持):

<aop:aspectj-autoproxy/>

如果你使用的是DTD,可以在Spring配置文件中加入如下配置来申明spring对@Aspect的支持:

<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />

目标对象类与上边一样

具体通知类如下:

 1 package com.aop;
2
3 import java.util.Date;
4
5 import org.aspectj.lang.ProceedingJoinPoint;
6 import org.aspectj.lang.annotation.After;
7 import org.aspectj.lang.annotation.Around;
8 import org.aspectj.lang.annotation.Aspect;
9 import org.aspectj.lang.annotation.Before;
10
11 /**
12 * 使用@Aspect 注解的类, Spring 将会把它当作一个特殊的Bean(一个切面),也就是
13 * 不对这个类本身进行动态代理
14 */
15 @Aspect
16 public class AspectJLogger {
17 /**
18 * 必须为final String类型的,注解里要使用的变量只能是静态常量类型的
19 */
20 public static final String EDP = "execution(*com.aop.CommonEmployee.sign*(..))";
21
22 @Before(EDP) //spring中Before通知
23 public void logBefore() {
24 System.out.println("logBefore");
25 }
26
27 @After(EDP) //spring中After通知
28 public void logAfter() {
29 System.out.println("logAfter");
30 }
31
32 @Around(EDP) //spring中Around通知
33 public Object logAround(ProceedingJoinPoint joinPoint) {
34 System.out.println("logAround开始"); //方法执行前的代理处理
35 Object[] args = joinPoint.getArgs();
36 Object obj = null;
37 try {
38 obj = joinPoint.proceed(args);
39 } catch (Throwable e) {
40 e.printStackTrace();
41 }
42 System.out.println("logAround结束"); //方法执行后的代理处理
43 return obj;
44 }
45 }

Spring配置

1  <aop:aspectj-autoproxy/>
2 <bean id="aspect" class="com.aop.AspectJLogger" />
3 <bean id="employee" class="com.aop.CommonEmployee">
4 <property name="name" value="good"></property>
5 </bean>

最后测试类和测试结果都一样的。

复习Spring第二课--AOP原理及其实现方式的更多相关文章

  1. spring MVC 及 AOP 原理

    SpringMVC工作原理https://www.cnblogs.com/xiaoxi/p/6164383.htmlspring MVC 原理https://blog.csdn.net/y199108 ...

  2. coding++:Spring 中的 AOP 原理

    为什么使用 AOP 如下场景: 现在有一个情景: 我们要把大象放进冰箱,步骤为:打开冰箱->放入大象->关闭冰箱 如果再把大象拿出来,步骤为:打开冰箱->拿出大象->关闭冰箱 ...

  3. 170511、Spring IOC和AOP 原理彻底搞懂

    Spring提供了很多轻量级应用开发实践的工具集合,这些工具集以接口.抽象类.或工具类的形式存在于Spring中.通过使用这些工具集,可以实现应用程序与各种开源技术及框架间的友好整合.比如有关jdbc ...

  4. 深入理解spring中的AOP原理 —— 实现MethodInterceptor接口,自已动手写一个AOP

      1.前言 AOP是面向切面编程,即“Aspect Oriented Programming”的缩写.面对切面,就是面向我们的关注面,不能让非关注面影响到我们的关注面.而现实中非关切面又必不可少,例 ...

  5. Spring框架的AOP技术(注解方式)

    1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...

  6. Spring 框架的AOP之注解的方式

    1. 环境搭建 1.1 导入 jar 包 Spring 框架的基本开发包(6个); Spring 的传统AOP的开发包 spring-aop-4.3.10.RELEASE org.aopallianc ...

  7. 复习Spring第一课--Spring的基本知识及使用

    关于Spring: spring容器是Spring的核心,该容器负责管理spring中的java组件, ApplicationContext ctx  = new ClassPathXmlApplic ...

  8. spring中的aop的xml配置方式简单实例

    aop,即面向切面编程,面向切面编程的目标就是分离关注点,比如:一个骑士只需要关注守护安全,或者远征,而骑士辉煌一生的事迹由谁来记录和歌颂呢,当然不会是自己了,这个完全可以由诗人去歌颂,比如当骑士出征 ...

  9. Spring 中常用注解原理剖析

    前言 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来配置 ...

随机推荐

  1. 用scanf_s判断输入数据是否合法

    用scanf_s判断输入数据是否合法 对用户输入的整数进行求和.当用户输入任意字符时,结束程序并打印结果. A. 用户可以输入整数和浮点数 B. 用户可以在同一行输入多个数字,数字之间可以是任意一个分 ...

  2. 熟悉 Bash 快捷键来提高效率

    Bash是GNU计划的一部分,是多数Linux发行版提供的默认Shell. Linux的精髓就在于命令行的高效,而学习命令行的第一步便是学习如何快速地输入命令. 其实包括Bash在内的多数Linux ...

  3. [MySQL数据库之记录的详细操作:增、改、删、单表查询、多表查询]

    [MySQL数据库之记录的详细操作:增.改.删.单表查询.多表查询] 记录详细操作 增.删.改 增: insert t1(字段1,字段2,字段3) values (值1,值2,值3), (值1,值2, ...

  4. jQuery的入口和jQurey的对象切换

    jQuery jQuery的导入 通过script标签的src属性,link标签是导入层叠样式表 jQuery和原生JS的入口函数 1.jQ在页面结构加载完毕就会执行 原生JS的入口函数是等图片.层叠 ...

  5. bashshell删除列

    删除所有空白列cat yum.log | awk '{$1=$2=$3=$4=null;print $0}'>>yum.log7删除文件中的所有空格sed -i s/[[:space:]] ...

  6. nginx rewite重定向详解及实例解析

    静态和动态最大的区别是是否调用数据库. 什么是rewrite 将浏览器发送到服务器的请求重写,然后再返回给用户. 就是修改url,提高用户体验 rewrite的用途 80强转443 (优化用户体验) ...

  7. unity UGUI填坑 之 HorizontalLayoutGroup 和 ContentSizeFitter配合使用

    今天在项目中遇到一个问题,我们的ui过来找我,问为什么Content里的Item显示的不完全 花了半个小时看了一下,发现个小小的坑,记录一下 这些属性是用来实现,Content下的Item的偏移和间隔 ...

  8. VMware vRealize Network Insight 6.2 发布 - 网络和安全可视化分析

    发现.优化应用安全性和网络连接解决方案并对其进行故障排除 VMware vRealize Network Insight 可帮助您跨混合和多云环境构建经过优化且高度可用的安全网络基础架构.它提供了网络 ...

  9. C 语言通用模板队列

    前言 嵌入式开发过程中,各个模块之间,各个设备之间进行交互时,都会存在数据的输入输出,由于处理的方式不同,数据不会立即同步处理,因此通常在设计时都会设计缓冲区进行数据的处理,方式数据丢失等问题:一个项 ...

  10. Log4j实战,依赖分析

    背景 在项目中经常被log4j的各种依赖冲突搞的焦头烂额,久病成良医啊,在这里记录一下我对log4j的理解与分析 log4j 与 log4j2 log4j2是log4j的升级版,二者互不兼容,据说lo ...