`

Spring之AOP注解之引入通知

 
阅读更多

 

引入通知是一种特殊的通知类型。它通过为接口提供实现类,允许对象动态地实现接口,就像对象已经在运行时扩展了实现类一样。

 



 

引入通知可以使用两个实现类 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. 执行结果

 



 

  • 大小: 13.6 KB
  • 大小: 28.2 KB
分享到:
评论

相关推荐

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...

    SPRING_AOP_概念解析以及例子示范.docx

    在Spring中,有五种不同类型的Advice:`Before`(前置通知)、`After-Returning`(返回后通知)、`After-Throwing`(异常后通知)、`Around`(环绕通知)和`Introduction`(引入通知)。例如,`Before`通知在目标...

    spring aop 日志管理

    Spring AOP(面向切面编程)是Spring框架中的一...综上,Spring AOP 提供了一种高效、灵活的日志管理方式,通过切面和通知的组合,我们可以方便地记录和管理应用程序的运行时信息,从而提高系统的可维护性和可追溯性。

    Spring AOP + 注解实现统一注解功能

    "Spring AOP + 注解实现统一注解功能" 本文我们通过Spring AOP和Java的自定义注解来实现日志的插入功能,该方案对原有业务入侵较低,实现较灵活。下面我们将详细介绍该功能的实现原理和相关知识点。 1. 概述 在...

    spring aop注解方式代码

    先引入Spring框架开发的基本开发包,再引入Spring框架的AOP的开发包

    spring mvc框架下的aop例子

    1. 在`spring-common.xml`配置文件中,我们需要引入AOP相关的命名空间,并声明一个`&lt;aop:aspectj-autoproxy&gt;`元素。这会告诉Spring容器,我们要启用基于注解的AOP,并代理所有带有切面注解的bean。配置如下: ```...

    Spring aop.docx

    Spring AOP通过`@Aspect`注解来定义一个切面。这个注解应用于一个Java类,表示该类是一个切面,其中包含了通知和切入点表达式。`@Aspect`类通常会包含`@Before`, `@After`, `@Around`, `@AfterReturning`, 和 `@...

    Spring实现AOP的四种方式.pdf

    Spring 框架提供了四种方式来实现Aspect-Oriented Programming(AOP),分别是经典的基于代理的 AOP、@AspectJ 注解驱动的切面、纯 POJO 切面和注入式 AspectJ 切面。下面将详细介绍这四种方式。 一、AOP 概念 在...

    Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现.doc

    Spring AOP 实现原理详解之 AOP 切面的实现 Spring AOP 是基于 IOC 的 Bean 加载来实现的,本文主要介绍 Spring AOP 原理解析的切面实现过程。AOP 切面的实现是将切面类的所有切面方法根据使用的注解生成对应 ...

    spring_AOP实现方法大全

    另外,Spring 2.0引入了基于注解的AOP支持,允许开发者直接在类或方法上使用`@Before`, `@After`, `@Around`, 和 `@AfterThrowing` 注解来声明Advice。这种方法更加简洁且易于理解。 总的来说,Spring AOP提供了...

    SpringAOP.docx

    1. 引入Spring AOP相关的jar包。 2. 定义一个增强类,该类将包含额外功能的实现。 3. 在Spring配置文件中,通过`&lt;bean&gt;`标签定义目标类和增强类。 4. 使用`&lt;aop:config&gt;`或`&lt;aop:aspect&gt;`标签配置AOP的编织功能,...

    Spring(aop)讲解

    1. 配置:在`applicationContext.xml`中引入AOP命名空间,并配置切面、通知和代理。 2. 定义接口和服务实现:例如创建一个`TestService`接口和它的实现类`TestServiceImpl`。 3. 创建通知类:这里可以是实现`...

    spring aop的两种配置方式.docx

    随着Java注解的流行,Spring也引入了注解驱动的AOP配置,这使得代码更加简洁和易于理解。首先,我们需要在`pom.xml`中引入相关的依赖,如`spring-aop`、`aspectjrt`、`aspectjweaver`等,确保Spring AOP和AspectJ库...

    详解Spring学习总结——Spring实现AOP的多种方式

    Spring 4.3引入了`@EnableAspectJAutoProxy`注解,允许在配置类中启用AOP,无需XML配置。只需要在主配置类上添加该注解,并确保切面类被扫描到。 ```java @Configuration @EnableAspectJAutoProxy @ComponentScan...

    SpringBoot中的AOP+自定义注解(源代码)

    SpringBoot 中的 Aop + 自定义注解 1. @AspectJ 1.1 `@AspectJ` 切面类 1.2 `@Pointcut` 创建切入点 1.3 通知 1.4 Spring AOP 和 AspectJ AOP 有什么区别? 2. 在 SpringBoot 中使用 Aop 功能 2.0 创建一个...

    Spring AOP配置源码

    &lt;aop:aspect id="aspect" ref="logIntercepter"&gt; 引入具体的AOP操作类 &lt;aop:pointcut expression="execution(* com.spring.service..*(..))" id="pointCut"/&gt;声明一个切入点,注意execution表达式的写法 &lt;aop:before ...

    SpringAOP的源码解析.doc

    Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许我们在不修改原有代码的情况下,插入额外的功能,如日志、事务管理等。本文将深入探讨Spring AOP的概念及其源码实现,帮助读者理解其内部机制。 一、...

    在spring中如何使用aop

    首先,为了在Spring中启用基于注解的AOP支持,我们需要在配置文件中引入`&lt;aop:aspectj-autoproxy/&gt;`标签。这将使得Spring容器能够自动识别和处理标记了@Aspect的类,从而创建并注册对应的代理对象。 1. **定义切面...

Global site tag (gtag.js) - Google Analytics