`

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框架开发的基本开发包,再引入Spring框架的AOP的开发包

    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 ...

    Spring加Aspect的jar包

    Spring+Aspect所需jars,包括Spring-aop、Spring-Aspect、aopalliance-1.0、Aspect Jweaver-1.8.7等包,个人学习时从各地凑出来的,送上资源免得各位大大们继续跟我一样还得花时间从各地一点一点地去凑这几个包。

    aspect-cache:An light spring-boot AOP cache with Java, support POJO,Map and List data type. You can use your key generator(default use SpEL) and cache provider.Key generate with SpEL.Aspect Cache是一个针对Spring Boot,基于AOP注解方式的轻量级缓存,目前支持EHCache,Redis缓存方式。数据类型支

    Aspect Cache是一个针对Spring Boot,基于AOP注解方式的轻量级缓存,目前支持EHCache,Redis缓存方式。数据类型支持POJO、Map和List数据类型,同时支持自定义缓存key解析,也支持自定义的缓存处理方式,或者扩展支持...

    spring.net中文手册在线版

    26.4.The Spring.NET AOP Cookbook 26.4.1.缓存 26.4.2.性能监视 26.4.3.重试规则 Spring.NET AOP最佳实践 第二十七章. .NET Remoting快速入门 27.1.简介 27.2.Remoting实例程序 27.3.实现 27.4.运行程序 27.5....

    Spring系列之Spring常用注解总结.docx

    传统的Spring做法是使用.xml文件来对bean进行注入或者是...为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。

    spring.doc

    4.2.2.2Aop注解形式(了解) 99 注解注入拓展: 103 5 Spring数据库 106 5.1 Spring+JDBC 106 5.1.1 Jdbc编程特点 106 5.1.2引入DataSource 106 5.1.3 核心类JdbcTemplate 106 5.1.4 使用JdbcTemplate 106 5.1.5 ...

    spring4示例代码

    spring-3 演示使用动态代理模式实现面向切面编程 使用注解方式进行AOP编程及使用配置xml方式进行AOP编程 spring-4 演示了spring与JDBCTemplate配合使用 spring-5 演示了声明式事务及使用xml配置文件处理事务

    spring 注解介绍

    Spring 2.0当中为缩减XML配置文件数量引入定制命名空间功能,从此它便深深植根于核心Spring框架(aop、context、jee、jms、 lang、tx和util命名空间)、Spring Portfolio项目(例如Spring Security)和非Spring项目...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.4.2. Spring AOP中使用@AspectJ还是XML? 6.5. 混合切面类型 6.6. 代理机制 6.7. 编程方式创建@AspectJ代理 6.8. 在Spring应用中使用AspectJ 6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1....

    Spring面试题含答案.pdf

    53. 在 Spring AOP 中,关注点和横切关注的区别是什么? 54. 连接点 55. 通知 56. 切点 57. 什么是引入? 58. 什么是目标对象? 59. 什么是代理? 60. 有几种不同类型的自动代理? 61. 什么是织入。什么是织入应用...

    Spring的学习笔记

    三、 引入spring的jar包 8 四、 测试代码: 8 五、 注意接口的使用: 8 第五课:IOC(DI)配置及应用 9 一、 什么是IOC、DI 9 二、 编辑xml文件时,没有提示 9 三、 注入类型(Injecting dependencies) 9 (一) setter...

    AspectJ对AOP的实现.rar

    对于AOP这种编程思想,很多框架都进行了实现。Spring就是其中之一,可以完成面向切面编程。然而,AspectJ也实现了AOP的功能,且其实现方式更为简捷...所以,Spring又将AspectJ的对于AOP的实现也引入到了自己的框架中。

    Spring 2.0 开发参考手册

    6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个...

    autologging:一个非常强大的监控日志输出框架,支持 SpringAOP 和动态字节码注入两种方式输出方法执行的监控日志,而且包含链路追踪功能,只要一个注解即可开启所有功能

    AutoLogging 监控日志框架一个非常强大的监控日志输出框架,主要功能包含方法监控日志输出应用内调用链路追踪可以通过SpringAOP动态字节码运行时注入两种方式引入,只要一个注解即可开启所有功能,而且具有强大的可...

    Spring中文帮助文档

    6.4.2. Spring AOP中使用@AspectJ还是XML? 6.5. 混合切面类型 6.6. 代理机制 6.6.1. 理解AOP代理 6.7. 以编程方式创建@AspectJ代理 6.8. 在Spring应用中使用AspectJ 6.8.1. 在Spring中使用AspectJ进行domain ...

    Spring API

    6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点...

Global site tag (gtag.js) - Google Analytics