前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring繁华的AOP王国---第二讲

Spring繁华的AOP王国---第二讲

作者头像
大忽悠爱学习
发布2022-05-10 16:06:16
2080
发布2022-05-10 16:06:16
举报
文章被收录于专栏:c++与qt学习

Spring繁华的AOP王国---第二讲


Spring繁华的AOP王国—第一讲


Spring AOP的织入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如何与ProxyFactory打交道

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
public interface ITask {
    void excute();
}
代码语言:javascript
复制
public class MockTask implements ITask{
    @Override
    public void excute() {
        System.out.println("task excuted!");
    }
}
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
public class PerformanceMethodInterceptor implements MethodInterceptor {
    @Nullable
    @Override
    public Object invoke(@Nonnull MethodInvocation methodInvocation) throws Throwable {
        long start = System.currentTimeMillis();
        System.out.println("方法执行前...");
        Thread.sleep(1000);
        Object proceed = methodInvocation.proceed();
        Thread.sleep(1000);
        System.out.println("方法执行后");
        long end = System.currentTimeMillis();
        System.out.println("方法执行总耗时: "+String.valueOf(end-start));
        return proceed;
    }
}
在这里插入图片描述
在这里插入图片描述

1.基于接口的代理

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
        MockTask task=new MockTask();
        ProxyFactory weaver=new ProxyFactory(task);
        weaver.setInterfaces(ITask.class);
        NameMatchMethodPointcutAdvisor advisor=new NameMatchMethodPointcutAdvisor();
        advisor.setMappedName("excute");
        advisor.setAdvice(new PerformanceMethodInterceptor());
        weaver.addAdvisor(advisor);
        ITask proxyObject= (ITask) weaver.getProxy();
        proxyObject.excute();
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
        MockTask task=new MockTask();
        ProxyFactory weaver=new ProxyFactory(task);
        NameMatchMethodPointcutAdvisor advisor=new NameMatchMethodPointcutAdvisor();
        advisor.setMappedName("excute");
        advisor.setAdvice(new PerformanceMethodInterceptor());
        weaver.addAdvisor(advisor);
        ITask proxyObject= (ITask) weaver.getProxy();
        proxyObject.excute();
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.基于类的代理

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
public class MockTask {
    public void excute() {
        System.out.println("task excuted!");
    }
}
代码语言:javascript
复制
        MockTask task=new MockTask();
        ProxyFactory weaver=new ProxyFactory(task);
        NameMatchMethodPointcutAdvisor advisor=new NameMatchMethodPointcutAdvisor();
        advisor.setMappedName("excute");
        advisor.setAdvice(new PerformanceMethodInterceptor());
        weaver.addAdvisor(advisor);
        MockTask proxy = (MockTask)weaver.getProxy();
        proxy.excute();
        System.out.println(proxy.getClass());
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.Introduction的织入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

看清ProxyFactory的本质

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
public interface AopProxy {
    Object getProxy();

    Object getProxy(@Nullable ClassLoader var1);
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
public interface AopProxyFactory {
    AopProxy createAopProxy(AdvisedSupport var1) throws AopConfigException;
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
    public DefaultAopProxyFactory() {
    }

    public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        if (NativeDetector.inNativeImage() || !config.isOptimize() && !config.isProxyTargetClass() && !this.hasNoUserSuppliedProxyInterfaces(config)) {
            return new JdkDynamicAopProxy(config);
        } else {
            Class<?> targetClass = config.getTargetClass();
            if (targetClass == null) {
                throw new AopConfigException("TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.");
            } else {
                return (AopProxy)(!targetClass.isInterface() && !Proxy.isProxyClass(targetClass) ? new ObjenesisCglibAopProxy(config) : new JdkDynamicAopProxy(config));
            }
        }
    }

    private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {
        Class<?>[] ifcs = config.getProxiedInterfaces();
        return ifcs.length == 0 || ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0]);
    }
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ProxyConfig

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
public class ProxyConfig implements Serializable {
    private static final long serialVersionUID = -8409359707199703185L;
    private boolean proxyTargetClass = false;
    private boolean optimize = false;
    boolean opaque = false;
    boolean exposeProxy = false;
    private boolean frozen = false;
    ....
    }

Advised

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
public interface Advised extends TargetClassAware {
    boolean isFrozen();

    boolean isProxyTargetClass();

    Class<?>[] getProxiedInterfaces();

    boolean isInterfaceProxied(Class<?> var1);

    void setTargetSource(TargetSource var1);

    TargetSource getTargetSource();

    void setExposeProxy(boolean var1);

    boolean isExposeProxy();

    void setPreFiltered(boolean var1);

    boolean isPreFiltered();

    Advisor[] getAdvisors();

    default int getAdvisorCount() {
        return this.getAdvisors().length;
    }

