美文网首页spring.io
Spring AOP 自动创建代理

Spring AOP 自动创建代理

作者: Tinyspot | 来源:发表于2022-11-16 22:24 被阅读0次

1. 代理创建器

  • 自动创建代理对象,将一个切面织入到多个目标对象中
  • 三种自动代理创建器
    • BeanNameAutoProxyCreator: 基于配置名规则
    • DefaultAdvisorAutoProxyCreator: 基于 Advisor 匹配机制
    • AbstractAdvisorAutoProxyCreator:

2. BeanNameAutoProxyCreator

2.1 剖析 BeanNameAutoProxyCreator

  • BeanNameAutoProxyCreator 间接继承 BeanPostProcessor
image.png
public class BeanNameAutoProxyCreator extends AbstractAutoProxyCreator {
    // e.g. "myBean,tx*"
    public void setBeanNames(String... beanNames) {
        Assert.notEmpty(beanNames, "'beanNames' must not be empty");
        this.beanNames = new ArrayList<>(beanNames.length);
        for (String mappedName : beanNames) {
            this.beanNames.add(StringUtils.trimWhitespace(mappedName));
        }
    }
}

2.2 自定义拦截器链

  • beanNames 指定一组需要自动代理的Bean
  • interceptorNames 指定一个或多个增强Bean
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
import org.aopalliance.aop.Advice;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Aspect
@Configuration
public class BusinessInterceptorConfig {

    @Bean
    public BeanNameAutoProxyCreator beanNameAutoProxyCreator() {
        BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator();
        // creator.setBeanNames("greetService", "userService");
        creator.setBeanNames("*Impl");
        // 设置拦截链,有顺序
        creator.setInterceptorNames("sessionIntercept", "loginIntercept");
        // creator.setProxyTargetClass(true);
        return creator;
    }

    // 创建Advice
    @Bean
    public Advice sessionIntercept() {
        return new SessionIntercept();
    }

    @Bean
    public Advice loginIntercept() {
        return new LoginIntercept();
    }
}
@Slf4j
public class SessionIntercept implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        log.info(this.getClass() + "; " + invocation.getMethod().getName() + "; do something...");
        return invocation.proceed();
    }
}

@Slf4j
public class LoginIntercept implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        log.info(this.getClass() + "; " + invocation.getMethod().getName() + "; do something...");
        return invocation.proceed();
    }
}

3. DefaultAdvisorAutoProxyCreator

  • 扫描容器中的 Advisor, 并自动为匹配的目标 Bean 创建代理

相关文章

网友评论

    本文标题:Spring AOP 自动创建代理

    本文链接:https://www.haomeiwen.com/subject/oteuxdtx.html