目录
1.MyAdvise通知类(做通知,切入点,切入点与通知进行绑定)
2.SpringConfig Spring配置类(识别bean,与Aspect)
5.pom.xml,Spring-Context内置了AOp的包,所以仅仅需要导入aspectjweaver即可
面向切面编程概念
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>