鍍金池/ 教程/ Java/ Spring AOP代理
Spring AOP基于XML的After Advice
Spring AOP基于XML的Before Advice
Spring AOP基于XML的After Returning Advice
Spring AOP基于注解的切入點(diǎn)
Spring AOP基于XML的After Throwing Advice
Spring AOP實(shí)現(xiàn)
Spring AOP基于注解的Around通知
Spring AOP環(huán)境安裝設(shè)置
Spring AOP自定義注解
Spring AOP代理
Spring AOP基于XML的切入點(diǎn)
Spring AOP基于XML的Around Advice
Spring AOP通知類型
Spring AOP基于XML的應(yīng)用程序
Spring AOP基于注解的After Advice
Spring AOP基于注解的Before Advice
Spring AOP基于注解的AfterThrowing
Spring AOP教程
Spring AOP基于注解的After Returning Advice
Spring AOP核心概念
Spring AOP基于注解的應(yīng)用

Spring AOP代理

到目前為止,我們學(xué)習(xí)過如何使用<aop:config><aop:aspectj-autoproxy>聲明方面。也可以通過編程方式創(chuàng)建代理,并使用代理對象以編程方式調(diào)用方面。

語法

//Create object to be proxied
Student student = new Student();
//Create the Proxy Factory
AspectJProxyFactory proxyFactory = new AspectJProxyFactory(student);
//Add Aspect class to the factory
proxyFactory.addAspect(Logging.class);
//Get the proxy object
Student proxyStudent = proxyFactory.getProxy();
//Invoke the proxied method.
proxyStudent.getAge();

在上面的語法示例中 -

  • AspectJProxyFactory - 用于創(chuàng)建代理對象的工廠類。
  • Logging.class - 包含通知的方面類
  • Student - 將被通知的業(yè)務(wù)類。

要了解上面提到與代理相關(guān)的概念,我們寫一個(gè)Spring AOP基于注解的應(yīng)用例子,它將使用基于注解配置實(shí)現(xiàn)通知。打開并使用Eclipse IDE,并按照以下步驟創(chuàng)建一個(gè)Spring應(yīng)用程序:

  1. 更新在Spring AOP應(yīng)用實(shí)例中創(chuàng)建過的Student項(xiàng)目。
  2. 更新bean配置并運(yùn)行應(yīng)用程序,如下所述。

整個(gè)項(xiàng)目的目錄結(jié)構(gòu)如下所示 -

下面是Logging.java文件的內(nèi)容。 這實(shí)際上是一個(gè)Aspect模塊的樣本,它定義了在各個(gè)點(diǎn)被調(diào)用的方法。

package com.yiibai;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Before;

@Aspect
public class Logging {

   /** Following is the definition for a pointcut to select
    *  all the methods available. So advice will be called
    *  for all the methods.
    */
   @Pointcut("execution(* com.yiibai.Student.getAge(..))")
   private void selectGetAge(){}

   /** 
    * This is the method which I would like to execute
    * before a selected method execution.
    */
   @Before("selectGetAge()")
   public void beforeAdvice(){
      System.out.println("[beforeAdvice] Going to setup student profile.");
   }  
}

以下是Student.java文件的內(nèi)容:

package com.yiibai;

public class Student {
   private Integer age;

   public void setAge(Integer age) {
      this.age = age;
   }
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }   
}

以下是MainApp.java文件的內(nèi)容:

package com.yiibai;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      //Create the Proxy Factory
      AspectJProxyFactory proxyFactory = new AspectJProxyFactory(student);

      //Add Aspect class to the factory
      proxyFactory.addAspect(Logging.class);

      //Get the proxy object
      Student proxyStudent = proxyFactory.getProxy();

      //Invoke the proxied method.
      proxyStudent.getAge();

   }
}

以下是配置文件Beans.xml文件的內(nèi)容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <!-- Definition for student bean -->
   <bean id="student" class="com.yiibai.Student">
      <property name="age"  value="26"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id="logging" class="com.yiibai.Logging"/> 

</beans>

運(yùn)行項(xiàng)目

完成創(chuàng)建源代碼和配置文件后,運(yùn)行應(yīng)用程序。右鍵單擊應(yīng)用程序中的MainApp.java,并使用運(yùn)行方式作為Java應(yīng)用程序命令。 如果您的應(yīng)用程序一切正常,這將打印以下消息:

[beforeAdvice] Going to setup student profile.
Age : 26