spring学习-AOP

简介: spring学习-AOP

概念

1、什么是 AOP

(1)面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

(2)简单理解就是:不通过修改源代码方式,在主干功能里面添加新功能

(3)从登录例子了解 AOP

底层原理

1、AOP 底层使用动态代理

(1)有两种情况动态代理

  • 第一种 有接口情况,使用 JDK 动态代理
    [创建接口实现类代理对象,增强类的方法]
  • 第二种 没有接口情况,使用 CGLIB 动态代理
    [创建子类的代理对象,增强类的方法]

AOP(JDK 动态代理)

1、使用 JDK 动态代理,使用 Proxy 类里面的方法创建代理对象

(1)调用 newProxyInstance 方法

方法有三个参数:

第一参数,类加载器

第二参数,增强方法所在的类,这个类实现的接口,支持多个接口

第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分

2、编写 JDK 动态代理代码

(1)创建接口,定义方法

public interface UserDao {

public int add(int a,int b);

public String update(String id);

}

(2)创建接口实现类,实现方法

public class UserDaoImpl implements UserDao {

@Override

public int add(int a, int b) {

return a+b;

}

@Override

public String update(String id) {

return id;

} }

(3)使用 Proxy 类创建接口代理对象

public class JDKProxy {

public static void main(String[] args) {

//创建接口实现类代理对象

Class[] interfaces = {UserDao.class};

// Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces,

new InvocationHandler() {

// @Override

// public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

// return null;

// }

// });

UserDaoImpl userDao = new UserDaoImpl();

UserDao dao =

(UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces,

new UserDaoProxy(userDao));

int result = dao.add(1, 2);

System.out.println(“result:”+result);

} }

//创建代理对象代码

class UserDaoProxy implements InvocationHandler {

//1 把创建的是谁的代理对象,把谁传递过来

//有参数构造传递

private Object obj;

public UserDaoProxy(Object obj) {

this.obj = obj;

}

//增强的逻辑

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws

Throwable {

//方法之前

System.out.println(“方法之前执行…”+method.getName()+" :传递的参

数…"+ Arrays.toString(args));

//被增强的方法执行

Object res = method.invoke(obj, args);

//方法之后

System.out.println(“方法之后执行…”+obj);

return res;

} }

AOP(术语)

1、连接点

2、切入点

3、通知(增强)

4、切面

AOP 操作(准备工作)

1、Spring 框架一般都是基于 AspectJ 实现 AOP 操作

(1)AspectJ 不是 Spring 组成部分,独立 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使

用,进行 AOP 操作

2、基于 AspectJ 实现 AOP 操作

(1)基于 xml 配置文件实现

(2)基于注解方式实现(使用)

3、在项目工程里面引入 AOP 相关依赖

4、切入点表达式

(1)切入点表达式作用:知道对哪个类里面的哪个方法进行增强

(2)语法结构: execution([权限修饰符] [返回类型] [类全路径] 方法名称 )

举例 1:对 com.atguigu.dao.BookDao 类里面的 add 进行增强

execution(* com.atguigu.dao.BookDao.add(…))

举例 2:对 com.atguigu.dao.BookDao 类里面的所有的方法进行增强

execution(* com.atguigu.dao.BookDao.* (…))

举例 3:对 com.atguigu.dao 包里面所有类,类里面所有方法进行增强

execution(* com.atguigu.dao.. (…))


AspectJ 注解

使用AspectJ实现AOP有两种方式:

  • 一种是基于XML的声明式AspectJ
  • 另一种是基于注解的声明式AspectJ。

基于XML的声明式AspectJ

1、创建类,在类里面定义方法

public class User {
 public void add() {
 System.out.println("add.......");
 } }

2、创建增强类(编写增强逻辑)

(1)在增强类里面,创建方法,让不同方法代表不同通知类型

//增强的类
public class UserProxy {
 public void before() {//前置通知
 System.out.println("before......");
 } }

3、进行通知的配置

(1)在 spring 配置文件中,开启注解扫描

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:context="http://www.springframework.org/schema/context" 
 xmlns:aop="http://www.springframework.org/schema/aop" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
 http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd 
 http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop.xsd">
 <!-- 开启注解扫描 -->
 <context:component-scan base￾package="com.atguigu.spring5.aopanno"></context:component-scan>

(2)使用注解创建 User 和 UserProxy 对象

(3)在增强类上面添加注解 @Aspect

//增强的类
@Component
@Aspect //生成代理对象
public class UserProxy {

(4)在 spring 配置文件中开启生成代理对象

4、配置不同类型的通知

(1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置

//增强的类

@Component

@Aspect //生成代理对象

public class UserProxy {

//前置通知

//@Before 注解表示作为前置通知

@Before(value = “execution(* com.atguigu.spring5.aopanno.User.add(…))”)

public void before() {

System.out.println(“before…”);

}

//后置通知(返回通知)

@AfterReturning(value = “execution(*

com.atguigu.spring5.aopanno.User.add(…))”)

public void afterReturning() {

System.out.println(“afterReturning…”);

}

//最终通知

@After(value = “execution(* com.atguigu.spring5.aopanno.User.add(…))”)

public void after() {

System.out.println(“after…”);

}

//异常通知

@AfterThrowing(value = “execution(*

com.atguigu.spring5.aopanno.User.add(…))”)

public void afterThrowing() {

System.out.println(“afterThrowing…”);

}

//环绕通知

@Around(value = “execution(* com.atguigu.spring5.aopanno.User.add(…))”)

public void around(ProceedingJoinPoint proceedingJoinPoint) throws

Throwable {

System.out.println(“环绕之前…”);

//被增强的方法执行

proceedingJoinPoint.proceed();

System.out.println(“环绕之后…”);

} }

5、相同的切入点抽取

//相同切入点抽取

@Pointcut(value = “execution(* com.atguigu.spring5.aopanno.User.add(…))”)

public void pointdemo() {

}

//前置通知

//@Before 注解表示作为前置通知

@Before(value = “pointdemo()”)

public void before() {

System.out.println(“before…”);

}

6、有多个增强类多同一个方法进行增强,设置增强类优先级

(1)在增强类上面添加注解 @Order(数字类型值),数字类型值越小优先级越高

@Component

@Aspect

@Order(1)

public class PersonProxy

7、完全使用注解开发

(1)创建配置类,不需要创建 xml 配置文件

@Configuration

@ComponentScan(basePackages = {“com.atguigu”})

@EnableAspectJAutoProxy(proxyTargetClass = true)

public class ConfigAop {

}


回到A级模块

AspectJ 配置文件

1、创建两个类,增强类和被增强类,创建方法

2、在 spring 配置文件中创建两个类对象

<!--创建对象--> 
<bean id="book" class="com.atguigu.spring5.aopxml.Book"></bean> 
<bean id="bookProxy" class="com.atguigu.spring5.aopxml.BookProxy"></bean>

3、在 spring 配置文件中配置切入点

<!--配置 aop 增强-->
<aop:config>
 <!--切入点-->
 <aop:pointcut id="p" expression="execution(* 
com.atguigu.spring5.aopxml.Book.buy(..))"/>
 <!--配置切面-->
 <aop:aspect ref="bookProxy">
 <!--增强作用在具体的方法上-->
 <aop:before method="before" pointcut-ref="p"/>
 </aop:aspect>
</aop:config>
相关文章
|
10天前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
10天前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
36 9
|
30天前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
37 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
15天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
27 1
|
30天前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
35 9
|
1月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
20 1
|
11天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
24 0
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
58 2
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
90 1
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
26 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现