AOP:面向切面编程,相当于OOP面向对象编程。

Spring的AOP的存在目的是为了解耦,AOP可以让一组类共享相同的行为。

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

(1)使用@Aspect声明是一个切面

(2)使用@Afte、@Before、@Around定义通知/建言,可以直接将拦截规则(切点)作为参数。

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

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

eg:

 package com.wisely.heighlight_spring4.ch1.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; /**
*
* Makedate:2018年3月21日 下午1:01:48
* @author dong
* @version %I%, %G%
* @since 1.0
* 注解类(jdk1.5之后没设定特殊关键字而已)
* 功能:拦截规则的注解
* retention:保留 policy:政策 方针
*
*
**/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Action {
String name();
}
 package com.wisely.heighlight_spring4.ch1.aop;

 import org.springframework.stereotype.Service;

 @Service
public class DemoAnnotationService {
@Action(name="注解式拦截的add操作")
public String add() {
return "haha1";
}
}
 package com.wisely.heighlight_spring4.ch1.aop;

 import org.springframework.stereotype.Service;

 /**
*
* 编写使用方法规则被拦截类
*
* Makedate:2018年3月21日 下午3:08:39
* @author dong
* @version %I%, %G%
* @since 1.0
*
*
*/
@Service
public class DemomethodService {
public String add() {
return "hehe2";
}
}
 package com.wisely.heighlight_spring4.ch1.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 //让这个切面成为spring容器管理的Bean
public class LogAspect {
@Pointcut("@annotation(com.wisely.heighlight_spring4.ch1.aop.Action)") //注解声明切点
public void annotationPointCut() {}; @After("annotationPointCut()") //注解声明通知 并使用@PointCut定义的切点
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(* com.wisely.heighlight_spring4.ch1.aop.DemomethodService.*(..))")
//@Before声明一个通知 这个通知直接使用拦截规则作为参数
public void before(JoinPoint joinpoint) {
MethodSignature signature = (MethodSignature)joinpoint.getSignature();
Method method = signature.getMethod();
System.out.println("方法规则式拦截,"+method.getName());
}
}
 package com.wisely.heighlight_spring4.ch1.aop;

 import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy; @Configuration
@ComponentScan("com.wisely.heighlight_spring4.ch1.aop")
@EnableAspectJAutoProxy //开启spring对aspecJ的支持
public class AopConfig { }
 package com.wisely.heighlight_spring4.ch1.aop;

 import org.springframework.context.annotation.AnnotationConfigApplicationContext;

 public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class);
DemoAnnotationService demoAnnotationService = context.getBean(DemoAnnotationService.class);
DemomethodService demomethodService = context.getBean(DemomethodService.class);
String add = demoAnnotationService.add();
System.out.println("add---"+add); String add2 = demomethodService.add();
System.out.println("add2---"+add2);
context.close();
}
}

SpringBoot之AOP的更多相关文章

  1. Springboot的日志管理&Springboot整合Junit测试&Springboot中AOP的使用

    ==============Springboot的日志管理============= springboot无需引入日志的包,springboot默认已经依赖了slf4j.logback.log4j等日 ...

  2. SpringBoot学习笔记(七):SpringBoot使用AOP统一处理请求日志、SpringBoot定时任务@Scheduled、SpringBoot异步调用Async、自定义参数

    SpringBoot使用AOP统一处理请求日志 这里就提到了我们Spring当中的AOP,也就是面向切面编程,今天我们使用AOP去对我们的所有请求进行一个统一处理.首先在pom.xml中引入我们需要的 ...

  3. SpringBoot切面Aop的demo简单讲解

    前言 本篇文章主要介绍的是SpringBoot切面Aop的demo简单讲解. SpringBoot Aop 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 切面(Aop) 一.概 ...

  4. Spring全家桶——SpringBoot之AOP详解

    Spring全家桶--SpringBoot之AOP详解 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方 ...

  5. SpringBoot CGLIB AOP解决Spring事务,对象调用自己方法事务失效.

    对于像我这种喜欢滥用AOP的程序员,遇到坑也是习惯了,不仅仅是事务,其实只要脱离了Spring容器管理的所有对象,对于SpringAOP的注解都会失效,因为他们不是Spring容器的代理类,Sprin ...

  6. (办公)springboot配置aop处理请求.

    最近项目用到springboot,就是需要配置一些东西.比如用aop处理请求.方法前通知获取url,method,ip,类方法,参数,方法后通知,返回参数,而且还可以记录一下日志.下面是操作的代码. ...

  7. SpringBoot系列——aop 面向切面

    前言 项目中我们经常会用到aop切面,比如日志记录:这里简单记录一下springboot是如何使用aop spring对aop的配置,来自springboot参考手册,Common applicati ...

  8. SpringBoot使用AOP

    本文介绍SpringBoot中使用Spring AOP. 简介 AOP简介 AOP可能对于广大开发者耳熟能详,它是Aspect Oriented Programming的缩写,翻译成中文就是:面向切面 ...

  9. Spring全家桶系列–SpringBoot之AOP详解

    //本文作者:cuifuan //本文将收录到菜单栏:<Spring全家桶>专栏中 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关 ...

  10. SpringBoot配置Aop笔记【例子】

    众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...

随机推荐

  1. 再谈javascriptjs原型与原型链及继承相关问题

    什么是原型语言 只有对象,没有类;对象继承对象,而不是类继承类. “原型对象”是核心概念.原型对象是新对象的模板,它将自身的属性共享给新对象.一个对象不但可以享有自己创建时和运行时定义的属性,而且可以 ...

  2. Java IO和Java NIO 和通道 在文件拷贝上的性能差异分析

    1.  在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...

  3. spring boot + vue + element-ui全栈开发入门——前端编辑数据对话框

     需求 1.点击“添加”按钮,弹出录入数据的对话框窗口,并录入数据,如果数据有误则不允许提交.数据填写完毕后,点击“保存”按钮,调用http协议提交数据,提交完毕刷新页面数据.点击“取消”按钮关闭对话 ...

  4. caffe常用

    1. 关闭模型froward信息 os.environ[' #注意要在improt caffe之前 2. 学习率 step: 配合stepsize,迭代次数达到stepsize的整数倍改变一次, ba ...

  5. storm-sql-kafka问题情况

    首先上官方文档:http://storm.apache.org/releases/1.2.2/storm-sql.html 解决的问题 1.kafka版本不对 开始测试时采用storm1.2.2+ka ...

  6. 使用MSBuild Tools调用csproj项目文件发布网站时$(SolutionDir)宏参数值丢失为空的解决方案

    使用Visual Studio打开解决方案,对<网站项目>右键点击<发布>,一切都是正常的,所有宏都可用,宏参数值也是正确的. 而通过批处理脚本命令调用MSBuild.exe对 ...

  7. nodejs笔记之流(stream)

    nodejs的stream有四种流类型: 可读:Readable可写:Writable可读可写:Duplex操作被写入数据,然后读出结果:Transform常用事件:data:有数据可读时触发end: ...

  8. 《视觉SLAM十四讲课后作业》第二讲

    1.设线性⽅程 Ax = b,在 A 为⽅阵的前提下,请回答以下问题:1. 在什么条件下,x 有解且唯⼀? 非齐次线性方程在A的秩与[A|B]的秩相同时方程有解,当R(A)=R(A,B)=n时方程有唯 ...

  9. Laravel5.5学习笔记

    安装composer 下载安装脚本 php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php ...

  10. ldap集成bitbucket

    confluence ldap配置跟jira ldap集成一样,请参考:https://www.cnblogs.com/imcati/p/9378668.html 需在 Global permissi ...