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

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时,需要确保它们的顺序是正确的,以便按照预期生成代理对象。

posted @ 2023-06-24 20:39  夏威夷8080  阅读(689)  评论(0编辑  收藏  举报