spring AOP

来源:互联网 发布:手机知乎怎么复制 编辑:程序博客网 时间:2024/06/06 10:05

AOP

AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。


AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。


spring还有一个特点就是极度化简洁了代码  保证了代码的不重复性

因为代码都写在了配置里 可维护性高


spring重点是前置通知和后置通知包括过滤事件 可以用作于事物(开始和结束)

不过前置通知的基础上是动态代理 和静态代理

举一个静态代理的列子  

列如明星和经纪人之间的关系

Artor 艺人类

    package com.zking.proxy;


public interface Artor {
     public void show();
     public void danceSing();
}


BaoBaoWang 明星类 

明星需要实现一个接口  因为经纪人代理明星需要从明星那里拿到同意 

所以我们需要些一个接口

package com.zking.proxy;


public class BaoBaoWang implements Artor{


public void show() {
System.out.println("展示....");

}


public void danceSing() {
System.out.println("歌唱....");

}


}


SongZhe 经纪人

因为经纪人是代理明星的 所以决定需要从明星那里得到

(最好不要有这样的经纪人 表面上装的像模像样 背地里捅你一刀)


package com.zking.proxy;


public class SongZhe implements Artor{


private Artor artor;

public SongZhe(Artor artor) {
this.artor=artor;
}

public void show() {
artor.show();

}


public void danceSing() {
artor.danceSing();

}


}


//执行

Artor artor=new BaoBaoWang();
artor=new SongZhe(artor);
artor.show();


如果需要加入前置通知和后置通知的话

我们需要写一个spring配置文件

  <!-- 配置目标 -->
    <bean id="yangmi" class="com.zking.proxy.BaoBaoWang"></bean>
   
   <!-- 配置通知 -->
   <bean id="mf" class="com.zking.proxy.SongZhe"></bean>
   
   <!-- 配置前置通知 -->
   <bean id="before" class="com.zking.proxyspring.Before"></bean>
   
   <!-- 过滤器 如果方法里有play 就不显示前置通知 -->
   <bean id="before_gl" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
     <property name="advice" ref="mf"></property>

     <property name="pattern" value=".*play.*"></property>
   </bean>
   
   <!-- 配置后置通知 -->
   <bean id="after" class="com.zking.proxyspring.After"></bean>
   
  <!-- 配置混合代理对象 -->
  <bean id="myProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
      <!-- 引入目标 -->
      <property name="target" ref="yangmi"></property>
      <!-- 引用目标实现的所有接口 -->
      <property name="proxyInterfaces">
       <list>
           <value>com.zking.proxyspring.Artor</value>
       </list>
      </property>
      <!-- 引用通知 -->
      <property name="interceptorNames">
         <list>
          <idref bean="before_gl"/>
            <idref bean="mf"/>
             <idref bean="after"/>
         </list>
      </property>
  </bean>

以上:name代表的是系统的名字 com.zking开头的是我自己写的类 其他的是系统的类


但是:我们需要加入spring jar包 

如果用的是maven 那么加入spring的依赖

<!-- 引入Spring依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.10.RELEASE</version>
    </dependency>


给大家推荐一个网址 里面全部是依赖

http://mvnrepository.com/


前置通知

package com.zking.proxyspring;


import java.lang.reflect.Method;


import org.springframework.aop.MethodBeforeAdvice;


/**
 * 前置通知
 * @author Administrator
 *
 */
public class Before implements MethodBeforeAdvice{


public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
System.out.println("一见钟情 难以忘怀");

}


}


后置通知

package com.zking.proxyspring;


import java.lang.reflect.Method;


import org.springframework.aop.AfterReturningAdvice;


/**
 * 后置通知
 * @author Administrator
 *
 */
public class After implements AfterReturningAdvice{


public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
System.out.println("余生再也没有你...");

}


}


执行

package com.zking.proxyspring;


import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Testproxy {
@Test
  public void test(){
 ApplicationContext context=new ClassPathXmlApplicationContext("ServerContext.xml");
 Artor artor=(Artor) context.getBean("myProxy");
 artor.play();
  }
}
















原创粉丝点击