Spring AOP 详解

来源:互联网 发布:自学网络编程 编辑:程序博客网 时间:2024/06/03 20:10

            AOP: 面向切面的编程,通过预编译或者动态代理实现程序功能的技术。利用AOP 可以对各模块进行解耦。使业务逻辑各部分耦合度降低,提高重用性,开发效率。

        实现原理: 在以前的开发中AOP底层采用代理机制实现,代理机制的实现又分为  JDK 动态代理和cglib字节码增强。 现在Spring2.0开始 已经加入对Aspect的支持。Spring容器所生产的就是代理类Proxy。

       Spring中创建代理对象就很简单了

                  1: 在Spring配置文件中 先生成几个类  一个是目标类  一个是切面类 

创建一个 切面类   并且继承于 MethodInterceptor  重写invoke函数

@Overridepublic Object invoke(MethodInvocation arg0) throws Throwable {System.out.println("前");  Object obj= arg0.proceed();System.out.println("后");return obj;}


                 

   <!-- 创建目标类 -->  <bean id="us" class="com.heima.proxy.auto.UserServerImpl"></bean>    <!-- 创建切面类 -->  <bean id="adpet" class="com.heima.proxy.auto.MyAdpet"></bean>
 创建之后按照逻辑应该确定切面和目标的关系 并且制定代理哪几个方法

        利用 <aop:config> 标签来进行 关系的绑定

  <!-- AOP编程 -->  <aop:config>  <!-- 切入点 -->    <aop:pointcut expression="execution(* com.heima.proxy.auto.UserServerImpl.deeteUser(..))" id="mypointcut"/>    <!-- 通知  特殊切面 -->    <aop:advisor advice-ref="adpet" pointcut-ref="mypointcut"/>  </aop:config>

     aop:advisor 标签 就是告诉容器 advice-ref我要使用哪个切面   pointcut-ref  :这里就使用Aspect表达式 来告诉容器使用怎么样的表达式

     aop:pointcut:这里申明一个Aspect表达式 

配置完这些 在创建 符合表达式要求的类 就会自动加上 切面类的执行方法 。


  spring 还给我们整理了一套基于注解的配置

  注解使用流程如下 默认加上了spring 所有的命名空间

  1: 在配置文件中扫描注解类 

  <context:component-scan base-package="com.he ima.proxy.xml"></context:component-scan>

  2:确定AOP的生效

   <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

  3: 先使用@Component("userImpl")对目标类进行对象创建 设置对象ID

 4:对切面类进行对象创建@Component   并申明该类为切面类 @Aspect 这里不需要继承于MethodInterceptor

   在切面类中创建你需要执行的方法。 利用  @Before 或者@After  可以制定 在目标类方法执行前执行或执行后执行。 并且在该注解上还可以使用Aspect 表达式

  

@Component@Aspectpublic class MyAdpet  {@Before("execution(* com.heima.proxy.xml.UserServerImpl.*(..))")public void  before() {System.out.println("在方法之前执行");}@After("execution(* com.heima.proxy.xml.UserServerImpl.*(..))")public void  after() {System.out.println("在方法之后执行");}}
  创建符合 Aspect 表达式 的类 并且执行方法 就会自动执行切面函数

0 0