Spring AOP 面向切面编程概念+AOP工作流程+AOP入门案例

目录

 面向切面编程概念

1.AOP概念 

 2.自我理解概念:

3.官方理解: 

AOP入门案例工作流程 

1.AOP工作流程 :

2.AOP核心概念(使用代理模式来增强功能):

2 AOP入门案例

1.MyAdvise通知类(做通知,切入点,切入点与通知进行绑定)

2.SpringConfig  Spring配置类(识别bean,与Aspect)

3.BookDaoImpl

4.App(main)运行方法

5.pom.xml,Spring-Context内置了AOp的包,所以仅仅需要导入aspectjweaver即可

6.效果截图(成功运行)

7.文件格式图


 面向切面编程概念

1.AOP概念 

概念:(Aspect Oriented Programming)面向切面编程,一种编程的范式,指导开发者如何组织程序结构

作用:在不惊动原始设计的基础上,为其进行功能增强(代理模式可以做增强)

Spring 理念:无侵入式/无入侵式(旨在更加强大的解耦,高质量)

自己理解:在BookDaoImpl中你写的方法叫做连接点,抽取共性的功能在aop包下的类中做成方法,你要在BookDaoImpl里面的方法(连接点)使用aop中的功能(对于你要追加功能的连接点即BookDaoImpl的方法,我们给它取名为切入点)

2.OOP(Object Oriented Programming)面向对象编程(做类,做对象,继承,多态,封装)

 2.自我理解概念:

连接点(JoinPoint):即为BookDaoImpl内的方法(表示为可以进行切入的方法)

      在SpringAOP之中,理解为方法的执行

切入点(PointCut):即为被切入的方法(表示为需要使用Aop包下共用功能的方法)

      在SpringAOP中,一个切入点可以描述一个具体的方法,也可匹配多个方法

      一个具体的方法:某个包下的无形参,无返回值的save方法

      匹配多个方法:所有的save方法,所有的get开头的方法,以Dao结尾的任意方法

通知(Advise):即为aop包下的共性功能写成的方法(旨在为了减少代发负担,增加开发效率)

切面(Aspect):即在通知与切入点之间进行绑定的关系

通知类:定义通知的类

3.官方理解: 

官方解读没有我自己理解的好,可以作为参考,我就不打字了,贴个图片研究 

AOP入门案例工作流程 

1.AOP工作流程 :

1.Spring容器启动

2.读取所有切面配置中的切入点(已经完成关系绑定的,切入点与通知完成关系匹配)

3.初始化bean,判断bean对应的类的方法是否匹配到任意切入点(切入点是否与连接点是对应的)

    (1).匹配失败(创建对象)

    (2).匹配成功,创建原始对象(目标对象)的代理对象

4.获取bean执行方法

    (1)获取bean,调用方法执行,完成操作

    (2)获取bean的是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作

2.AOP核心概念(使用代理模式来增强功能):

1.目标对象(target):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的

2.代理(Proxy):目标对象无法直接完成工作,需要对其进行功能回填,通过原始的代理对象实现

2 AOP入门案例

思路分析:

案例设定:测定接口执行效率

简化设定:在接口执行前输出当前系统时间

开发思路:XML or 注解

思路分析:

1.导入坐标 pom.xml

2.制作连接点方法(原始操作,Dao接口与实现类)

3.制作共性功能(通知类与通知)

4.定义切入点

5.绑定切入点与通知的关系(切面)

1.MyAdvise通知类(做通知,切入点,切入点与通知进行绑定)

package com.itheima.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component    //让1配置类知道是bean
@Aspect       //让配置类知道是造Aop,去识别一下的内容
public class MyAdvise {
    //定义切入点
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void a(){}

    //把切入点与通知进行绑定
    @Before("a()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

2.SpringConfig  Spring配置类(识别bean,与Aspect)

package com.itheima.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration                   //说明此文件为Spring配置类
@ComponentScan("com.itheima")    //包扫描,加载bean
@EnableAspectJAutoProxy          //启动了MyAdvise内的Aspect注解,
public class SpringConfig {
}

3.BookDaoImpl

package com.itheima.dao.impl;

import com.itheima.dao.BookDao;
import org.springframework.stereotype.Repository;

@Repository
public class BookDaoImpl implements BookDao {
    @Override
    public void save() {
        System.out.println(System.currentTimeMillis());
        System.out.println("save.......");
    }

    @Override
    public void update() {
        System.out.println("update.......");
    }

}

4.App(main)运行方法

package com.itheima;

import com.itheima.config.SpringConfig;
import com.itheima.dao.BookDao;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class App {
    public static void main(String[] args) {

        //获取Java配置类
        AnnotationConfigApplicationContext acct = new AnnotationConfigApplicationContext(SpringConfig.class);

        //获取bean
        BookDao bean = acct.getBean(BookDao.class);

        //执行操作
        bean.update();
    }
}

5.pom.xml,Spring-Context内置了AOp的包,所以仅仅需要导入aspectjweaver即可

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Spring-aop-demo1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>18</maven.compiler.source>
        <maven.compiler.target>18</maven.compiler.target>
    </properties>


    <dependencies>
        <!--springFramework依赖,,,,由于AOP包与Context有依赖关系,所以不需要在进行导入aop的包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.23</version>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.11</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <!--        Spring操作数据库有关的都要导这个包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.0.RELEASE</version>
        </dependency>
        <!--        Spring 整合mybtis的包,这个包是和mybatis的包版本是相对应的-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>
        <!--        junit包-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!--        Spring 操作test的 包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
<!--        导入Aspect(切面)的包-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.8</version>
        </dependency>
    </dependencies>
</project>

6.效果截图(成功运行)

7.文件格式图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想给世界留下 1bite 的印象

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值