AOP编程

Posted su-feng-address

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP编程相关的知识,希望对你有一定的参考价值。

aop (aspect oriented programing)面向切面编程,是对所有对象或者一类对象编程,核心是在不增加代码的基础上,增加新的功能。

<!--配置被代理对象-->
<bean id="testService" class="...">
<property name="name" value="Sufeng">
</bean>

<!--配置前置通知-->
<bean id="MyMethodBeforeAdvice" class="..."/>

<!--配置代理对象-->
<bean id="proxyFactoryBean" class="org.springframework.ProxyFactory">
<!--配置代理接口集-->
<property name="proxyInterfaces">
<list>
<value> TestServiceInter</value>
</list>
</property>
<!--把通知植入到代理对象-->
<property name="interceptorNames ">
<!--这里相当于把这个前置通知和代理对象关联起来,我们也可以把通知看成是拦截器-->
<value>MyMethodBeforAdvice</value>
</property>
<property name="target">
<value> </value>
</property>
</bean>
</beans>

 1 定义接口

2 编写对象(被代理对象-目标对象)

3 编写通知,通知是通过继承Spring提供的接口体现出来的

4 在beans.xml文件中配置

4.1 配置被代理对象=目标对象

4.2 配置了通知

4.3 配置了代理对象,它是ProxyFactoryBean的一个实例

4.3.1 <!--代理接口集-->

代理对象和被代理对象都实现相同接口;

4.3.2 植入通知

4.3.3  配置被代理对象  代理对象的名字只可以是interceptorName,是因为根据Spring提供的ProxyFactoryBean类内的setInterceptorName()方法注入,类只能是org.springframework.aop.frame.ProxyFactory

同样的,代理对象接口集属性名字也是唯一的,proxyInterfaces,被代理对象的名字只能是target.

 

补讲知识点,见下面的一段代码,试判断代码能否运行?

<!--业务逻辑层代码如下-->
class A{
    
       public void setName(String name){
    
             System.out.println("name ="+name);                    
  
       } 
    
}

<!--Spring配置如下-->
<beans>

<bean id="a" class ="A">

<property name="name"  value="Sufeng"></property>

</beans>

答案是

完全可以,让人普遍接受的说法是

Set方法执行与注入值给与某个参数完全无关,只取决于Spring中是否有相关属性配置,Spring在配置属性值时也只将值赋予给Set方法,且不管Set方法的处理过程。

ProxyFatury时动态代理技术,根据目标对象类型转换类型,若目标类实现了若干接口,Spring使用Java.lang.reflect.Proxy类代理,植入通知,并且代理完成 目标对象的所有请求。若目标对象未实现任何接口,则使用CGLIB接口。

以上是关于AOP编程的主要内容,如果未能解决你的问题,请参考以下文章

AOP 面向切面编程

小议webpack下的AOP式无侵入注入

Spring的AOP面向切面编程

Spring的AOP面向切面编程

面向切面编程

Aop编程