Spring-AOP @AspectJ进阶之如何绑定代理对象

概述

使用this()或target()可绑定被代理对象实例,在通过类实例名绑定对象时,还依然具有原来连接点匹配的功能,只不过类名是通过增强方法中同名入参的类型间接决定罢了。

这里我们通过this()来了解对象绑定的用法:

实例

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

业务类

package com.xgj.aop.spring.advisor.aspectJAdvance.bindProxyObj;
import org.springframework.stereotype.Component;
/**
 *
 *
 * @ClassName: BussinessLogicService
 *
 * @Description: @Component标注的bean
 *
 * @author: Mr.Yang
 *
 * @date: 2017年9月12日 下午12:11:28
 */
@Component
public class BussinessLogicService {
	public void doLogic() {
		System.out.println("BussinessLogicService doLogic executed ");
	}
}

切面

package com.xgj.aop.spring.advisor.aspectJAdvance.bindProxyObj;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
/**
 *
 *
 * @ClassName: BindProxyObjAspect
 *
 * @Description: 绑定代理对象
 *               使用this()或target()可绑定被代理对象实例,在通过类实例名绑定对象时,还依然具有原来连接点匹配的功能,
 *               只不过类名是通过增强方法中同名入参的类型间接决定罢了
 *
 * @author: Mr.Yang
 *
 * @date: 2017年9月12日 下午12:04:44
 */
@Aspect
public class BindProxyObjAspect {
	// (1)处通过②处查找出waiter对应的类型为BussinessLogicService,因而切点表达式
	// 为this(bussinessLogicService),当增强方法织入目标连接点时,增强方法通过bussinessLogicService
	// 入参可以引用到代理对象的实例。
	@Before("this(bussinessLogicService)")
	public void bindProxyObj(BussinessLogicService bussinessLogicService) { // (2)
		System.out.println("----bindProxyObj()----");
		System.out.println(bussinessLogicService.getClass().getName());
		System.out.println("----bindProxyObj()----");
	}
}

①处的切点表达式首先按类变量名查找②处增强方法的入参列表,进而获取类变量名对应的类为

com.xgj.aop.spring.advisor.aspectJAdvance.bindProxyObj.BussinessLogicService

这样就知道了切点的定义为

this(com.xgj.aop.spring.advisor.aspectJAdvance.bindProxyObj.BussinessLogicService)

即所有代理对象为BussinessLogicService类的所有方法匹配该切点。

②处的增强方法通过bussinessLogicService入参绑定目标对象。

可见BussinessLogicService的所有方法匹配①处的切点

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	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.xsd
		http://www.springframework.org/schema/context
       	http://www.springframework.org/schema/context/spring-context.xsd">
<!-- (1)声明Context命名空间以及Schema文件   (2)扫描类包以及应用注解定义的bean -->
<context:component-scan base-package="com.xgj.aop.spring.advisor.aspectJAdvance.bindProxyObj"/>
<!-- 基于@AspectJ切面的驱动器 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>

<!-- 使用了@AspectJ注解的切面类 -->
<bean class="com.xgj.aop.spring.advisor.aspectJAdvance.bindProxyObj.BindProxyObjAspect"/>
</beans>

测试类

package com.xgj.aop.spring.advisor.aspectJAdvance.bindProxyObj;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BindProxyObjAspectTest {
 @Test
 public void test() {
  ApplicationContext ctx = new ClassPathXmlApplicationContext(
    "classpath:com/xgj/aop/spring/advisor/aspectJAdvance/bindProxyObj/conf-bindProxyObj.xml");
  BussinessLogicService bussinessLogicService = ctx.getBean(
    "bussinessLogicService", BussinessLogicService.class);
  bussinessLogicService.doLogic();
 }
}

运行结果

2017-09-12 13:54:41,463  INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@292898f5: startup date [Tue Sep 12 13:54:41 BOT 2017]; root of context hierarchy
2017-09-12 13:54:41,557  INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/aop/spring/advisor/aspectJAdvance/bindProxyObj/conf-bindProxyObj.xml]
----bindProxyObj()----
com.xgj.aop.spring.advisor.aspectJAdvance.bindProxyObj.BussinessLogicService$$EnhancerBySpringCGLIB$$472f5f0d
----bindProxyObj()----
BussinessLogicService doLogic executed

