引入通知是一种特殊的通知类型。它通过为接口提供实现类,允许对象动态地实现接口,就像对象已经在运行时扩展了实现类一样。
引入通知可以使用两个实现类 MaxCalculator 和 MinCalculator, 让 PureCalculator动态地实现 IMaxCalculator 和 IMinCalculator 接口。 而这与从 MaxCalculator 和 MinCalculator中实现多继承的效果相同。但却不需要修改 PureCalculator的源代码。引入通知也必须在切面中声明,在切面中,通过为任意字段添加@DeclareParents 注解来引入声明。注解类型的 value 属性表示哪些类是当前引入通知的目标。value 属性值也可以是一个 AspectJ 类型的表达式,可以将一个接口引入到多个类中。defaultImpl 属性中指定这个接口使用的实现类。
示例
1. 添加模型接口和类
package xyz.huning.spring4.aop.calculator; public interface ICalculator { double add(double x,double y); double sub(double x,double y); double mul(double x,double y); double div(double x,double y); }
package xyz.huning.spring4.aop.calculator; public interface IMaxCalculator { double max(double x,double y); }
package xyz.huning.spring4.aop.calculator; public interface IMinCalculator { double min(double x,double y); }
package xyz.huning.spring4.aop.calculator; import org.springframework.stereotype.Component; @Component public class PureCalculator implements ICalculator { @Override public double add(double x, double y) { System.out.println("execute method add ..."); return x + y; } @Override public double sub(double x, double y) { System.out.println("execute method sub ..."); return x - y; } @Override public double mul(double x, double y) { System.out.println("execute method mul ..."); return x * y; } @Override public double div(double x, double y) { System.out.println("execute method div ..."); return x / y; } }
package xyz.huning.spring4.aop.calculator.aopimport.annotation; import xyz.huning.spring4.aop.calculator.IMaxCalculator; public class MaxCalculator implements IMaxCalculator { @Override public double max(double x, double y) { System.out.println("execute max method ..."); return x > y ? x : y; } }
package xyz.huning.spring4.aop.calculator.aopimport.annotation; import xyz.huning.spring4.aop.calculator.IMinCalculator; public class MinCalculator implements IMinCalculator { @Override public double min(double x, double y) { System.out.println("execute min method ..."); return x < y ? x : y; } }
package xyz.huning.spring4.aop.calculator.aopimport.annotation; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.DeclareParents; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import xyz.huning.spring4.aop.calculator.IMaxCalculator; import xyz.huning.spring4.aop.calculator.IMinCalculator; @Order(3) @Aspect @Component public class CalculatorMaxMinAspect { @DeclareParents(value="* *.PureCalculator",defaultImpl=MaxCalculator.class) private IMaxCalculator maxCalculator; @DeclareParents(value="* *.PureCalculator",defaultImpl=MinCalculator.class) private IMinCalculator minCalculator; }
2. 添加配置文件
<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!--自定义bean扫描范围--> <context:component-scan base-package="xyz.huning.spring4.aop.calculator"></context:component-scan> <!--使Aspectj注解启作用--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
3. 添加测试类
package xyz.huning.spring4.aop.calculator.aopimport.annotation; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import xyz.huning.spring4.aop.calculator.IMaxCalculator; import xyz.huning.spring4.aop.calculator.IMinCalculator; public class Main { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("calculator-aop-annotation.xml"); IMaxCalculator maxCalculator = ctx.getBean("pureCalculator", IMaxCalculator.class); maxCalculator.max(30, 40); IMinCalculator minCalculator = ctx.getBean("pureCalculator", IMinCalculator.class); minCalculator.min(30, 40); ((ClassPathXmlApplicationContext)ctx).close(); } }
4. 执行结果
相关推荐
Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...
在Spring中,有五种不同类型的Advice:`Before`(前置通知)、`After-Returning`(返回后通知)、`After-Throwing`(异常后通知)、`Around`(环绕通知)和`Introduction`(引入通知)。例如,`Before`通知在目标...
Spring AOP(面向切面编程)是Spring框架中的一...综上,Spring AOP 提供了一种高效、灵活的日志管理方式,通过切面和通知的组合,我们可以方便地记录和管理应用程序的运行时信息,从而提高系统的可维护性和可追溯性。
"Spring AOP + 注解实现统一注解功能" 本文我们通过Spring AOP和Java的自定义注解来实现日志的插入功能,该方案对原有业务入侵较低,实现较灵活。下面我们将详细介绍该功能的实现原理和相关知识点。 1. 概述 在...
先引入Spring框架开发的基本开发包,再引入Spring框架的AOP的开发包
1. 在`spring-common.xml`配置文件中,我们需要引入AOP相关的命名空间,并声明一个`<aop:aspectj-autoproxy>`元素。这会告诉Spring容器,我们要启用基于注解的AOP,并代理所有带有切面注解的bean。配置如下: ```...
Spring AOP通过`@Aspect`注解来定义一个切面。这个注解应用于一个Java类,表示该类是一个切面,其中包含了通知和切入点表达式。`@Aspect`类通常会包含`@Before`, `@After`, `@Around`, `@AfterReturning`, 和 `@...
Spring 框架提供了四种方式来实现Aspect-Oriented Programming(AOP),分别是经典的基于代理的 AOP、@AspectJ 注解驱动的切面、纯 POJO 切面和注入式 AspectJ 切面。下面将详细介绍这四种方式。 一、AOP 概念 在...
Spring AOP 实现原理详解之 AOP 切面的实现 Spring AOP 是基于 IOC 的 Bean 加载来实现的,本文主要介绍 Spring AOP 原理解析的切面实现过程。AOP 切面的实现是将切面类的所有切面方法根据使用的注解生成对应 ...
另外,Spring 2.0引入了基于注解的AOP支持,允许开发者直接在类或方法上使用`@Before`, `@After`, `@Around`, 和 `@AfterThrowing` 注解来声明Advice。这种方法更加简洁且易于理解。 总的来说,Spring AOP提供了...
1. 引入Spring AOP相关的jar包。 2. 定义一个增强类,该类将包含额外功能的实现。 3. 在Spring配置文件中,通过`<bean>`标签定义目标类和增强类。 4. 使用`<aop:config>`或`<aop:aspect>`标签配置AOP的编织功能,...
1. 配置:在`applicationContext.xml`中引入AOP命名空间,并配置切面、通知和代理。 2. 定义接口和服务实现:例如创建一个`TestService`接口和它的实现类`TestServiceImpl`。 3. 创建通知类:这里可以是实现`...
随着Java注解的流行,Spring也引入了注解驱动的AOP配置,这使得代码更加简洁和易于理解。首先,我们需要在`pom.xml`中引入相关的依赖,如`spring-aop`、`aspectjrt`、`aspectjweaver`等,确保Spring AOP和AspectJ库...
Spring 4.3引入了`@EnableAspectJAutoProxy`注解,允许在配置类中启用AOP,无需XML配置。只需要在主配置类上添加该注解,并确保切面类被扫描到。 ```java @Configuration @EnableAspectJAutoProxy @ComponentScan...
SpringBoot 中的 Aop + 自定义注解 1. @AspectJ 1.1 `@AspectJ` 切面类 1.2 `@Pointcut` 创建切入点 1.3 通知 1.4 Spring AOP 和 AspectJ AOP 有什么区别? 2. 在 SpringBoot 中使用 Aop 功能 2.0 创建一个...
<aop:aspect id="aspect" ref="logIntercepter"> 引入具体的AOP操作类 <aop:pointcut expression="execution(* com.spring.service..*(..))" id="pointCut"/>声明一个切入点,注意execution表达式的写法 <aop:before ...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许我们在不修改原有代码的情况下,插入额外的功能,如日志、事务管理等。本文将深入探讨Spring AOP的概念及其源码实现,帮助读者理解其内部机制。 一、...
首先,为了在Spring中启用基于注解的AOP支持,我们需要在配置文件中引入`<aop:aspectj-autoproxy/>`标签。这将使得Spring容器能够自动识别和处理标记了@Aspect的类,从而创建并注册对应的代理对象。 1. **定义切面...