IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringAOP的概述与实现 -> 正文阅读

[Java知识库]SpringAOP的概述与实现

目录

SpringAOP的概述

什么是AOP

AOP能干什么

AOP的特点

AOP底层实现

AOP基本概念

连接点

切入点

通知

切面

目标对象

织入

引入

谈谈你对AOP的理解?

SpringAOP的实现

依赖引用

spring.xml配置

注解实现

1.定义切面 设置通知

2.开启aop

3.测试

xml实现

1.写切面类

2.配置aop相关配置

3.测试


SpringAOP的概述

什么是AOP

????????Aspect oriented Programing面向切面编程,相比较oop 面向对象编程来说,Aop关注的不再是程序代码中某个类,某些方法,而aop考虑的更多的是一种面到面的切入,即层与层之间的一种切入,所以称之为切面。如:大家吃的汉堡(中间夹肉)。

AOP能干什么

????????AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面,实现公共功能性的重复使用。

AOP的特点

  1. 降低模块与模块之间的耦合度,提高业务代码的聚合度(高内聚低耦合)
  2. 提高了代码的复用性
  3. 提高系统的扩展性。(高版本兼容低版本)
  4. 可以在不影响原有的功能基础上添加新的功能

AOP底层实现

????????动态代理(JDK与CGLIB)

AOP基本概念

连接点

????????被拦截到的每个点,spring中指被拦截到的每一个方法,spring aop一个连接点即代表一个方法的执行。

切入点

????????对连接点进行拦截的定义(匹配规则定义规定拦截哪些方法,对哪些方法进行处理),spring有专门的表达式语言定义。
?

通知

????????拦截到每一个连接点即(每一个方法)后所要做的操作

  1. 前置通知(前置增强)- before()执行方法前通知
  2. 返回通知(返回增强)- afterReturn方法正常结束返回后的通知
  3. 异常抛出通知(异常抛出增强)- afetrThrow()
  4. 最终通知- after无论方法是否发生异常,均会执行该通知。
  5. 环绕通知– around包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。

切面

????????切入点与通知的结合,决定了切面的定义,切入点定义了要拦截哪些类的哪些方法,通知则定义了拦截过方法后要做什么,切面则是横切关注点的抽象,与类相似,类是对物体特征的抽象,切面则是横切关注点抽象。

目标对象

? ? ? ? 被代理的对象

织入

????????将切面应用到目标对象并生成代理对象的这个过程即为织入

引入

????????在不修改原有应用程序代码的情况下,在程序运行期为类动态添加方法或者字段的过程称为引入

谈谈你对AOP的理解?

  1. Aop是面向切面编程,Aop关注的不再是程序代码中某个类,某些方法,而是层与层之间的一种切入
  2. 应用于日志记录,性能统计,安全控制,事务处理等方面,实现公共功能性的重复使用
  3. 作用:降低模块与模块之间的耦合度,提高业务代码的聚合度,提高了代码的复用性,可以在不影响原有的功能基础上添加新的功能
  4. ??动态代理(JDK与CGLIB)实现AOP

SpringAOP的实现

依赖引用

<dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
</dependency>

spring.xml配置

xmlns:aop="http://www.springframework.org/schema/aop"

http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd

注解实现

1.定义切面 设置通知

package com.lsf.aspect;



import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 定义切面
 *  定义 切入点 与 通知 的结合
 *
 */

@Component  //将该类交给IOC实例化
@Aspect   //声明此类为切面类
public class LogCut {

/**
 * 定义切入点
 *      通过Pointcut定义规则
 *      @Pointcut("execution(* com.lsf.service.*.*(..))")   com.lsf.service下所有方法
 *      例:
 *      1,拦截所有方法
 *      @Pointcut("execution(* *(..))")
 *
 *      2,拦截所有公共的set方法方法
 *      @Pointcut("execution(public set*(..))")
 *
 *
 *  *
 *  *
  */
    @Pointcut("execution(* com.lsf.service.*.*(..))")
    public void cut(){

    }
    /**
     * 前置通知,引用在切入点
     *  在目标方法调用前
     */


    @Before(value = "cut()")
    public void before(){
        System.out.println("这是一个前面通知");

    }

