Spring与AOP-day03

1.1 AOP概述

1.1.1 AOP简介

AOPAspect Orient Programming,面向切面编程。是一种概念,是一种思想,其实现者很多,Spring就是实现者之一

AOPOOP的一种补充。OOP是从静态角度考虑程序的结构,而AOP是动态角度考虑程序的运行过程。

Spring用于降低耦合度。IOC用于降低主业务逻辑之间的耦合度;AOP用于降低主业务逻辑与系统级服务(交叉业务逻辑)间的耦合度,将系统级服务在运行时织入到主业务逻辑之中。

SpringAOP的底层工作原理,是使用动态代理对主业务进行增强。而动态代理使用的是JDKProxyCGLIB两种动态代理。

1.1.2 AOP相关概念

(1) 切面Aspect

切面就是交叉业务逻辑,就是要对主业务进行增强的部分AOP编程中常见的切面有两种:通知(advice)、顾问(advisor)。

(2) 织入(Weaving

将切面切入到主业务逻辑中的过程,称为织入。

(3) 连接点(JoinPoint

可以织入切面的目标类中的目标方法,称为连接点。

(4) 切入点(Pointcut

真正织入切面的目标类的目标方法,称为切入点。切入点一定是连接点。

(5) 目标对象(Target

用于被增强的对象,称为目标对象。

目标类的对象,就是目标对象。

主业务逻辑所在的类的对象,就是目标对象。

(6) 通知(Advice

是一种切面,可以完成简单的织入功能。例如,可以指定织入的时间点。

通知可以指定织入的时间点,切入点指定的是织入的位置。

(7) 顾问(Advisor

是另一种切面,可以完成更复杂的织入功能。其包装了通知。

(8) 引入(Introduction

也是一种切面,用于完成的功能是,在不修改目标类的前提下,为目标对象增加新的功能。

1.2 通知Advice

1.2.1 编程环境搭建

导入两个Jar包:

AOP联盟:

 

 

SpringAOP的实现:

 

 

1.2.2 前置通知MethodBeforeAdvice

 

 

 

1.2.3 后置通知AfterReturningAdvice

 

 

容易忽略If条件语句

1.2.4 环绕通知MethodInterceptor

 

 

 

 

1.2.5 异常通知ThrowsAdvice

 

 

(1) 异常复习

 

 

(2) 异常的典型应用

A、  异常通知

 

 

 

B、 Exception
a、 UserException

 

 

b、 UsernameException
c、 PasswordException
C、 Service
a、 someServiceImpl

 

 

 

b、 ISomeService

 

 

D、 Test

 

 

1.2.6 为应用指定多个配置文件

 

 

1.2.7 无接口时使用CGLIB

1.有接口,默认使用proxy

 

 

 

 

1.2.8 无接口时使用CGLIB

 

 

 

1.3 顾问Advisor

Advisor是另外一种切面,其包装了Advice

 

 

这两个东西是重要内容

 

 

 

1.3.1 PointcutAdvisor切入点顾问

切入点顾问。用于指定切入织入的位置,即要将切面织入到哪个目标方法。

 

 

(1) 自定义切入点顾问

需求,someservice中,前2个有植入,otherservice中无植入

 

 

 

 

 

先继承PointcutAdvisor,继承父类3个方法,定义两个成员变量,添加set方法

 

A、 切入点

 

 

上面两类的get方法需要手动赋值,否则会发生空指针异常

B、 定义类过滤器

 

 

C、 定义方法匹配器

 

 

 

完整的配置文件

 

 

(2) 名称匹配方法切入点顾问

 

 

 

 

简单方法名

Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'advice' of bean class [org.springframework.aop.support.NameMatchMethodPointcut]: Bean property 'advice' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

(3) 正则表达式方法切入点顾问

 

 

 

 

1.3.2 IntroductionAdvisor引入顾问(导言顾问)

引入顾问。在不修改目标类的前提下,为目标对象增加新的功能。

 

 

 

 

1.4 自动代理生成器

jdkProxy只能一次为一个目标对象生成一个代理,为多个目标对象生成代理,

则需要配置多个ProxyFactoryBean标签,使配置文件变得臃肿

 

1.4.1 默认Advisor自动代理生成器

 

 

1.4.2 Bean名称自动代理生成器

 

 

1.5 AspectJAOP的实现

1.5.1 AspectJ概述

(1) 什么是AspectJ

AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件

(2) AspectJSpringAOP的关系

AspectJ是另外一个框架,与Spring没有任何关系。但,AspectJSpring都是AOP的实现者。

下面要讲述的是:基于Spring环境下的AspectJAOP的实现。

(3) AspectJ的通知

前置通知

后置通知

环绕通知

异常通知

最终通知

(4) 切入点表达式

用于指定切入点。

execution(

访问权限

返回值类型

全限定性类名(接口名)

方法名(参数列表)

抛出异常

)

execution( * com.abc.service.*.*(..)):表示com.abc.service包下的所有方法都是切入点。

execution( * com.abc.service.*.open*(..)):表示com.abc.service包下的所有以open开头的方法都是切入点。

execution( * *.service.*.*(..)):表示service包(该service包前只能有一级父包)下的所有方法都是切入点。  

com.service.ISomeService.doFirst()是匹配的。

com.abc.service.ISomeService.doFirst()是不匹配的。

execution( * *..service.*.*(..)):表示service包(该service包前可以有任意级的父包)下的所有方法都是切入点。

com.service.ISomeService.doFirst()是匹配的。

com.abc.service.ISomeService.doFirst()也是匹配的。

1.5.2 搭建AspectJ编程环境

(1) 导入Jar

除了Spring基本的Jar包外,还需要四个Jar包:

l AspectJ的核心Jar

l SpringAspectJ整合的Jar

l AOP联盟的Jar

l SpringAOP的实现Jar

(2) 引入aop约束

 

 

(3) 注册AspectJ自动代理生成器

 

1.5.3 基于注解的AspectJ编程

 

 

 

 

 

 

1.5.4 基于XMLAspectJ编程

 

 

posted @ 2018-08-29 00:31  深沉有点事  阅读(150)  评论(0编辑  收藏  举报