    void addAdvisor(Advisor var1) throws AopConfigException;

    void addAdvisor(int var1, Advisor var2) throws AopConfigException;

    boolean removeAdvisor(Advisor var1);

    void removeAdvisor(int var1) throws AopConfigException;

    int indexOf(Advisor var1);

    boolean replaceAdvisor(Advisor var1, Advisor var2) throws AopConfigException;

    void addAdvice(Advice var1) throws AopConfigException;

    void addAdvice(int var1, Advice var2) throws AopConfigException;

    boolean removeAdvice(Advice var1);

    int indexOf(Advice var1);

    String toProxyConfigString();
}

AdvisedSupport

在这里插入图片描述
在这里插入图片描述

ProxyFactory,AopProxy,AdvisedSupport与ProxyFactory的关系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上面的图只是画了一个大概的联系,大家再结合上面的文件好好理解一下

ProxyCreatorSupport内部拥有一个AopProxyFactory的对象实例,但是获取AopProxy的时候,是通过AopProxyFactory 的createAopProxy方法中传入自身实例ProxyCreatorSupport,来得到一个指定的AopProxy的,通过AopProxy 我们就可以获取到被代理后的对象

之说以传入自身,是因为ProxyCreatorSupport实现了AdvisedSupport,AdvisedSupport又实现了Advised接口,可以因此来获取到被代理对象实例和横切逻辑

代码语言:javascript
复制
public class ProxyCreatorSupport extends AdvisedSupport {
    private AopProxyFactory aopProxyFactory;
    private final List<AdvisedSupportListener> listeners = new ArrayList();
    private boolean active = false;

    public ProxyCreatorSupport() {
        this.aopProxyFactory = new DefaultAopProxyFactory();
    }
    
    public ProxyCreatorSupport(AopProxyFactory aopProxyFactory) {
        Assert.notNull(aopProxyFactory, "AopProxyFactory must not be null");
        this.aopProxyFactory = aopProxyFactory;
    }
    ....
    protected final synchronized AopProxy createAopProxy() {
        if (!this.active) {
            this.activate();
        }

        return this.getAopProxyFactory().createAopProxy(this);
    }

容器中的织入器—ProxyFactoryBean

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ProxyFactoryBean的本质

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
    @Nullable
    public Object getObject() throws BeansException {
        this.initializeAdvisorChain();
        if (this.isSingleton()) {
            return this.getSingletonInstance();
        } else {
            if (this.targetName == null) {
                this.logger.info("Using non-singleton proxies with singleton targets is often undesirable. Enable prototype proxies by setting the 'targetName' property.");
            }

            return this.newPrototypeInstance();
        }
    }
在这里插入图片描述
在这里插入图片描述

ProxyFactoryBean的使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

加快织入的自动化进程

在这里插入图片描述
在这里插入图片描述

使用自动代理的实现机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可用的AutoProxyCreator

在这里插入图片描述
在这里插入图片描述

需要明确一点,既然我们使用了自动代理来自动为容器中符合条件的bean生成代理对象,那么我们只需要在配置文件中指定切入点和advice即可了


BeanNameAutoProxyCreator
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DefaultAdvisorAutoProxyCreator
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

扩展AutoProxyCreator
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TargetSource

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可用的targetSource实现类

在这里插入图片描述
在这里插入图片描述

SingletonTargetSource

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

PrototypeTargetSource

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

HotSwappableTargetSource

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CommonsPool2TargetSource

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ThreadLocalTargetSource

在这里插入图片描述
在这里插入图片描述

自定义TargetSource

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
public interface TargetSource extends TargetClassAware {
    @Nullable
    Class<?> getTargetClass();

    boolean isStatic();

    @Nullable
    Object getTarget() throws Exception;

    void releaseTarget(Object var1) throws Exception;
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring繁华的AOP王国---第二讲
  • Spring AOP的织入
    • 如何与ProxyFactory打交道
      • 1.基于接口的代理
      • 2.基于类的代理
      • 3.Introduction的织入
    • 看清ProxyFactory的本质
      • ProxyConfig
      • Advised
      • AdvisedSupport
      • ProxyFactory,AopProxy,AdvisedSupport与ProxyFactory的关系
      • 小结
    • 容器中的织入器—ProxyFactoryBean
      • ProxyFactoryBean的本质
      • ProxyFactoryBean的使用
    • 加快织入的自动化进程
      • 使用自动代理的实现机制
      • 可用的AutoProxyCreator
  • TargetSource
    • 可用的targetSource实现类
      • SingletonTargetSource
      • PrototypeTargetSource
      • HotSwappableTargetSource
      • CommonsPool2TargetSource
      • ThreadLocalTargetSource
      • 自定义TargetSource
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档