热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

王国_Spring繁华的AOP王国第二讲

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Spring繁华的AOP王国---第二讲相关的知识,希望对你有一定的参考价值。Spring繁华的AOP王国-

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Spring繁华的AOP王国---第二讲相关的知识,希望对你有一定的参考价值。



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


  • Spring AOP的织入
    • 如何与ProxyFactory打交道
      • 1.基于接口的代理
      • 2.基于类的代理
      • 3.Introduction的织入

    • 看清ProxyFactory的本质
      • ProxyConfig
      • Advised
      • AdvisedSupport
      • ProxyFactory,AopProxy,AdvisedSupport与ProxyFactory的关系
      • 小结

    • 容器中的织入器---ProxyFactoryBean
      • ProxyFactoryBean的本质
      • ProxyFactoryBean的使用

    • 加快织入的自动化进程
      • 使用自动代理的实现机制
      • 可用的AutoProxyCreator
        • BeanNameAutoProxyCreator
        • DefaultAdvisorAutoProxyCreator
        • 扩展AutoProxyCreator



  • TargetSource
    • 可用的targetSource实现类
      • SingletonTargetSource
      • PrototypeTargetSource
      • HotSwappableTargetSource
      • CommonsPool2TargetSource
      • ThreadLocalTargetSource
      • 自定义TargetSource





Spring繁华的AOP王国—第一讲




Spring AOP的织入





如何与ProxyFactory打交道




public interface ITask
void excute();

public class MockTask implements ITask
@Override
public void excute()
System.out.println("task excuted!");


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.基于接口的代理

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();



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.基于类的代理

public class MockTask
public void excute()
System.out.println("task excuted!");


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的本质

public interface AopProxy
Object getProxy();
Object getProxy(@Nullable ClassLoader var1);



public interface AopProxyFactory
AopProxy createAopProxy(AdvisedSupport var1) throws AopConfigException;


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 &#61; config.getTargetClass();
if (targetClass &#61;&#61; 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 &#61; config.getProxiedInterfaces();
return ifcs.length &#61;&#61; 0 || ifcs.length &#61;&#61; 1 && SpringProxy.class.isAssignableFrom(ifcs[0]);







ProxyConfig

public class ProxyConfig implements Serializable
private static final long serialVersionUID &#61; -8409359707199703185L;
private boolean proxyTargetClass &#61; false;
private boolean optimize &#61; false;
boolean opaque &#61; false;
boolean exposeProxy &#61; false;
private boolean frozen &#61; false;
....




Advised


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的关系








小结



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

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

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

public class ProxyCreatorSupport extends AdvisedSupport
private AopProxyFactory aopProxyFactory;
private final List<AdvisedSupportListener> listeners &#61; new ArrayList();
private boolean active &#61; false;
public ProxyCreatorSupport()
this.aopProxyFactory &#61; new DefaultAopProxyFactory();


public ProxyCreatorSupport(AopProxyFactory aopProxyFactory)
Assert.notNull(aopProxyFactory, "AopProxyFactory must not be null");
this.aopProxyFactory &#61; aopProxyFactory;

....
protected final synchronized AopProxy createAopProxy()
if (!this.active)
this.activate();

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




容器中的织入器—ProxyFactoryBean





ProxyFactoryBean的本质

&#64;Nullable
public Object getObject() throws BeansException
this.initializeAdvisorChain();
if (this.isSingleton())
return this.getSingletonInstance();
else
if (this.targetName &#61;&#61; null)
this.logger.info("Using non-singleton proxies with singleton targets is often undesirable. Enable prototype proxies by setting the &#39;targetName&#39; property.");

return this.newPrototypeInstance();





ProxyFactoryBean的使用


















加快织入的自动化进程




使用自动代理的实现机制





可用的AutoProxyCreator


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




BeanNameAutoProxyCreator









DefaultAdvisorAutoProxyCreator







扩展AutoProxyCreator






TargetSource






可用的targetSource实现类




SingletonTargetSource





PrototypeTargetSource






HotSwappableTargetSource



var cpro_id = "u6885494";

推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 如何基于ggplot2构建相关系数矩阵热图以及一个友情故事
    本文介绍了如何在rstudio中安装ggplot2,并使用ggplot2构建相关系数矩阵热图。同时,通过一个友情故事,讲述了真爱难觅的故事背后的数据量化和皮尔逊相关系数的概念。故事中的小伙伴们在本科时参加各种考试,其中有些沉迷网络游戏,有些热爱体育,通过他们的故事,展示了不同兴趣和特长对学习和成绩的影响。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Inno Setup区段之Components篇相关知识详解
    本文详细介绍了Inno Setup区段之Components篇相关的知识,包括Components和Types的使用方式以及各个参数的说明,希望对读者有一定的参考价值。内容涵盖了ComponentsName、Description、Types、ExtraDiskSpaceRequired、ExtraDiskSpaceRequiredFlags等多个关键词,帮助读者更好地理解和应用Inno Setup区段之Components篇的知识。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
author-avatar
好富饶_152
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有