一. 点睛

AOP:面向切面编程,是相对于OOP面向对象编程而言的。

Spring的AOP的存在目的是为了解耦。AOP可以让一组类共享相同的行为。在OOP中只能通过继承类和实现接口来实现,但是这样的缺点是会使代码的耦合度增加,且类继承只能为单继承,阻碍更多行为添加到一组类上,AOP的出现弥补了OOP的不足。

Spring支持AspectJ的注解式切面编程:

(1) 使用@Aspect注解在类上声明该类是一个切面。

(2) 使用@After,@Before,@Around定义建言(advice),可直接将拦截规则(切点)作为参数。

(3) 其中@After,@Before,@Around参数的拦截规则为切点(PointCut),为了使切点复用,可使用@PointCut专门定义拦截规则,然后在@After,@Before,@Around的参数中调用。

(4) 其中符合条件的每一个被拦截处为连接点(JoinPoint)。

下面将通过模拟记录操作的日志系统的实现来演示基于注解拦截和基于方法规则拦截两种方式。其中注解式拦截能够很好的控制要拦截的粒度和获得更加丰富的信息,Spring本身在事务处理(@Transaction)和数据缓存(@Cacheable等)上面都使用此种形式的拦截。

二. 示例

1. 添加spring aop支持以及AspectJ依赖。

org.springframework

spring-aop

${spring-framework.version}

org.aspectj

aspectjrt

1.8.6

org.aspectj

aspectjweaver

1.8.5

2. 编写拦截规则的注解

package org.light4j.sping4.base.aop;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface Action {

String name();

}

代码解释:

这里说下注解,注解本身是没有任何功能的,就和xml是一样的。注解和xml都是一种元数据,元数据即解释数据的数据,这就是所谓的配置。

(3). 编写使用注解的被拦截类

package org.light4j.sping4.base.aop;

import org.springframework.stereotype.Service;

@Service

public class DemoAnnotationService {

@Action(name="注解式拦截的add操作")

public void add(){}

}

(4). 编写使用方法拦截规则的被拦截类

package org.light4j.sping4.base.aop;

import org.springframework.stereotype.Service;

@Service

public class DemoMethodService {

public void add(){}

}

(5). 编写切面

package org.light4j.sping4.base.aop;

import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.annotation.After;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import org.aspectj.lang.reflect.MethodSignature;

import org.springframework.stereotype.Component;

@Aspect //①

@Component //②

public class LogAspect {

@Pointcut("@annotation(org.light4j.sping4.base.aop.Action)") //③

public void annotationPointCut(){};

@After("annotationPointCut()") //④

public void after(JoinPoint joinPoint) {

MethodSignature signature = (MethodSignature) joinPoint.getSignature();

Method method = signature.getMethod();

Action action = method.getAnnotation(Action.class);

System.out.println("注解式拦截 " + action.name()); //⑤

}

@Before("execution(* org.light4j.sping4.base.aop.DemoMethodService.*(..))") //⑥

public void before(JoinPoint joinPoint){

MethodSignature signature = (MethodSignature) joinPoint.getSignature();

Method method = signature.getMethod();

System.out.println("方法规则式拦截,"+method.getName());

}

}

代码解释:

①通过@Aspect注解声明该类是一个切面。

②通过@Component让此切面成为Spring容器管理的Bean。

③通过@Pointcut注解声明切面。

④通过@After注解声明一个建言,并使用@Pointcut定义的切点。

⑤通过反射可以获得注解上面的属性,然后做日志记录相关的操作,下面的相同。

⑥通过@Before注解声明一个建言,此建言直接使用拦截规则作为参数。

(6). 配置类

package org.light4j.sping4.base.aop;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration

@ComponentScan("org.light4j.sping4.base.aop")

@EnableAspectJAutoProxy //①

public class AopConfig {

}

代码解释:

①使用@EnableAspectJAutoProxy注解开启Spring对AspectJ的支持。

(7). 运行

package org.light4j.sping4.base.aop;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

public static void main(String[] args) {

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class); //1

DemoAnnotationService demoAnnotationService = context.getBean(DemoAnnotationService.class);

DemoMethodService demoMethodService = context.getBean(DemoMethodService.class);

demoAnnotationService.add();

demoMethodService.add();

context.close();

}

}

运行结果如下图所示:

(8). 源代码示例:

github地址:点击查看

码云地址:点击查看

打赏

微信扫一扫,打赏作者吧~欢迎关注人生设计师的微信公众账号

公众号ID:longjiazuoA

