SpringAop切面编程(一看就会用)

简介: SpringAop切面编程(一看就会用)

作用

   可以在指定的某些类的某些方法的 前后或者 出现异常的时候,动态织入 指定的代码

概念术语

1. Aop

       aspect object programming  面向切面编程

       功能: 让关注点代码与业务代码分离!

2. 关注点

       重复代码就叫做关注点;

3. 切面

        关注点形成的类,就叫切面(类)!(把很多类中重复的代码抽取出来的类,叫切面类)

        面向切面编程,就是指 对很多功能都有的重复的代码抽取,再在运行的时候往业务方法上动态织入“切面类代码”。

4. 切入点

       执行目标对象方法,动态织入切面代码。

       可以通过切入点表达式,指定拦截哪些类的哪些方法; 给指定的类或方法在运行的时候植入切面类代码。

   

aop编程步骤

1. 引入jar包

2. 引入命名空间,开启aop注解

<?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:p="http://www.springframework.org/schema/p"
    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="cn.shanglin.e_aop_anno"></context:component-scan>
     <!-- 开启aop注解方式 -->
     <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
3. 定义切面类
@Component //加入IOC容器
@Aspect  // 指定当前类为切面类,被织入的代码
public class Aop {
/**
 *  指定切入点表达式: 拦截cn.shanglin.e_aop_anno包下的所有类的所有方法
 *  第一个*表示:所有返回值类型
 *  第二个*表示:该包下的所有类
 *  第三个*(..)表示:所有的方法,参数不限;如果是*()表示无参方法;如果是*(*)表示只有一个参数的方法。
 *  注意:
 *   这个切入点表达式,也可以写在每个注解的后面,这里这样统一写,
 *  下面的所有注解只需要引用方法名:pointCut_即可
 */
@Pointcut("execution(* cn.shanglin.e_aop_anno.*.*(..))")
public void pointCut_(){
}
// 前置通知 : 在执行目标方法之前执行
@Before("pointCut_()")
public void begin(){
System.out.println("开始事务");
  }
// 后置/最终通知:在执行目标方法之后执行  【无论是否出现异常最终都会执行】
@After("pointCut_()")
public void after(){
System.out.println("提交事务");
}
/**
 *  环绕通知:环绕目标方式执行,要么使用@Before("pointCut_()")和@After("pointCut_()"),
 *  要么就使用@Around("pointCut_()"),两个功能一样不要混合使用
 */
@Around("pointCut_()")
public void around(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("环绕前,即执行目标方法之前执行....");
pjp.proceed();  // 执行目标方法
System.out.println("环绕后,即执行目标方法之后执行....");
    }
// 返回后通知: 在调用目标方法结束后执行 【出现异常不执行】
@AfterReturning("pointCut_()")
public void afterReturning() {
System.out.println("afterReturning()");
    }
// 异常通知: 当目标方法执行异常时候执行此关注点代码
@AfterThrowing("pointCut_()")
public void afterThrowing(){
System.out.println("afterThrowing()");
    }
}
目录
相关文章
|
5月前
|
数据采集 前端开发 Java
@ControllerAdvice:你可以没用过,但是不能不了解
`@ControllerAdvice` 是 Spring MVC 中用于定义全局行为的注解,如异常处理、数据绑定和预处理。它从 `@Component` 派生,确保被扫描并纳入容器。`@ExceptionHandler` 用于全局异常处理,提供统一的错误响应。例如,当处理不当的异常时,它能返回友好的错误信息。`@InitBinder` 在数据绑定前对参数进行处理,如格式转换。`@ModelAttribute` 可以用于全局绑定模型属性,如登录用户信息。Spring MVC 通过 `DispatcherServlet` 和 `HandlerAdapter` 在请求处理流程中应用这些全局配置。
75 3
@ControllerAdvice:你可以没用过,但是不能不了解
|
6月前
|
XML 缓存 Java
天天用 Spring,bean 实例化原理你懂吗
天天用 Spring,bean 实例化原理你懂吗
47 0
|
6月前
|
设计模式 Java 数据库
springioc和aop的通俗理解
springioc和aop的通俗理解
32 0
|
Java Spring 容器
|
JSON 前端开发 Java
|
XML Java 数据格式
了解一点儿JavaConfig
Java 5 的推出,加上当年基于纯Java Annotation的依赖注入框架Guice的出现,使得Spring框架及其社区也“顺应民意”,推出并持续完善了基于Java代码和Annotation元信息的依赖关系绑定描述方式,即JavaConfig项目。
92 0
|
数据采集 算法 Java
今天拿SpringAOP和自定义注解的通用性开🔪
SpringAOP和自定义注解的通用性
113 0
今天拿SpringAOP和自定义注解的通用性开🔪
|
算法 Java 测试技术
《Spring 手撸专栏》第 15 章:万人之敌,通过注解给属性注入配置和Bean对象
实现 1. 工程结构 2. 把读取到属性填充到容器 3. 自定义属性注入注解 4. 扫描自定义注解 5. 在Bean的生命周期中调用属性注入 测试 1. 事先准备 2. 属性配置文件 3. 单元测试
290 0
《Spring 手撸专栏》第 15 章:万人之敌,通过注解给属性注入配置和Bean对象
|
XML 缓存 NoSQL
《Spring 手撸专栏》第 10 章:横刀跃马,关于Bean对象作用域以及FactoryBean的实现和使用
实现 1. 工程结构 2. Bean的作用范围定义和xml解析 3. 创建和修改对象时候判断单例和原型模式 4. 定义 FactoryBean 接口 5. 实现一个 FactoryBean 注册服务 6. 扩展 AbstractBeanFactory 创建对象逻辑 测试 1. 事先准备 2. 定义 FactoryBean 对象 3. 配置文件 4. 单元测试(单例&原型) 5. 单元测试(代理对象)
193 0
《Spring 手撸专栏》第 10 章:横刀跃马,关于Bean对象作用域以及FactoryBean的实现和使用
|
XML JSON 前端开发
被各种注解搞晕了?那快来看看Spring Bean注解详解!
被各种注解搞晕了?那快来看看Spring Bean注解详解!
140 0