Spring
  • [Spring]Spring 教程
  • [Spring]Spring 体系结构
  • [Spring]Spring 环境配置
  • [Spring]Spring Hello World 实例
  • [Spring]Spring IoC 容器
  • [Spring]Spring BeanFactory 容器
  • [Spring]Spring ApplicationContext 容器
  • [Spring]Spring Bean 定义
  • [Spring]Spring Bean 作用域
  • [Spring]Spring Bean 生命周期
  • [Spring]Spring Bean 后置处理器
  • [Spring]Spring Bean 定义继承
  • [Spring]Spring 依赖注入
  • [Spring]Spring 基于构造函数的依赖注入
  • [Spring]Spring 基于设值函数的依赖注入
  • [Spring]Spring 注入内部 Beans
  • [Spring]Spring 注入集合
  • [Spring]Spring Beans 自动装配
  • [Spring]Spring 自动装配 ‘byName’
  • [Spring]Spring 自动装配 ‘byType’
  • [Spring]Spring 由构造函数自动装配
  • [Spring]Spring 基于注解的配置
  • [Spring]Spring @Required 注释
  • [Spring]Spring @Autowired 注释
  • [Spring]Spring @Qualifier 注释
  • [Spring]Spring JSR-250 注释
  • [Spring]Spring 基于 Java 的配置
  • [Spring]Spring 中的事件处理
  • [Spring]Spring 中的自定义事件
  • [Spring]Spring 框架的 AOP
  • [Spring]Spring 中基于 AOP 的 XML架构
  • [Spring]Spring 中基于 AOP 的 @AspectJ
  • [Spring]Spring JDBC 框架
  • [Spring]Spring JDBC 示例
  • [Spring]Spring 中 SQL 的存储过程
  • [Spring]Spring 事务管理
  • [Spring]Spring 编程式事务管理
  • [Spring]Spring 声明式事务管理
  • [Spring]Spring Web MVC 框架
  • [Spring]Spring MVC Hello World 例子
  • [Spring]Spring MVC 表单处理例子
  • [Spring]Spring 页面重定向例子
  • [Spring]Spring 静态页面例子
  • [Spring]Spring 异常处理例子
  • [Spring]Spring 使用 Log4J 记录日志
  • 直达腾讯云服务器
    腾讯云服务器,数据库,短信等热销产品限量秒杀;新购爆款3折起;
    腾讯云数据库MySQL入门机型仅12元/月
    腾讯云云服务器新购特惠,最低2折起,1核1G3年仅794.73元,即0.73元/日。
    腾讯云国际顶级CA机构SSL证书8.8折,云解析买一年最高送半年!
    腾讯云为数百万企业和开发者提供安全、稳定的云服务器、云数据库、CDN等云服务
    腾讯云服务器安全可靠高性能,多种配置供您选择
    腾讯云数据库性能卓越稳定可靠,为您解决数据库运维难题
    阿里云服务器入口
    180天免费用腾讯云服务器马上领取
    您当前位置:狗鱼MySQL教程 >> 服务端编程 >> Spring >> Spring 中基于 AOP 的 @AspectJ
    Spring 中基于 AOP 的 @AspectJ
    更新日期: 2017年08月04日 来源: 本站原创 作者: 佚名 阅读:
    上一篇Spring 中基于 AOP 的 XML架构 下一篇:Spring JDBC 框架

    Spring 中基于 AOP 的 @AspectJ

     

    @AspectJ 作为通过 java 5 注释注释的普通的 java 类,它指的是声明 aspects 的一种风格。通过在你的基于架构的 xml 配置文件中包含以下元素,@AspectJ 支持是可用的。

    <aop:aspectj-autoproxy/>

    你还需要在你的应用程序的 CLASSPATH 中使用以下 AspectJ 库文件。这些库文件在一个 AspectJ 装置的 ‘lib’ 目录中是可用的,否则你可以在 Internet 中下载它们。

    • aspectjrt.jar

    • aspectjweaver.jar

    • aspectj.jar

    • aopalliance.jar

     声明一个 aspect

    Aspects 类和其他任何正常的 bean 一样,除了它们将会用 @AspectJ 注释之外,它和其他类一样可能有方法和字段,如下所示:

    package org.xyz;
    import org.aspectj.lang.annotation.Aspect;
    @Aspect
    public class AspectModule {
    }

    它们将在 XML 中按照如下进行配置,就和其他任何 bean 一样:

    <bean id="myAspect" class="org.xyz.AspectModule">
       <!-- configure properties of aspect here as normal -->
    </bean>
    

    声明一个切入点

    一个切入点有助于确定使用不同建议执行的感兴趣的连接点(即方法)。在处理基于配置的 XML 架构时,切入点的声明有两个部分:

    • 一个切入点表达式决定了我们感兴趣的哪个方法会真正被执行。

    • 一个切入点标签包含一个名称和任意数量的参数。方法的真正内容是不相干的,并且实际上它应该是空的。

    下面的示例中定义了一个名为 ‘businessService’ 的切入点,该切入点将与 com.tutorialspoint 包下的类中可用的每一个方法相匹配:

    import org.aspectj.lang.annotation.Pointcut;
    @Pointcut("execution(* com.xyz.myapp.service.*.*(..))") // expression 
    private void businessService() {}  // signature

    下面的示例中定义了一个名为 ‘getname’ 的切入点,该切入点将与 com.tutorialspoint 包下的 Student 类中的 getName() 方法相匹配:

    import org.aspectj.lang.annotation.Pointcut;
    @Pointcut("execution(* com.tutorialspoint.Student.getName(..))") 
    private void getname() {}

    声明建议

    你可以使用 @{ADVICE-NAME} 注释声明五个建议中的任意一个,如下所示。这假设你已经定义了一个切入点标签方法 businessService():

    @Before("businessService()")
    public void doBeforeTask(){
     ...
    }
    @After("businessService()")
    public void doAfterTask(){
     ...
    }
    @AfterReturning(pointcut = "businessService()", returning="retVal")
    public void doAfterReturnningTask(Object retVal){
      // you can intercept retVal here.
      ...
    }
    @AfterThrowing(pointcut = "businessService()", throwing="ex")
    public void doAfterThrowingTask(Exception ex){
      // you can intercept thrown exception here.
      ...
    }
    @Around("businessService()")
    public void doAroundTask(){
     ...
    }

    你可以为任意一个建议定义你的切入点内联。下面是在建议之前定义内联切入点的一个示例:

    @Before("execution(* com.xyz.myapp.service.*.*(..))")
    public doBeforeTask(){
     ...
    }

    基于 AOP 的 @AspectJ 示例

    为了理解上面提到的关于基于 AOP 的 @AspectJ 的概念,让我们编写一个示例,可以实现几个建议。为了在我们的示例中使用几个建议,让我们使 eclipse IDE 处于工作状态,然后按照如下步骤创建一个 Spring 应用程序:

    步骤 描述
    1 创建一个名为 SpringExample 的项目,并且在所创建项目的 src 文件夹下创建一个名为 com.tutorialspoint 的包。
     
    2 使用 Add External JARs 选项添加所需的 Spring 库文件,就如在 Spring Hello World Example 章节中解释的那样。
     
    3 在项目中添加 Spring AOP 指定的库文件 aspectjrt.jar, aspectjweaver.jaraspectj.jar
     
    4 com.tutorialspoint 包下创建 Java 类 LoggingStudentMainApp
     
    5 src 文件夹下创建 Beans 配置文件 Beans.xml
     
    6 最后一步是创建所有 Java 文件和 Bean 配置文件的内容,并且按如下解释的那样运行应用程序。
     

    这里是 Logging.java 文件的内容。这实际上是 aspect 模块的一个示例,它定义了在各个点调用的方法。

    package com.tutorialspoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Around;
    @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.tutorialspoint.*.*(..))")
       private void selectAll(){}
       /** 
        * This is the method which I would like to execute
        * before a selected method execution.
        */
       @Before("selectAll()")
       public void beforeAdvice(){
          System.out.println("Going to setup student profile.");
       }
       /** 
        * This is the method which I would like to execute
        * after a selected method execution.
        */
       @After("selectAll()")
       public void afterAdvice(){
          System.out.println("Student profile has been setup.");
       }
       /** 
        * This is the method which I would like to execute
        * when any method returns.
        */
       @AfterReturning(pointcut = "selectAll()", returning="retVal")
       public void afterReturningAdvice(Object retVal){
          System.out.println("Returning:" + retVal.toString() );
       }
       /**
        * This is the method which I would like to execute
        * if there is an exception raised by any method.
        */
       @AfterThrowing(pointcut = "selectAll()", throwing = "ex")
       public void AfterThrowingAdvice(IllegalArgumentException ex){
          System.out.println("There has been an exception: " + ex.toString());   
       }  
    }

    下面是 Student.java 文件的内容:

    package com.tutorialspoint;
    public class Student {
       private Integer age;
       private String name;
       public void setAge(Integer age) {
          this.age = age;
       }
       public Integer getAge() {
          System.out.println("Age : " + age );
          return age;
       }
       public void setName(String name) {
          this.name = name;
       }
       public String getName() {
          System.out.println("Name : " + name );
          return name;
       }
       public void printThrowException(){
          System.out.println("Exception raised");
          throw new IllegalArgumentException();
       }
    }

    下面是 MainApp.java 文件的内容:

    package com.tutorialspoint;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class MainApp {
       public static void main(String[] args) {
          ApplicationContext context = 
                 new ClassPathXmlApplicationContext("Beans.xml");
          Student student = (Student) context.getBean("student");
          student.getName();
          student.getAge();     
          student.printThrowException();
       }
    }

    下面是配置文件 Beans.xml

    <?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 ">
    
        <aop:aspectj-autoproxy/>
    
       <!-- Definition for student bean -->
       <bean id="student" class="com.tutorialspoint.Student">
          <property name="name"  value="Zara" />
          <property name="age"  value="11"/>      
       </bean>
    
       <!-- Definition for logging aspect -->
       <bean id="logging" class="com.tutorialspoint.Logging"/> 
    
    </beans>
    

    一旦你已经完成的创建了源文件和 bean 配置文件,让我们运行一下应用程序。如果你的应用程序一切都正常的话,这将会输出以下消息:

    Going to setup student profile.
    Name : Zara
    Student profile has been setup.
    Returning:Zara
    Going to setup student profile.
    Age : 11
    Student profile has been setup.
    Returning:11
    Going to setup student profile.
    Exception raised
    Student profile has been setup.
    There has been an exception: java.lang.IllegalArgumentException
    .....
    other exception content
    
    
    

    感觉本站内容不错,读后有收获?

    我要小额赞助,鼓励提供更好的内容教程

    上一篇Spring 中基于 AOP 的 XML架构 下一篇:Spring JDBC 框架
    Copyright 2013-2017 Powered by 狗鱼MySQL教程,All Rights Reserved.
    广州相如计算机科技有限有限公司 版权所有 粤ICP备08130661号-4
    售前咨询:020-38667011 手机:13711588918