按相似的方法使用target()进行绑定。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • spring-AOP 及 AOP获取request各项参数操作

    spring-AOP 及 AOP获取request各项参数 AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待. 一.AOP的基本概念 Aspect(切面):通常是一个类,里面可以定义切入点和通知 JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用 Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around Pointcut(切入点

  • 基于Spring AOP proxyTargetClass的行为表现总结

    Spring AOP proxyTargetClass的行为 要点列表形式 proxyTargetClass true 目标对象实现了接口 – 使用CGLIB代理机制 目标对象没有接口(只有实现类) – 使用CGLIB代理机制 false 目标对象实现了接口 – 使用JDK动态代理机制(代理所有实现了的接口) 目标对象没有接口(只有实现类) – 使用CGLIB代理机制 表格形式 proxyTargetClass 目标对象特征 代理效果 true 目标对象实现了接口 使用CGLIB代理机制 tru

  • Springboot+AOP实现返回数据提示语国际化的示例代码

    前言 本篇内容: 提示语的国际化返回,自定义多语言. 本文使用aop方式,拦截接口返回的数据,进行转换. 正文 先看这次示例教学的项目 目录结构: (当然resource里面的i18n文件夹和三个properties文件也是要我们自己建的,但是 那个Resource Bundle 不用管,这个在yml加上对应配置项自动生成的. 不清楚的继续往下看教学就好) 开始敲(CV)代码: pom.xml 依赖: <dependencies> <dependency> <groupId&

  • SpringBoot Aop 详解和多种使用场景解析

    前言 aop面向切面编程,是编程中一个很重要的思想本篇文章主要介绍的是SpringBoot切面Aop的使用和案例 什么是aop AOP(Aspect OrientedProgramming):面向切面编程,面向切面编程(也叫面向方面编程),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 使用场景 利用AOP可以对我们边缘业务进行隔离,降低无关业务逻辑耦

  • SpringAOP如何获取方法参数上的注解

    SpringAOP获取方法参数上的注解 一.示例 ① 如下代码,自定义一个参数注解@Test,并将其使用到方法参数上,用于标注需要检验的参数 /** * 自定义注解,用于参数 */ @Target(PARAMETER) @Documented @Retention(RetentionPolicy.RUNTIME) public @interface Test{ } /** * 接口层,使用使用@Test注解标记参数 */ @RestController @RequestMapping("/v1/

  • 如何使用Spring AOP预处理Controller的参数

    Spring AOP预处理Controller的参数 实际编程中,可能会有这样一种情况,前台传过来的参数,我们需要一定的处理才能使用 比如有这样一个Controller @Controller public class MatchOddsController { @Autowired private MatchOddsServcie matchOddsService; @RequestMapping(value = "/listOdds", method = RequestMethod

  • Spring Aop 如何获取参数名参数值

    前言: 有时候我们在用Spring Aop面向切面编程,需要获取连接点(JoinPoint)方法参数名.参数值. 环境: Mac OSX Intellij IDEA Spring Boot 2x Jdk 1.8x Code: package com.example.aopdemo.aop; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.a

  • 聊聊Spring——AOP详解(AOP概览)

    目录 一.对AOP的初印象 首先先给出一段比较专业的术语: 然后我们举一个比较容易理解的例子: 二.AOP中的相关概念 这里还是先给出一个比较专业的概念定义: 然后举一个容易理解的例子: 三.其他的一些内容 Advice 的类型 一.对AOP的初印象 首先先给出一段比较专业的术语: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是OOP的延续,是软件开发中的一个热点,也是

  • Spring-AOP @AspectJ进阶之如何绑定代理对象

    概述 使用this()或target()可绑定被代理对象实例,在通过类实例名绑定对象时,还依然具有原来连接点匹配的功能,只不过类名是通过增强方法中同名入参的类型间接决定罢了. 这里我们通过this()来了解对象绑定的用法: 实例 代码已托管到Github-> https://github.com/yangshangwei/SpringMaster 业务类 package com.xgj.aop.spring.advisor.aspectJAdvance.bindProxyObj; import

  • 基于Spring AOP @AspectJ进阶说明

    @AspectJ可以使用切点函数定义切点,我们还可以使用逻辑运算符对切点进行复核运算得到复合的切点,为了在切面中重用切点,我们还可以对切点进行命名,以便在其他的地方引用定义过的切点. 当一个连接点匹配多个切点时,需要考虑织入顺序的问题,此外一个重要的问题是如何再增强中访问连接点上下文的信息. Waiter接口: package com.yyq.aspectJAdvanced; public interface Waiter { void greetTo(String name); void se

  • Spring AOP AspectJ使用及配置过程解析

    这篇文章主要介绍了Spring AOP AspectJ使用及配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 AspectJ是一个基于Java语言的AOP框架,Spring2.0以后新增了对AspectJ切点表达式支持.因为Spring1.0的时候Aspectj还未出现; AspectJ1.5中新增了对注解的支持,允许直接在Bean类中定义切面.新版本的Spring框架建 议我们都使用AspectJ方式来开发AOP,并提供了非常灵活且

  • 谈谈Spring AOP中@Aspect的高级用法示例

    前言 本文主要跟大家分享介绍了关于Spring AOP中@Aspect的高级用法,下面话不多说了,来随着小编一起看看详细的介绍吧. 1 切点复合运算 支持在切点定义中加入以下运算符进行复合运算: 运算符 说明 && 与运算. ! 非运算. || 或运算. 2 切点命名 一般情况下,切点是直接声明在需要增强方法处,这种切点的声明方式称为匿名切点,匿名切点只能在声明处被使用 . 如果希望在其它地方可以重用这个切点,我们可以通过 @Pointcut 注解及切面类方法来命名它. public cl

  • 详解Spring Aop实例之AspectJ注解配置

    上篇<Spring Aop实例之xml配置>中,讲解了xml配置方式,今天来说说AspectJ注解方式去配置spring aop. 依旧采用的jdk代理,接口和实现类代码请参考上篇博文.主要是将Aspect类分享一下: package com.tgb.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Aft

  • Spring AOP 与代理的概念与使用

    一.AOP 的基本概念 1.1 什么是 AOP Aspect Oriented Programming,面向切面编程. 就跟我们说 OOP 是面向对象一样,AOP 是面向切面的.切面是分散在应用中的一个标准代码或功能.切面通常与实际的业务逻辑不同(例如,事务管理).每个切面专注于一个特定的环切功能. 这里的切面呢,可以理解为横切.比如在所有的 DAO 层方法上加上一个同样的切面,功能是记录日志:又或者在某个接口上应用一个切面,作用是检查权限. AOP 是基于代理来实现的.而代理又分为静态代理和动

  • Spring使用AspectJ的注解式实现AOP面向切面编程

    1.认识Spring AOP 1.1 AOP的简介 AOP:面向切面编程,相对于OOP面向对象编程. Spring的AOP的存在目的是为了解耦.AOP可以让一组类共享相同的行为.在OOP中只能通过继承类和实现接口,来使代码的耦合度增强,而且类的继承只能为单继承,阻碍更多行为添加到一组类上,AOP弥补了OOP的不足. 1.2 AOP中的概念 切入点(pointcut): 切入点(pointcut):在哪些类.哪些方法上切入. 通知(advice):在方法前.方法后.方法前后做什么. 切面(aspe

  • Aspectj与Spring AOP的对比分析

    1.简介 今天有多个可用的 AOP 库, 它们需要能够回答许多问题: 1.是否与用户现有的或新的应用程序兼容? 2.在哪里可以实现 AOP? 3.与自己的应用程序集成多快? 4.性能开销是多少? 在本文中, 我们将研究如何回答这些问题, 并介绍 Spring aop 和 AspectJ, 这是 Java 的两个最受欢迎的 aop 框架. 2.AOP概念 在开始之前, 让我们对术语和核心概念进行快速.高层次的审查: Aspect -- 一种标准代码/功能, 分散在应用程序中的多个位置, 通常与实际

  • Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理,另一种是CGLib的方式. 自Java 1.3以后,Java提供了动态代理技术,允许开发者在运行期创建接口的代理实例,后来这项技术被用到了Spring的很多地方. JDK动态代理主要涉及java.lang.reflect包下边的两个类:Proxy和InvocationHandler.其中,Invoc

  • Spring AOP 基于注解详解及实例代码

    Spring AOP  基于注解详解及实例代码 1.启用spring对@AspectJ注解的支持: <beans xmlns:aop="http://www.springframework.org/schema/aop"...> <!--启动支持--> <aop:aspectj-autoproxy /> </beans> 也可以配置AnnotationAwareAspectJAutoProxyCreator Bean来启动Spring对@

随机推荐