首页 > 其他分享 >spring aop里的三种不同类型的自动代理介绍

spring aop里的三种不同类型的自动代理介绍

时间:2023-06-24 20:56:43浏览次数:38  
标签:创建 spring AOP 代理 Bean 三种 BeanNameAutoProxyCreator aop DefaultAdvisorAutoProxyCre

spring aop里的三种不同类型的自动代理介绍

Metadata autoproxying

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

 

Metadata autoproxying 介绍

在Spring AOP中,Metadata autoproxying(元数据自动代理)是一种基于元数据配置的自动代理创建方式,它是我们最常用的一种自动代理方式。它可以根据类级别或方法级别的元数据信息来决定是否对目标对象进行代理。

元数据可以通过各种方式提供,包括使用注解、XML配置文件或自定义标记等。Spring AOP会根据这些元数据信息来自动创建代理对象,并将切面逻辑织入到目标对象的方法调用中。

元数据自动代理的核心是使用Advisor和Pointcut来定义切面逻辑。Advisor是一个包含Advice和Pointcut的组合,其中Advice指定了切面逻辑,而Pointcut则定义了要拦截的方法匹配规则。Pointcut可以通过元数据来定义,以确定是否对目标对象的方法进行代理。

有几种常见的元数据方式可以实现Metadata autoproxying:

  1. 使用注解:通过在目标类或方法上添加注解,如@AspectJ注解或自定义注解,来标识切面逻辑和拦截规则。

  2. XML配置文件:在Spring的XML配置文件中,可以使用<aop:config>元素来定义Advisor和Pointcut,其中Pointcut可以通过表达式来匹配目标对象的方法。

  3. 自定义标记:可以自定义特定的标记,用于标识目标对象是否需要被代理。这些标记可以通过编程方式或配置文件来提供,并由Spring AOP进行解析和处理。

元数据自动代理允许开发人员在不修改目标类代码的情况下,通过配置元数据信息来实现对目标对象的代理。这种方式灵活且易于维护,可以根据需求选择适合的元数据配置方式,实现精确的AOP功能。

 

spring aop里的BeanNameAutoProxyCreator

 

在Spring AOP中,BeanNameAutoProxyCreator是一个自动代理创建器,用于基于Bean名称的自动代理。

BeanNameAutoProxyCreator可以通过配置来创建代理对象,并将这些代理对象应用于特定的Bean。它会根据指定的Bean名称和匹配模式来确定需要代理的Bean,并为这些Bean创建代理对象。

具体而言,BeanNameAutoProxyCreator会检查容器中的所有Bean的名称,如果某个Bean的名称与指定的名称模式匹配,就会为该Bean创建代理对象。被代理的Bean将会受到AOP通知,即在调用其方法时会执行切面逻辑。

BeanNameAutoProxyCreator的配置通常包括以下几个要素:

  1. proxyTargetClass:指定是否使用CGLIB代理,默认为false。如果目标Bean没有实现接口,可以将此属性设置为true,强制使用CGLIB代理。

  2. beanNames:指定需要被代理的Bean的名称。可以使用通配符()来匹配多个Bean名称,例如:"myService"、"my"、"*Service"等。

  3. interceptorNames:指定要应用的Advice或Advisor的名称。这些Advice或Advisor将会被织入到代理对象中,实现横切关注的功能。

通过配置BeanNameAutoProxyCreator,我们可以方便地基于Bean名称来自动创建代理对象,并将切面逻辑应用于特定的Bean。这使得我们可以针对特定的Bean进行个性化的AOP配置,而不需要手动在每个地方创建代理对象或应用Advice。

BeanNameAutoProxyCreator 使用demo

首先,我们需要创建一个目标类(Target)和一个切面类(LoggingAspect),如下所示:

public class Target {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}

public class LoggingAspect {
    public void beforeAdvice() {
        System.out.println("Before advice: Logging...");
    }
}

接下来,在Spring配置文件(例如applicationContext.xml)中配置BeanNameAutoProxyCreator和相关Bean:

 
<bean id="target" class="com.example.Target" />

<bean id="loggingAspect" class="com.example.LoggingAspect" />

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames">
        <list>
            <value>target</value>
        </list>
    </property>
    <property name="interceptorNames">
        <list>
            <value>loggingAspect</value>
        </list>
    </property>
</bean>

在这个配置中,我们指定了要被代理的Bean名称为"target",并指定了要应用的切面名称为"loggingAspect"。这样,当调用"target" Bean的方法时,切面逻辑就会被织入进去。

最后,我们编写一个测试类(Main)来验证效果:

 
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Target target = (Target) context.getBean("target");

        target.doSomething();
    }
}

当我们运行Main类时,会输出以下内容:

 
Before advice: Logging...
Doing something...

通过以上示例,我们成功地使用BeanNameAutoProxyCreator在目标类的方法执行前应用了LoggingAspect的切面逻辑。你可以根据自己的需求进行配置和扩展,实现更加复杂的AOP场景。

 

DefaultAdvisorAutoProxyCreator 和 BeanNameAutoProxyCreator 有什么关联?

 

DefaultAdvisorAutoProxyCreator与BeanNameAutoProxyCreator是Spring AOP中两个常用的自动代理创建器,它们之间存在关联。

