Spring 框架学些(二)Spring AOP

关于AOP

AOP,面向切面编程是OOP之后出现的概念(大概)。

面向对象基本上就是针对类来设计代码,类中定义方法,逻辑中调用不同的类中不同的方法构成业务。

切面

而面向切面中的切面到底是什么。在业务逻辑中,我们会分很多不同的模块,也有不同的类,而这些类的一些方法中,有一些共性功能。比如认证、日志、限流等功能,在各个模块都需要,那每一个功能可以被认为是一个切面。

类似一个三明治,面包、火腿、菜叶、番茄等等每一层都是一个功能模块,一刀切下去这个切面贯穿整个三明治各层,这一刀就形成一个切面,而这个切面就可以是比如日志功能。这是我的理解。

术语

三个术语,不初步看一下后面看的时候就会一头雾水。

  • pointcut - 这个可以理解为一个定义,他定义了一个切面(Aspect) 切在哪。实际上是一个表达式,程序中和表达式匹配的地方,切面里的动作会被执行。
  • Advice - 建议?实际就是指切面定义的某个动作
  • joinpoint - 这代表了一个实际的结合点,即一个被pointcut匹配到的模块中的方法。

我们定义一个或多个切面(Aspect),切面中有各种需要执行的方法(Advice,如记录日志,认证请求),每个Advice又有一个pointcut定义这个Advice应该再什么地方执行。而当功能模块的某个方法,匹配到一个pointcut定义时,该pointcut对应的Advice就会介入执行,这就是一个joinpoint

Spring AOP

对应AOP概念,Spring AOP主要做这几件事

  • 定义一个Aspect
  • 定义Aspect中的pointcut和Advice
  • 定义被执行的joinpoint

Aspect

和Spring Core中对bean的定义类似,也分为注解方式和配置文件方式(Spring里目前看到基本上所有相关功能都包含注解和配置文件两种配置方式)。

注解方式需要:

  • 在Aspect类上标注@Aspect
  • 在配置文件中使能<aop:aspectj-autoproxy />,这样Aspect才能找到对应的joinpoint
  • 配置该Aspect为一个bean(似乎@Aspect注解并不会被识别为bean?)

配置方式好像不太是Spring推荐的方式了这里贴一个完整配置,其中定义了Aspect、pointcut表达式、Advice。

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/aop/
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

	<!-- We don‘t need to this; This is required only in annotation based AOP support -->
	<!-- <aop:aspectj-autoproxy /> -->

	<aop:config>

		<!-- Spring AOP Pointcut definitions -->
		<aop:pointcut id="loggingOperation"
			expression="execution(* com.howtodoinjava.demo.aop.EmployeeManager.*(..))" />

		<aop:pointcut id="transactionOperation"
			expression="execution(* com.howtodoinjava.demo.aop.EmployeeManager.getEmployeeById(..))" />

		<!-- Spring AOP aspect 1 -->
		<aop:aspect id="loggingAspect" ref="loggingAspectBean">

			<!-- Spring AOP advises -->
			<aop:before pointcut-ref="loggingOperation" method="logBefore" />
			<aop:after pointcut-ref="loggingOperation" method="logAfter" />

		</aop:aspect>

		<!-- Spring AOP aspect 2 -->
		<aop:aspect id="transactionAspect" ref="transactionAspectBean">
			<aop:before pointcut-ref="transactionOperation" method="getEmployeeById" />
		</aop:aspect>

	</aop:config>

	<!-- Spring AOP aspect instances -->
	<bean id="loggingAspectBean" class="com.howtodoinjava.demo.aop.EmployeeCRUDLoggingAspect" />
	<bean id="transactionAspectBean" class="com.howtodoinjava.demo.aop.EmployeeCRUDTransactionAspect" />

	<!-- Target Object -->
	<bean id="employeeManager" class="com.howtodoinjava.demo.aop.EmployeeManagerImpl" />

</beans>

pointcut和Advice

一个简单的例子:

    @Before("execution(* EmployeeManager.*(..))")
    public void logBefore(JoinPoint joinPoint)
    {
        System.out.println("EmployeeCRUDAspect.logBeforeV2() : " + joinPoint.getSignature().getName());
    }

logBefore方法就是一个Advice(要执行的动作),他是一个Before类型的Advice,会在pointcut指定位置之前执行。

这个Advice对应的pointcut就是("execution(* EmployeeManager.*(..))")这句,标识匹配的方法时EmployeeManagerpacakge下的所有方法,方法参数和返回值都不限,匹配的是这个方法的执行。

Advice除了Before,还有After - 执行后、Around - 方法执行前后、 AfterReturn - 方法正常结束、 AfterThrowing - 方法抛出异常时执行时。

