springBoot AOP学习(一)

AOP学习(一)

1.简介

  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本身在事务处理(@Transcational)和数据缓存(@Cacheable)等都使用此种形式的拦截。

2.示例

(1)新建springboot项目,在pom.xml文件中添加spring aop  以及支持AspectJ 依赖

<dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-aop</artifactId>    <version>4.3.9.RELEASE</version></dependency><dependency>    <groupId>org.aspectj</groupId>    <artifactId>aspectjrt</artifactId>    <version>1.6.11</version></dependency><dependency>    <groupId>org.aspectj</groupId>    <artifactId>aspectjweaver</artifactId>    <version>1.6.11</version></dependency>

(2)注解拦截,编写拦截规则的注解
/** * 自定义拦截规则注解 */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Action {    String name();}

(3)编写使用注解拦截的 业务类
/** * 使用注解的被拦截类 */@Servicepublic class DemoAnnotationService {

@Action(name="注解式拦截的add操作")    public void add(){}}(4)编写使用方法规则拦截的 业务类
/** * 使用方法规则的被拦截类 */@Servicepublic class DemoMethodService {    public void add(){}}

(5)编写切面
/** * 切面 */@Aspect//注解声明一个切面@Component//让切面成为Spring容器管理的Beanpublic class LoginAspect {

//通过@Pointcut注解声明切点    @Pointcut("@annotation(com.wenhuang.springboot.aop.Action)")    public void annotationPointCut(){};

//通过@After 注解声明一个通知,并使用@Pointcut定义切点    @After("annotationPointCut()")    public void after(JoinPoint joinPoint){        MethodSignature signature = (MethodSignature)joinPoint.getSignature();        Method method =signature.getMethod();        Action action =method.getDeclaredAnnotation(Action.class);        System.out.println("注解式拦截,"+ action.name());//通过反射获取注解上的属性    }

//通过@Before 注解声明一个通知,直接使用拦截器规则作为参数    @Before("execution(* com.wenhuang.springboot.aop.service.DemoMethodService.*(..))")    public void before(JoinPoint joinPoint){        MethodSignature signature=(MethodSignature)joinPoint.getSignature();        Method method =signature.getMethod();        System.out.println("方法规则式拦截,"+method.getName());    }}
(6)配置类
@Configuration@ComponentScan("com.wenhuang.springboot.aop")@EnableAspectJAutoProxy  //使用该注解开启Spring对AspectJ代理的支持public class AopConfig {}
(7)运行
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);        demoAnnotationService.add();        demoMethodService.add();        context.close();    }}

结果如下



原文地址:https://www.cnblogs.com/wenhuang/p/9780269.html

时间: 2024-08-01 08:13:29

springBoot AOP学习(一)的相关文章

Spring IOC及AOP学习总结

一.Spring IOC体系学习总结: Spring中有两个容器体系,一类是BeanFactory.另一类是ApplicationContext.BeanFactory提供了基础的容器功能.ApplicationContext则是基于BeanFactory建立的一套更加丰富的容器体系,基于ApplicationContext构建了Spring AOP体系(基于AOP体系又构建了声明式事务模型),I18n的支持,基于观察者模式的事件模型,多渠道的Bean资源的载入(比如从文件系统,从interne

Spring AOP 学习例子

http://outofmemory.cn/code-snippet/3762/Spring-AOP-learn-example 工作忙,时间紧,不过事情再多,学习是必须的.记得以前的部门老大说过:“开发人员不可能一天到晚只有工作,肯定是需要自我学习.第一:为了更充实自己,保持进步状态.第二:为了提升技术,提高开发能力.第三:保持程序员对技术和学习的热情,工作的激情.程序员还是需要把基础打扎实,修炼自己的内功.” 所以赶紧把学习的东西总结一下,加深印象.之前有说了下AOP的原理 (http://

Springboot 框架学习

Springboot 框架学习 前言 Spring Boot是Spring 官方的顶级项目之一,她的其他小伙伴还有Spring Cloud.Spring Framework.Spring Data等等. 简介 Spring Boot可以轻松创建单独的,基于生产级的Spring应用程序,您需要做的可能"仅仅是去运行". 我们提供了Spring Platform对Spring 框架和第三方库进行处理,尽可能的降低使用的复杂度.大多数情况下Spring Boot应用只需要非常少的配置. Fe

Spring入门IOC和AOP学习笔记

Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容器中Bean之间的依赖关系,使用一种叫做"依赖注入"的方式来管理bean之间的依赖关系. Spring有两个核心接口:BeanFactory和ApplicationContext,ApplicationContext是BeanFactory的子接口.它们都可以代表Spring容器,Spri

springboot + aop + Lua分布式限流原理解析

一.什么是限流?为什么要限流?不知道大家有没有做过帝都的地铁,就是进地铁站都要排队的那种,为什么要这样摆长龙转圈圈?答案就是为了 限流 !因为一趟地铁的运力是有限的,一下挤进去太多人会造成站台的拥挤.列车的超载,存在一定的安全隐患.同理,我们的程序也是一样,它处理请求的能力也是有限的,一旦请求多到超出它的处理极限就会崩溃.为了不出现最坏的崩溃情况,只能耽误一下大家进站的时间. 限流是保证系统高可用的重要手段!!! 由于互联网公司的流量巨大,系统上线会做一个流量峰值的评估,尤其是像各种秒杀促销活动

SpringBoot框架学习(一)

我没什么时间来认认真真写一个系列,只能把日常学到的东西总结巩固一下. 这篇内容: 1.自我理解的SpringBoot使用感悟. 2.一些注解的理解. 3.restful风格 4.微服务与SpringCloud 1.SpringBoot使用感悟 SpringBoot框架我才刚刚实现hello world!的程度,但是在学习该框架的过程中我对Spring框架以及注解技术有了更深层次的理解. Spring框架的控制反转.AOP在极大的减小了开发压力,实用配置文件设置依赖关系既实现了解耦,也提高了开发效

springboot+aop切点记录请求和响应信息

本篇主要分享的是springboot中结合aop方式来记录请求参数和响应的数据信息:这里主要讲解两种切入点方式,一种方法切入,一种注解切入:首先创建个springboot测试工程并通过maven添加如下依赖: 复制代码 org.springframework.boot spring-boot-starter-aop com.alibaba fastjson 1.2.44 复制代码 先来说方法的切点方式,需要创建个名为LogAspect的组件类,然后用@Aspect注解修饰组件类,再通过设置方法切

AOP学习笔记一

软件开发的目的是为了解决各种需求,包括业务需求和系统需求.目前,业界通过使用面向对象的编程思想,已经可以对业务需求等普通关注点进行很好的抽象与封装,并且使之模块化.但是对于系统需求一类的关注点来说,情况却有所不同.对于业务需求而言,需求与其具体实现之间的关系基本上是一对一的.我们可以在系统中的某一个确定的点找到针对需求的实现,无论是开发还是维护,都比较方便.但是系统需求,比如记录日志.事务管理等系统需求,它们往往在系统的各处散落.我们需要找到一种更好的方式来解决这类系统需求,这种软件开发模式就是

AOP学习心得&amp;jdk动态代理与cglib比较

什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合.当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系.例如日志功能.日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无