java aop设计_Spring4.x基础配置(三):Spring AOP相关推荐

  1. Spring AOP源码分析(六)Spring AOP配置的背后

    本篇文章主要对Spring AOP配置背后进行了哪些事情做下说明.还是如上类似的工程,在xml中AOP拦截配置如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 < ...

  2. Spring AOP源码分析(四)Spring AOP的JDK动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 本篇文章将会介绍上一个例子中的源码执行情况,从中熟悉整个SpringAOP的一些概念和接口设计. 首先整个SpringAOP的 ...

  3. 算法设计与分析基础第三版

    课后题答案 一.算法级基础知识 1.算法的基本概念 解决问题的确定方法和有限步骤称为算法,对于计算机科学来说,算法指的是对特定问题的求解步骤的一种描述,是若干条指令的有穷序列.并有以下特性:输入.输出 ...

  4. java 打印三维数组_Java基础第三天_数组

    1.定义一个函数,函数功能是动态提取int[]中元素的最大值. 2.定义一个函数,从数组中查询指定的元素首次出现的位置. 3.定义函数,完成冒泡排序,大数下沉. 4.折半查找. 5.阐述 6.定义一个 ...

  5. 三 java的基本数据类型_JAVA基础(三)--JAVA基本数据类型

    前两篇已经将开发环境搭建完成,如果你已经按之前的教程按部就班的完成了部署,那么世界上最优秀的编程语言之一和世界上最优秀的IDE之一已经出现在你的电脑上(此处应有掌声),如果你还没入门,或者正在台阶上踱 ...

  6. 无线路由器的基础配置(三)

    在网络的世界里没有绝对安全的网络,为了更多地了解都有哪些无线设备(网卡)正在或曾经访问过您的无线网络,您可以使用以下方法进行查看:单击"无线设置"--"主机状态" ...

  7. spring 使用XML配置开发Spring AOP

    XML方式开发AOP与注解开发原理是相同的,所以这里主要介绍一些用法即可.这里需要在XML中引入AOP的命名空间,所以先来了解一下AOP可配置的元素 代码清单:切面类 package com.ssm. ...

  8. Spring 源码分析(三) —— AOP(二)Spring AOP 整体架构

    2019独角兽企业重金招聘Python工程师标准>>> Spring AOP 架构         先是生成代理对象,然后是拦截器的作用,最后是编织的具体实现.这是AOP实现的三个步 ...

  9. java jdbc 链接pg_Java零基础教程

    今天就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容. 首先,给大家分享一张以 企业岗位需求为导向 Java工程师技能点图 根据 Java工程师技能点图,我们分为四个阶段: 第一阶段 :Jav ...

最新文章

  1. [百万级]通用存储过程.分页存储过程
  2. 企业网站建设|优秀的网站都是靠这些细节做成功的
  3. vue 表格内容跳转页面_Vue项目实战系列文章(一)项目预热
  4. 软件测试第四周作业WordCount优化
  5. Hibernate中使用Criteria查询及注解——(DeptTest.java)
  6. Java多线程学习二十:HashMap 为什么是线程不安全的
  7. git21天打卡Day1-linux下安装git
  8. linux 修改分辨率lcd_如何在Ubuntu 12.04中为LCD添加显示分辨率? xrandr问题
  9. TypeScript实战:下棋游戏
  10. python爬取网页美文网文章内容
  11. TUIO+激光投影互动
  12. 云服务器被恶意ddos攻击了怎么办?
  13. MATLAB超限邻域滤波
  14. 查看mysql数据库的定时任务_mysql数据库的定时任务
  15. 树莓派学习(三)基于OpenCv的人脸识别
  16. 新一代人工智能产业技术创新战略联盟和开放原子开源基金会举行战略合作签约仪式
  17. 如何进行生产环境作业监控
  18. Java Web实用开发技术(4)------在线编辑器
  19. 1102: 火车票退票费计算(函数专题)Python
  20. 计算机自动化专业学什么,机械制造计算机综合自动化是学什么的专业

热门文章

  1. 从零开始造一个“智障”聊天机器人
  2. 负载均衡集群介绍LVS介绍LVS调度算法LVS NAT模式搭建
  3. linux 和 、 区别
  4. Opencv实现多幅图片拼接在一起
  5. 1.7 LINUX启动流程
  6. javascript -- 判断是否为某个数据类型
  7. 大数据及hadooop简介
  8. windows 安装mysql的时候最后执行一直停留在Write configuration file
  9. DNN的Portal在站点(服务器)之间的迁移
  10. HTTP性能测试工具wrk安装及使用