pointcut除了execution也有多种表达式方式,比如匹配一个包中的所有方法within(packagename.xxx),匹配一个beanbean(beanNamexxx)等。

被执行的joinpoint

只要是普通的bean即可,譬如@Component, @Controller等。在bean上不需要任何额外的定义,只要符合pointcut,相应的advice就会执行。

这也体现了Spring的涉及思路,非侵入式,减少依赖。

如果需要做日志,那么定义好Aspect就好,不需要动相应的组件代码

原文地址:https://www.cnblogs.com/mosakashaka/p/12609089.html

时间: 2024-08-02 05:07:47

Spring 框架学些(二)Spring AOP的相关文章

Spring框架深入(二)--AOP面向切面

一.AOP概述 1.AOP:面向切面编程,实现在不增加代码的基础上,增加一些新的功能(公共功能): 2.AOP并不是Spring框架持有的,Spring只是支持AOP编程的框架之一,可以整合第三方框架来实现面向切面编程(如:Aspect): 3.现实的应用场景:使用面向切面编程,AOP框架已经实现了面向切面的很多内容: 4.程序员使用AOP要做的事情: 编写公共功能,切面: 基于AOP框架的配置,直接把核心业务和切面关联起来: 5.Spring中实现AOP的方式有三种: 基于AspectJ注解的

Spring框架学些(三)SpringBoot

关于SpringBoot SpringBoot官方简介: Spring Boot makes it easy to create stand-alone, production-grade Spring-based Applications that you can run. We take an opinionated view of the Spring platform and third-party libraries, so that you can get started with

Spring框架初识(二)

1. AOP的相关概念       1.1 AOP概述         1.1.1 什么是AOP             AOP:全程是Aspect Oriented Programming 即面向切面编程.是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了

spring框架学习(二)依赖注入

转自:http://blog.csdn.net/lishuangzhe7047/article/details/20740835 ———————————————————————————————————————————— spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.接口注入不作要求,下面介绍前两种方式. 1,set注入 采用属性的set方法进行初始化,就成为set注入. 1)给普通字符类型赋值. [java] view plaincopyprint? pub

spring框架学习(六)AOP

spring框架学习(六)AOP AOP(Aspect-OrientedProgramming)面向方面编程,与OOP完全不同,使用AOP编程系统被分为方面或关注点,而不是OOP中的对象. AOP的引入 在OOP面向对象的使用中,无可避免的会出现代码重复,而且使用面向对象的编程方式,这种重复无法避免,比如用户权限判断中,根据相应的权限执行相应的方法:在servlet中设置编码格式时,同样相同的代码出现很多次,而且还根业务无关,很容易忘记写,结果运行的时候就出现乱码拉.这种重复代码不仅使编码麻烦,

Spring 框架的概述以及Spring中基于XML的IOC配置

Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器.框架.一站式 优势: 方便解耦:做到编译期不依赖,运行期才依赖 AOP的支持 声明式事务的支持 方便程序的测试 方便整合各种框架 降低JavaEE API的使用难度 Spring源码很厉害 解耦: 耦合包括:类之间的和方法之间的 解决的思路: 在创建对象的时候用反射来创建,而不是new 读取配置文件

Spring框架笔记(二十三)——基于配置文件的方式来配置 AOP

配置实现IOC功能时,我们采用了配置文件xml和注解两类方式实现.实现AOP功能时我们也可以使用两种方式.前面我们介绍了AOP基于注解的实现方式,本文我将采用基于配置文件的方式完成从原始对象bean.切面bean.切点及通知配置的方法. 用基于 XML 的配置声明切面 除了使用 AspectJ 注解声明切面, Spring 也支持在 Bean 配置文件中声明切面. 这种声明是通过 aop schema 中的 XML 元素完成的. 正常情况下, 基于注解的声明要优先于基于 XML 的声明. 通过

Spring框架 之IOC容器 和AOP详解

主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置  一.Spring开源框架的简介  Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开

Spring框架学习(9)AOP技术理解与使用

内容源自:AOP技术理解与使用 一.什么是AOP? aop技术是面向切面编程思想,作为OOP(面向对象编程)的延续思想添加到企业开发中,用于弥补OOP开发过程中的缺陷而提出的编程思想. AOP底层也是面向对象:只不过面向的不是普通的Object对象,而是特殊的AOP对象.AOP的关注点是组成系统的非核心通用服务模块(比如登录检查等),相对于普通对象,aop不需要通过继承.方法调用的方式来提供功能,只需要在xml文件中以引用的方式,将非核心服务功能引用给需要改功能的核心业务逻辑对象或方法中.最终实