当前位置:首页 > CN2资讯 > 正文内容

springaop自动代理

3天前CN2资讯


一、背景
spring的aop就是切面编程,切面编程的意思,就是横向对方法进行拦截,加入统一的自定义处理逻辑。比如,统计所有方法的执行次数、统计所有方法的执行时间、在打印所有方法的返回值等等。
切面编程用到的就是jdk的代理,也就是设计模式中的代理模式。代理模式即对目标对象创建一个代理对象,代理对象持有目标对象的引用,因此调用代理对象,就完全可以实现对目标对象的调用,而代理对象是我们自己创建的,因此可以在不侵入到目标对象的情况下,添加自定义逻辑。

二、一些概念
1、通知
在springaop中,通知就是切面任务,即在我们对目标对象进行代理之后,需要做的事情,例如上面所说的统计方法的执行次数、打印日志等行为。

2、目标对象
这个是我们要进行切面拦截的对象,我们要对某种场景进行拦截,必须要有一个对象。有时候我们甚至不关注目标对象具体要完成的任务,例如,在统计目标对象执行的时间,我们只关注方法执行的时间就行了。

3、切点
切点标注了什么地方进行切面任务,可以是一个bean,可以是一个方法,支持正则表达式,例如以process结尾的方法等。

4、PointcutAdvisor
该对象用于将通知和切点绑定。当我们分别定义了切点和通知后,spring还不知道切点和通知的关系,因此需要一个绑定

5、自动代理
上面讲了一大堆概念,最重要的还是为目标对象产生一个自动代理,也就是我在调用目标对象的时候,如何才能执行通知。spring提供了一种非常好的自动代理的功能,可以根据PointcutAdvisor直接为目标对象生成一个代理对象,在bean factory中该bean id存放的就是该代理对象,当我们通过Cal cal = (Cal)appCtx.getBean(“computer”);
方法取出的就是代理对象。

三、代码
首先,我们要创建一个接口和实现,因为spring的jdk代理需要接口,实现当然需要,就是具体的目标对象的类。
然后就是创建一个通知,就是代理目标对象后,需要做什么
最后,最重要的,就是在xml中创建通知、目标对象的bean以及关联关系。

1、xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
">
<!-- 目标类 -->
<bean id = "computer" >
</bean>

<!-- 通知,即代理后要做什么 -->
<bean id = "interceptor" >
</bean>

<!-- 绑定通知和拦截点 -->
<bean id="sleepAdvisor" >
<property name="advice" ref="interceptor"/>
<property name="pattern" value=".*calculate"/>
</bean>

<!-- 生成自动代理 -->
<bean />

</beans>

2、接口

package springaop;

public interface Cal {
public void calculate(String data);
}

3、目标实现类

package springaop;

public class Computer implements Cal{

@Override
public void calculate(String data) {
System.out.println("i am computer data="+data);
}

}

4、通知

package springaop;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;

public class Interceptor implements MethodBeforeAdvice,AfterReturningAdvice{

@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println("before... method="+method.getName()+" args="+args);

}

@Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
System.out.println("after...");

}

}

5、测试方法

package springaop;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AutoSpringAopTest {
@Test
public void testAOP(){
ApplicationContext appCtx = new ClassPathXmlApplicationContext("autospringaop.xml");
Cal cal = (Cal)appCtx.getBean("computer");
cal.calculate("jianghuiwen");
}
}

四、输出及总结

整个spring aop的核心思想,就是代理,具体说,就是为spring容器中的bean,创建一个代理proxy,该代理proxy持有bean的引用,该代理proxy还绑定了一些自定义的逻辑,在调用该bean的方法的时候,就会执行proxy的业务逻辑。

五、应用遐想
springaop能干什么?很多很多,只要你能想得到。
例如,对某些指定的方法打印日志、计算指定方法的执行时间、计算方法的执行链路、缓存、方法修饰、打印参数、远程调用、异常统一处理、调用统计、指定方法的返回值统计


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24422.html

    分享给朋友:

    “springaop自动代理” 的相关文章

    中国电信CN2网络接入方式解析

    在数字化浪潮席卷全球的今天,网络质量已成为企业生存与发展的关键因素。中国电信作为国内领先的通信运营商,其旗下的CN2网络凭借卓越的性能和覆盖范围,成为众多企业和个人的首选。中国电信CN2网络的接入方式多种多样,您是否清楚每种方式的特点及适用场景?本文将为您逐一解析,帮助您找到最适合的解决方案。中国电...

    中国电信CN2网络费用解析:高效稳定,助力全球互联

    在全球化快速发展的今天,企业对国际网络的需求日益增长。无论是跨国企业的数据传输、海外分支机构的互联,还是个人用户对高质量国际带宽的需求,中国电信CN2网络凭借其卓越的性能和稳定的连接,成为了用户的首选。随着需求的增加,用户对CN2网络的费用结构也愈发关注。本文将深入解析中国电信CN2网络的费用体系,...

    全球主机交流论坛:提升技术的最佳平台

    全球主机论坛概述 在当今数字化时代,全球主机论坛扮演着越来越重要的角色。这些论坛不仅是技术爱好者的聚集地,更是为需要域名、主机、VPS和服务器信息的用户提供了一个交流的平台。我作为一名站长,经常在这样的论坛上交流经验、获取灵感和解决技术难题,论坛的存在极大地丰富了我的网络建设之旅。 主机论坛的定义其...

    选择野草云主机服务,享受高性价比与优质体验

    野草云是一家在2016年成立的主机服务提供商,由国人运营,专注于为中国大陆地区的用户提供优质的服务和产品。作为一家相对年轻的主机商,野草云力求用更贴近用户的方式来满足客户需求,特别是在国内市场需求快速增长的背景下,它的出现让很多用户找到了合适的主机选择。 说到野草云的历史背景,首先让我想起它在竞争激...

    使用宝塔面板配置与优化IPv6技术的全面指南

    宝塔面板简介 宝塔面板是一款非常实用的服务器管理工具,它的功能覆盖了许多方面。从LAMP、LNMP环境的快速搭建到监控、FTP、数据库及JAVA的管理,宝塔面板都能提供一键式的解决方案。通过这样一款工具,服务器的管理不再复杂,用户只需通过友好的Web界面进行操作,即可轻松实现各种任务。 我常常使用宝...

    买域名的全流程攻略:从选择到安全管理

    购买域名是一项非常重要的投资,尤其对于那些希望在网上建立品牌或个人网站的人来说。域名不仅仅是一个网址,它是你在线身份的象征。因此,了解如何选择和购买域名显得极为关键。 选择域名时,需要考虑多个因素。首先,域名应该简洁易记,便于用户输入和分享。其次,关键字的相关性也非常重要,因为一个包含行业相关关键词...