    /**
     * 返回通知,引用在切入点
     *  在目标方法无异常返回时输出
     */
    @AfterReturning(value = "cut()")
    public void afterReturn(){
        System.out.println("返回通知");
    }

    /**
     * 最终通知,引用在切入点
     *  在目标方法是否异常 ,都输出
     */
    @After(value = "cut()")
    public void after(){
        System.out.println("最终通知");
    }

    /**
     * 异常通知,引用在切入点
     *  在目标方法发生异常时 ,都输出
     */
    @AfterThrowing(value = "cut()",throwing = "e")
    public void afterThrow(Exception e){
        System.out.println("异常通知:异常原因:  ");
    }

    /**
     * 环绕通知,引用在切入点
     *  在目标方法发生异常时 ,都输出
     */
    @Around(value = "cut()")
    public Object around(){
        System.out.println("前置通知");
        Object result = null;
        try {
            System.out.println("返回通知");

        }catch (Exception e){
        e.printStackTrace();
            System.out.println("异常通知");
        }catch (Throwable throwable){
            throwable.printStackTrace();
        }finally {
            System.out.println("最终通知");
        }
       
        return result;
    }


}

2.开启aop

  <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

3.测试

package com.lsf;


import com.lsf.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Starter {

    public static void main(String[] args) {

        ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
        UserService userService = (UserService) ac.getBean("userService");
        userService.test();
    }



}

?

xml实现

1.写切面类

package com.lsf.aspect;

import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 定义切面
 *  定义 切入点 与 通知 的结合
 *
 */

@Component  //将该类交给IOC实例化
@Aspect   //声明此类为切面类
public class LogCutxml {

    /**
     * 定义切入点
     */

    public void cut(){

    }
    /**
     * 前置通知,引用在切入点
     *  在目标方法调用前
     */



    public void before(){
        System.out.println("这是一个前面通知");

    }

    /**
     * 返回通知,引用在切入点
     *  在目标方法无异常返回时输出
     */

    public void afterReturn(){
        System.out.println("返回通知");
    }

    /**
     * 最终通知,引用在切入点
     *  在目标方法是否异常 ,都输出
     */

    public void after(){
        System.out.println("最终通知");
    }

    /**
     * 异常通知,引用在切入点
     *  在目标方法发生异常时 ,都输出
     */

    public void afterThrow(Exception e){
        System.out.println("异常通知:异常原因:  ");
    }

    /**
     * 环绕通知,引用在切入点
     *  在目标方法发生异常时 ,都输出
     */

    public Object around(){
        System.out.println("前置通知");
        Object result = null;
        try {
            System.out.println("返回通知");

        }catch (Exception e){
        e.printStackTrace();
            System.out.println("异常通知");
        }catch (Throwable throwable){
            throwable.printStackTrace();
        }finally {
            System.out.println("最终通知");
        }

        return result;
    }


}

2.配置aop相关配置

 <!--aop相关配置-->
        <aop:config>
                <!--  aop切面-->
                <aop:aspect ref="logCutxml">
                        <!--定义aop切入点-->
                        <aop:pointcut id="cut" expression="execution(* com.lsf.service..*.*(..))"/><!--配置前置通知指定前置通知方法名︰并引用切入点定义-->
                        <aop:before method="before" pointcut-ref="cut" />
                        <!--配置返回通知指定返回通知方法名并引用切入点定义-->
                        <aop:after-returning method="afterReturn" pointcut-ref="cut"/><!--配置异常通知指定异常通知方法名并引用切入点定义-->
                        <aop:after-throwing method="afterThrow" throwing="e" pointcut-ref="cut" />
                        <!-- 配置最终通知指定最终通知方法名并引用切入点定义-->
                        <aop:after method="after" pointcut-ref="cut" />
                        <!--配置指定环绕通知方法名并引用切入点定义-->
                        <aop:around method="around" pointcut-ref="cut"/>
        </aop:aspect>
</aop:config>

3.测试

package com.lsf;


import com.lsf.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Starter {

    public static void main(String[] args) {

        ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
        UserService userService = (UserService) ac.getBean("userService");
        userService.test();
    }



}

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:12:55  更:2022-09-21 00:13:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:17:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码