网站编辑框超链接怎么做,py网站开发视频教程,软件项目管理案例教程第四版答案,网站建设文化传播有限公司目录
一#xff1a;什么是AOP
二#xff1a;AOP快速入门
2.1导入AOP坐标
2.2定义dao接口和实现类
2.3定义通知类 2.4在配置类中进行Spring注解包扫描和开启AOP功能
2.5定义测试类测试结果
三#xff1a;AOP工作流程
四#xff1a;AOP的切入点表达式
4.1语法格…目录
一什么是AOP
二AOP快速入门
2.1导入AOP坐标
2.2定义dao接口和实现类
2.3定义通知类 2.4在配置类中进行Spring注解包扫描和开启AOP功能
2.5定义测试类测试结果
三AOP工作流程
四AOP的切入点表达式
4.1语法格式
4.2通配符
五AOP通知类型
5.1前置通知
5.2后置通知
5.3最终通知
5.4异常通知
5.5环绕通知
六总结 一什么是AOP 在软件业AOP为Aspect Oriented Programming的缩写意为面向切面编程通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续是软件开发中的一个热点也是Spring框架中的一个重要内容是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离从而使得业务逻辑各部分之间的耦合度降低提高程序的可重用性同时提高了开发的效率。 总的来说AOP就是一编程规范目的是在不改变方法源代码的基础上对方法进行功能增强。 二AOP快速入门
2.1导入AOP坐标
在pom.xml中导入aop坐标
dependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion5.3.31/version/dependency dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.9.7/version/dependency
2.2定义dao接口和实现类 BookDao接口中
package com.lcyy.dao;public interface BookDao {void read();
}
实现类注意要在BookDaoImpl方法上加入注解Repository表示为交给Spring的一个组件
import com.lcyy.dao.BookDao;
import org.springframework.stereotype.Repository;Repository
public class BookDaoImpl implements BookDao {Overridepublic void read() {System.out.println(BookDao AOP 实现);}
}
2.3定义通知类 建立一个aop的包在包下建立一个MyAdvice的通知类
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;Component//放在普通类上交给ioc容器管理
Aspect//定义这个类为切面类
public class MyAdvice {//定义连接点Pointcut(execution(void com.lcyy.dao.BookDao.read()))private void pc(){}//定义通知Before(pc())public void testAdvice(){System.out.println(执行前的时间毫秒值);System.out.println(System.currentTimeMillis());}
}注意 1.在MyAdvice类上要加入注解Aspect表示定义为一个切面类,Component表示交给ioc容器管理。 2.Pointcut注解要求配置在方法上方(execution(void com.lcyy.dao.BookDao.read()))为切入点表达式execution为关键字 void为返回值 com.lcyy.dao.BookDao.read()为com.lcyy包下的dao包下的BookDao接口中的read()方法。 3.Before(pc()) 其中Before为前置通知表示为在方法执行前执行。关于通知的几种类型下面会详细讲解。其中 pc() 表示将连接点和通知捆绑起来注意方法名必须相同。 2.4在配置类中进行Spring注解包扫描和开启AOP功能
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;Configuration
ComponentScan(com.lcyy)
EnableAspectJAutoProxy//开启aop
public class SpringConfig {
}其中注解 EnableAspectJAutoProxy 表示开启AOP通知交给IOC容器管理 2.5定义测试类测试结果
import com.lcyy.config.SpringConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class BookDaoTest {public static void main(String[] args) {//获取容器ApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao ctx.getBean(BookDao.class);bookDao.read();}
}
测试结果 三AOP工作流程 Spring容器启动 读取所有切面配置中的切入点 初始化bean判定bean对应的类中的方法是否匹配到任意切入点 匹配失败创建原始对象 匹配成功创建原始对象目标对象的代理对象 获取bean执行方法 获取的bean是原始对象时调用方法并执行完成操作 获取的bean是代理对象时根据代理对象的运行模式运行原始方法与增强的内容完成操作 验证AOP的代理对象在刚才测试类中获取
import com.lcyy.config.SpringConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class BookDaoTest {public static void main(String[] args) {//获取容器ApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao ctx.getBean(BookDao.class);bookDao.read();System.out.println(bookDao.getClass());}
}测试结果 其中class com.sun.proxy.$Proxy19 就是为代理对象的类名 四AOP的切入点表达式
4.1语法格式
描述方法一执行com.lcyy.dao包下的BookDao接口中的无参数read方法 execution(void com.lcyy.dao.BookDao.read()) 描述方法二执行com.lcyy.dao包下的BookDaoImpl实现类中的无参数read方法 execution(void com.lcyy.dao.BookDaoImpl.read()) 切入点表达式标准格式动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数) 异常名 execution(public User com.itheima.service.UserService.findById(int)) 其中 动作关键字描述切入点的行为动作例如execution表示执行到指定切入点 访问修饰符publicprivate等可以省略 返回值写返回值类型 包名多级包使用点连接 类/接口名 方法名 参数直接写参数的类型多个类型用逗号隔开 异常名方法定义中抛出指定异常可以省略 4.2通配符 *单个独立的任意符号可以独立出现也可以作为前缀或者后缀的匹配符出现 ..:多个连续的任意符号可以独立出现常用于简化包名与参数的书写 常用的通配符表达式为 Pointcut(execution(* com.lcyy.dao.*.*(..)) 表示任意的访问修饰符 在com.lcyy.dao包下的任意类中的所有方法..表示可以有形参也可以没有形参。 五AOP通知类型 AOP通知共分为5种类型 前置通知在切入点方法执行之前执行 后置通知在切入点方法执行之后执行无论切入点方法内部是否出现异常后置通知都会执行。 环绕通知(重点)手动调用切入点方法并对其进行增强的通知方式。 最终通知在切入点方法执行之后执行如果切入点方法内部出现异常将不会执行。 异常通知在切入点方法执行之后执行只有当切入点方法内部出现异常之后才执行。 5.1前置通知 名称Before 类型方法注解 位置通知方法定义上方 作用设置当前通知方法与切入点之间的绑定关系当前通知方法在原始切入点方法前运行 案例代码 //前置通知Before(execution(void com.lcyy.dao.BookDao.write()))public void testAdvice2(){System.out.println(我是前置通知);}
5.2后置通知 名称AfterReturning 类型方法注解 位置通知方法定义上方 作用设置当前通知方法与切入点之间的绑定关系当前通知方法在原始切入点方法后运行 案例代码 AfterReturning(execution(void com.lcyy.dao.BookDao.write()))public void testAdvice4(){System.out.println(我是后置通知);}
5.3最终通知 名称After 类型方法注解 位置通知方法定义上方 作用设置当前通知方法与切入点之间的绑定关系当前通知方法在原始切入点方法后运行 案例代码
After(execution(void com.lcyy.dao.BookDao.write()))public void testAdvice3(){System.out.println(我是最终通知);}
5.4异常通知 名称AfterThrowing 类型方法注解 位置通知方法定义上方 作用设置当前通知方法与切入点之间的绑定关系当前通知方法在原始切入点方法运行抛出异常后执行
AfterThrowing(execution(void com.lcyy.dao.BookDao.write()))public void testAdvice5(){System.out.println(我是异常通知);}
在以上四个通知后我们在测试类中测试以上通知 注意书写了异常通知却没有执行是因为简单的代码实现没有异常。 测试异常通知
在BookDaoImpl 的实现类中书写测试异常的代码
Overridepublic void write() {System.out.println(BookDao AOP 实现);int a 10/0;System.out.println(a a);}
测试结果: 5.5环绕通知 名称Around重点常用 类型方法注解 位置通知方法定义上方 作用设置当前通知方法与切入点之间的绑定关系当前通知方法在原始切入点方法前后运行 案例代码 Around(execution(void com.lcyy.dao.BookDao.jiyi()))public Object testJiyi(ProceedingJoinPoint PJ) throws Throwable {System.out.println(我时前置通知);Object Oj PJ.proceed();System.out.println(我是后置通知);return Oj;} 测试结果 注意 环绕通知方法形参必须是ProceedingJoinPoint表示正在执行的连接点使用该对象的proceed()方法表示对原始对象方法进行调用返回值为原始对象方法的返回值。 环绕通知方法的返回值建议写成Object类型用于将原始对象方法的返回值进行返回哪里使用代理对象就返回到哪里。 六总结 AOP在spring中是一个很重要的概念理解和运用AOP在以后的业务开发中有很重要的作用