赣州新闻网

首页 / 科技

使用TensorFlow.js在浏览器中实时估计人体姿态

2020-04-01 · 赣州新闻网 · 科技

什么是aop

AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programin f } ig,面I F L ! p ^ 0 _向对象编程)的补充和完善。OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往3 q V 9水平地散布在所有对象层次中h 5 Z O P p M F,而与它所散布到的对象的核心功能毫无关系。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在O& 6 t Q ` n = 2OP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

天天用的spring框架,你可能根本没有弄明白其底层的原理

而AOP技术则恰* e - 6 2恰相反,它利g 4 * & e S E J用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公P + X ] + H共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面o 0 E c”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

aop使用场景

aop框架种类

  • AspectJ
  • JBos2 f us AOP
  • Sprir g ) w 7 p # Ing AOP

使用aop可以R - M ~ a p i j }做的事情有很多。

  • 性能监控,在方法调用前后记录调用时间,方法执行太I S X Y r D k长或超时报警。
  • 缓存代理,缓存某方法的I 1 w ~ationContext.U 7 q Yxml中配B _ 4 K 9 L O g置。

    <aop:aspectj-autoproxy />

    <bean id = \"tm W x LransactionDemo\" class = \"com.yangxin.core.transaction.TransactionDemo\" /{ $ w P>

    sprinI l y Cg aop原理

    通过前面介绍可以知道:AOP 代理其实是由 AOY w % j LP 框架动态V V ; | a生成的一个对象,该对象可作为目标对象使用。AOP 代理包含了目标对象的全部r ^方法,但 AOP 代理中的方法与目标对象的方法存在差异& 1 ) * V 2 ] 3:AOP 方法在特定切入点添加了增强处理,并回调了目标对象的方法。

    天天用的spring框架,你可能根本没有弄明白其底层的原理

    Sp= % { W ` Rring 的 AOP 代理由 Spring 的 IoC 容器负责生成、管理,其依赖关系也由 IoC 容器负责管理。因此,AOP 代理可以直接使用容器中的其他 Bean 实例作为目标,这种关系可由 IoC 容器的依赖注入提供。

    aop开发时,其中需要程序员参与的只有 3 个部分:

    • 定` H 3 ~ S n义普通业务组件。
    • 定义切入点,一个切入点可能横切多个业务组件。
    • 定义增强处理,增强处理就是在 AOP 框架为普通业务组件织入的处理动作。

    为了理清关系,先来个类关系图。

    天天用的spring框架,你可能根本没有弄明白其底层的原理

    两种动态代理方式

    Spring默认采取的动M } D F j态代理机制实现AOP,当动态代理不可用时) 3 M p t |(代理类无接口)会使用CGlib机制。

    Spr4 l / | S C c NinY } hg提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪种方式生成由Aopf 7 _ B IProxyFactory根据AdvisedSup9 d W D Tport对象的配置来决定。默认的策略是如果目标类是接口,则使用JDK动态代: ) U c ; ,理技h { U { H Y术,否则使用Cglib来 4 $ |生成代理。

    JDK动态代理

    • JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制J N k Z v ! Z调用目标类的代码,动态将w L q h N s ( I横切逻辑和业务逻辑编制在一起。
    • Proxy利用InvocationHandler动态创F + F Z E R [建一个符合某一接口的实例,生成目标类的代理对象。? 9 x ?

    CGLib动态代理

    • CGLib全称为Code Generation Library,是一个强大的高性能,高质量的代码生成类库,可以在运行期扩展Java类与实现Java接s g u L e J q ,口,CGLib封装了i 4 F *asm,可以再运行期动态生成5 p h W v Z + % 8新的class。和JDK动态V 5 ~ ;代理相比较:JDK创9 V v +建代理有一个限制,就是只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则可以通过CGLiv r ? #b创建动} _ M - n态代理。

    知识拓展

    通过上面的分析,大家是否有种熟悉的感觉,似乎和拦截器、过滤器的功能相似。那么问题来了M Q V 5 B z C H,aop与拦截0 0 J p ^ G Y P器、过滤器是什么关系。

    先来回顾一下拦截器与过滤器。如下图一网友的测试,在web.xml中注册了TestFilter1和TestFilter2。然后在spring的配置文件中配置了BaseInterceptor和TestInterceptor。得到的结果如下图所示。从图中可以看出,拦截器和过滤器都横切了业务方法,看似 e t Y j 9 R .符合aop的思想。

    天天用的spring框架,你可能根本没有弄明白其底层的原理

    Filter过滤器:拦截web访问url地址。 Interceptor拦截器:拦截以 .action结尾的url,拦截Action的访问。 Spring AOP拦截器:只能拦截Spring管理BeL & + k j a @an的访问(业$ E | g i y p N务层Service)

    天天用的spring框架,你可能根本没有弄明白其底层的原理

    写在最后,希望文章对在java开发路上的你,有些帮助!

    下篇文章将会写Spring cache的内容,同样以思维导图n ~ a | 3 1 ! %的方式编写。可视化学习,让java不再难懂。

    码农三哥,一名普通程序员,会点java软件开发,对AI人工智能有点兴趣,后续E Q q @会每日分享些关于互联网技术方面的文章,感兴趣的朋友可以关注我,一o @ $ P L Y u e !起交流学习。

    想转型或刚步入程序员Java开发的朋友,有问题可以留言或私信我。

    再次感谢你的阅读!

测试工作文章接口维护网友估计人体会昌