DefaultAdvisorAutoProxyCreator是一个基于Advisor的自动代理创建器,它会根据配置的Advisor对象自动创建代理对象。它会扫描容器中的所有Bean,并为匹配的Bean创建代理对象。DefaultAdvisorAutoProxyCreator会将所有的Advisor应用到所有符合条件的Bean上,实现AOP功能。

BeanNameAutoProxyCreator则是一个基于Bean名称的自动代理创建器,它会根据指定的Bean名称和匹配模式来确定需要代理的Bean,并为这些Bean创建代理对象。它只针对特定的Bean进行代理创建,并将切面逻辑应用于这些Bean。

这两个自动代理创建器可以通过配置来实现不同的AOP场景。默认情况下,如果同时配置了DefaultAdvisorAutoProxyCreator和BeanNameAutoProxyCreator,Spring优先使用DefaultAdvisorAutoProxyCreator创建代理对象。也就是说,DefaultAdvisorAutoProxyCreator会先于BeanNameAutoProxyCreator执行。

在某些情况下,我们可能需要根据不同的需求选择使用DefaultAdvisorAutoProxyCreator或BeanNameAutoProxyCreator。例如,如果希望通过配置Advisor来实现全局的AOP,可以选择使用DefaultAdvisorAutoProxyCreator;而如果只想针对特定的Bean进行个性化的AOP配置,可以选择使用BeanNameAutoProxyCreator。

需要注意的是,在配置文件中同时使用DefaultAdvisorAutoProxyCreator和BeanNameAutoProxyCreator时,需要确保它们的顺序是正确的,以便按照预期生成代理对象。

标签:创建,spring,AOP,代理,Bean,三种,BeanNameAutoProxyCreator,aop,DefaultAdvisorAutoProxyCre
From: https://www.cnblogs.com/shamo89/p/17501667.html

相关文章

  • [java学习] Spring的分页插件的使用
    概述:SSM集成常会使用到分页,Spring中提供了方便实用的分页插件  第一步:在Mybatis配置文件(SqlMapConfig.xml)中配置插件组件:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://myb......
  • 什么是Spring AOP里的引入(Introduction)?
    在SpringAOP中,引入(Introduction)是一种特殊类型的通知,允许我们向现有的类添加新的接口和实现,而无需修改原始类的代码。引入提供了一种扩展现有类功能的方式,它允许我们在运行时为类动态地添加新的方法和属性。通过引入,我们可以将新的行为添加到现有的类中,而无需继承该类或修改其代......
  • Spring Cloud 总览表
    SpringCloud总览表微服务技术注册发现远程调用配置管理负载均衡网关路由流量控制系统保护熔断降级服务授权分布式事务TCC模型AT模型Seata缓存技术Redis数据结构SpringDataRedis缓存穿透、雪崩OpenResty多级缓存缓存数据同步Nginx本地缓存数据持......
  • SpringCloud Alibaba入门3之nacos服务搭建
    我们继续在上一章的基础上学习。https://blog.51cto.com/u_13312531/6539601一、下载nacos-server从https://github.com/alibaba/nacos/releasesopeninnewwindow 下载nacos-server发行版。我们使用1.4.2版本二、启动nacos进入%path%\nacos\bin文件夹,执行cmd命令startup.cmd-m......
  • 10. Spring整合
    课程学习到这里,已经对Spring有一个简单的认识了,Spring有一个容器,叫做IoC容器,里面保存bean。在进行企业级开发的时候,其实除了将自己写的类让Spring管理之外,还有一部分重要的工作就是使用第三方的技术。前面已经讲了如何管理第三方bean了,下面结合IoC和DI,整合2个常用......
  • SMU Spring 2023 Contest Round 6
    E.ExpenditureReduction从左右往右找到包含B字符的最近位置,然后从这个位置有从右到左找回去找到包含完所有B字符的位置,这个区间就是答案#include<bits/stdc++.h>#defineinf0x3f3f3f3f#defineendl'\n'#defineintlonglongusingnamespacestd;constintN=......
  • Spring接口简单使用
    Spring接口简单使用ApplicationContextAwareApplicationContextAware是一个Spring接口,用于在Spring应用程序中获取ApplicationContext对象。ApplicationContext是Spring框架对Bean的管理容器,它负责加载、配置和管理应用程序中的Bean。使用ApplicationContextAwar......
  • 微服务 – Spring Cloud – Gateway
    微服务–SpringCloud–GatewayApi网关(ApiGateway)微服务可能分布在不同的主机上,这样有许多缺点:前端需要硬编码调用不同地址的微服务很麻烦;存在跨域访问的问题;微服务地址直接暴露是不安全的。还有所以需要为前端提供一个统一的访问入口。Gateway就是用于解决以上问题的框......
  • Apollo2.1.0+Springboot使用OpenApI
    依赖管理<!--bootstrap最高级启动配置读取--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.1.3</v......
  • springcloud项目启动后立即停止
    刚学完springcloud,只看了一遍课没有动手实践,现在第一次自己动手操作的时候不知道该选哪些依赖该怎么配置。依赖全选上后因为各自配置问题运行不起来,只能先从最简单的开始慢慢加依赖。这次只选了nacos和feign,成功运行,项目也没有报错,但是运行后项目立马停止。 百度了一下原因......