chapter03 Spring的AOP

chapter03 SpringAOP

一、AOP(Aspect-oriented programming,面向切面编程)

  什么是AOP

  定义:将程序中的交叉业务逻辑提取出来,封装成切面。然后由AOP容器的功能织入到具体的业务模块当中,然后生成一个代理对象的过程。

例如:安全,事务,日志等都属于交叉业务逻辑。他们的特点是都是通用的并且与具体的业务逻辑无关。他们往往与具体的业务逻辑交织在一起、

 

切面------织入----->目标对象-------生成------>AOP代理

 

AOP实现的方式:

1.使用特殊的编译器,直接将切面代码写入到目标对象的字节码当中,它的优点是速度快,实现困难 AspectJ

2.在目标类加载是将切面代码织入到目标对象当中,需要实现一个classloader

3.SpringAOP实现方式:利用动态代理机制

二、AOP核心概念

  1Aspect(切面)

  切面,是对交叉业务逻辑的统称。

  2Joinpoint(连接点)抽象的概念

  连接点,指切面可以织入到目标对象的位置(方法,属性等)。

  3Advice(通知)

  通知,指切面的具体实现。

  4Pointcut(切入点)

  切入点,指通知应用到哪些类的哪些方法或属性之上的规则。(即切面具体织入的位置)

  5Introduction(引入)

  引入,指动态地给一个对象增加方法或属性的一种特殊的通知。

  6Weaving(织入)

  织入,指将通知插入到目标对象。

  7Target(目标对象)

  目标对象,指需要织入切面的对象。

  8Proxy(代理对象)

  代理对象,指切面织入目标对象之后形成的对象。

AOP采用代理模式实现的原理:

1.静态代理模式:

package aop1;

//目标对象或叫目标类

public class CustomerService implements ICustomerService{

       @Override

       public void register() {

              System.out.println("register");      

       }

}

package aop1;

//代理接口

public interface ICustomerService {

   public void register();

}

package aop1;

import java.util.Date;

//代理类

public class CustomerProxy implements ICustomerService{

    private ICustomerService isc;

       public CustomerProxy() {

              super();

       }

       public CustomerProxy(ICustomerService isc) {

              super();

              this.isc = isc;

       }

       @Override

       public void register() {

              //交叉业务(切面代码),由代理类实现

              System.out.println("current time is :"+new Date());

              //核心业务逻辑,由目标对象来实现

              isc.register();

       }

}

package aop1;

public class Test {

       /**

        * @param args

        * 客户端

        * 静态代理模式

        */

       public static void main(String[] args) {

          ICustomerService target=new CustomerService();

          ICustomerService proxy=new CustomerProxy(target);

          //上面两行代码应该交给工厂去做。我们不关心得到的是目标还是代理对象

          //spring当中它是交给spring容器做的

          proxy.register();

       }

}

 

2.动态代理模式:

package aop2;

//目标对象或叫目标类

public class CustomerService implements ICustomerService{

   @Override

       public void register() {

              System.out.println("register");      

       }

}

package aop2;

//代理接口

public interface ICustomerService {

   public void register();

}

package aop2;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.util.Date;

//切面的代码(交叉业务逻辑),接口的作用是将切面代码织入到目标对象当中

public class LogInvocationHandler implements InvocationHandler{

    private Object target;//因为这段切面不只是织入到一个目标类中

       public LogInvocationHandler() {

              super();

       }

       public LogInvocationHandler(Object target) {

              super();

              this.target = target;

       }

       @Override

       public Object invoke(Object proxy, Method method, Object[] args)

       //method代表目标对象的一个方法,args目标对象方法参数的值

                     throws Throwable {

              //切面代码

              System.out.println("execute invoke" + new Date());

              //执行目标对象里面的方法

              System.out.println("method"+method);

              Object proxy1=method.invoke(target, args);

              System.out.println(proxy1);

              return proxy1;

       }

  

}

package aop2;

public class Test {

   /**

        * @param args

        * 客户端

        * 动态代理模式

        */

       public static void main(String[] args) {

        ICustomerService target=new CustomerService();

        ICustomerService proxy=(ICustomerService) java.lang.reflect.Proxy.newProxyInstance

        (target.getClass().getClassLoader(),

                      target.getClass().getInterfaces(),

                             new LogInvocationHandler(target));

        //参数1目标对象的类加载器,参数2目标对象所实现的业务接口,参数3切面

        proxy.register();

       }

}

 

三、Spring AOP原理

  采用动态代理模式。

 

  Spring AOP采动态代理的过程:

(1) 将切面使用动态代理的方式动态织入到目标对象(被代理类),形成一个代理对象;

(2) 目标类如果没有实现代理接口,那么Spring会采用CGLib来生成代理对象,该代理对象是目标对象的子类;此时的目标类不能是final的类。如果实现了业务接口,Spring会直接使用jdk当中的Proxy生成代理

(3) 目标对象如果是final类,并且也没实现代理接口,就不能运用AOP

 

四、Spring的通知

1Spring的通知类型

(1) MethodBeforeAdvice

  类全名:org.springframework.aop.MethodBeforeAdvice

  在目标方法调用之前,做处理。

  不能够改变返回值

  不能够改变目标方法的流程,也不能中断流程的处理过程(除非抛出异常)

(2) AfterReturningAdvice

  类全名:org.springframework.aop.AfterReturningAdvice  

在方法调用之后,做处理。

  不能够改变返回值

  不能够改变目标方法的流程,也不能中断流程的处理过程(除非抛出异常)

(3) MethodInterceptor:拦截器

  类全名:org.aopalliance.intercept.MethodInterceptor

在方法调用之前以及之后,做处理。

  可以改变返回值,也可以改变流程。

(4) ThrowsAdvice:异常处理通知

  类全名:org.springframework.aop.ThrowsAdvice

在方法抛出异常后,做处理。

  当该通知处理完异常后,会简单地将异常再次抛出给目标调用方法。

(5)自定义的通知,

Advisor

    PointcutAdvice结合到一起。

2、配置过程:

  1)配置目标对象

  2)配置通知

  3)利用ProxyFactoryBean将通知织入到目标对象,形成一个动态代理对象

  4)客户端使用动态代理来访问目标对象的方法。

 

  在默认情况下,通知会应用到所有的方法之上。

Pointcut

根据方法和类决定在什么地方织入通知

  Advisor

  PointcutAdvice结合到一起。

 

  自定义切入点:

  步骤:

  1)实现org.springframework.aop.ClassFilter

  2)实现org.springframework.aop.MethodMatcher

  3)实现org.springframework.aop.Pointcut

  4)实现org.springframework.aop.PointcutAdvisor

  注意:

  在此可定义

  private Advice advice;

  private Pointcut pointcut;

  在配置文件中,将自定义的切入点与通知绑订到一起

  5)利用ProxyFactoryBeanadvisor织入到目标对象

 

ProxyFactoryBean的作用:

  依照配置信息,将切面应用到目标对象,生成动态代理对象。

  (1) Spring只支持方法连接点,不支持属性连接点。

(原因是Spring AOP采用的是动态代理模式,而动态代理本身就是在方法调用前加入代码。)

  (2) Spring只在运行时,将切面织入到目标对象。

(有些AOP实现,可以在编译是织入切面到目标对象。)

Injecting Advicecon’t d

<bean id=”registerService’ class=”org.springframework.aop.framework.ProxyFactoryBean”>

         <property name=”proxyInterfaces”>  目标对象实现的接口

          (如果没有定义接口,则所有方法使用CGLib

             <value>aop.RegisterService</value>

          </property>

          <property name=”target”>    目标对象

             <ref local=”registerServiceTarget”/>

          </property>

          <property name=”interceptorNames”>需要织入到目标对象的切面

              <list>

               <value>logAdvice</value>

               <value>throwsAdvice</value>

              </list>

          </property>

</bean>                                                                     

五、切入点(Pointcut

  1Pointcut<interface>

  切入点是指通知/切面可以应用到哪些类,哪些方法之上。

  Pointcut API

  Pointcutorg.springframework.aop.Pointcut

对某些类某些方法应用切面。

  Classfilterorg.springframework.aop.ClassFilter

用来过滤类(哪些类可以应用切面)

  MethodMatherorg.s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值