`

Spring之AOP详解

阅读更多
1. AOP简介

面向切面编程(也叫面向方面编程):AspectOrientedProgramming(AOP),是软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。

新建项目Spring403


手动增加会破环业务逻辑

StudentService.java

package com.andrew.service;
public interface StudentService {
    public void addStudent(String name);
}

StudentServiceImpl.java

package com.andrew.service.impl;
import com.andrew.service.StudentService;
public class StudentServiceImpl implements StudentService {
    @Override
    public void addStudent(String name) {
        System.out.println("日志:开始添加学生" + name);
        System.out.println("添加学生" + name);
        System.out.println("日志:完成学生" + name + "的添加");
    }
}

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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="studentService" class="com.andrew.service.impl.StudentServiceImpl"></bean>
</beans>

JunitTest.java

package com.andrew.test;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.andrew.service.StudentService;
public class JunitTest {
    private ApplicationContext ac;
    @Before
    public void setUp() throws Exception {
        ac = new ClassPathXmlApplicationContext("beans.xml");
    }
    @Test
    public void test1() {
        StudentService studentService = (StudentService) ac.getBean("studentService");
        studentService.addStudent("张三");
    }
}

运行结果:
日志:开始添加学生张三
添加学生张三
日志:完成学生张三的添加


2. SpringAOP实例

2.1) 前置通知

2.2) 后置通知

2.3) 环绕通知

2.4) 返回通知

2.5) 异常通知

新建项目Spring403-02

引入aop的声明
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd

导入aop jar包,右键buildPath
aopalliance.jar
aspectjweaver-1.6.6.jar
spring-aspects-4.0.6.RELEASE.jar


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.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    <bean id="studentServiceAspect" class="com.andrew.advice.StudentServiceAspect"></bean>
    <bean id="studentService" class="com.andrew.service.impl.StudentServiceImpl"></bean>
    <aop:config>
        <aop:aspect id="studentServiceAspect" ref="studentServiceAspect">
            <aop:pointcut expression="execution(* com.andrew.service.*.*(..))" id="businessService"/>
            <aop:before method="doBefore" pointcut-ref="businessService"/>
            <aop:after method="doAfter" pointcut-ref="businessService"/>
            <aop:around method="doAround" pointcut-ref="businessService"/>
            <aop:after-returning method="doAfterReturning" pointcut-ref="businessService"/>
            <aop:after-throwing method="doAfterThrowing" pointcut-ref="businessService" throwing="ex"/>
        </aop:aspect> 
    </aop:config>
</beans>

StudentServiceAspect.java

package com.andrew.advice;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class StudentServiceAspect {
    public void doBefore(JoinPoint jp) {
        System.out.println("aop before 类名:" + jp.getTarget().getClass().getName());
        System.out.println("aop before 方法名:" + jp.getSignature().getName());
        System.out.println("aop before 开始添加学生:" + jp.getArgs()[0]);
    }
    public void doAfter(JoinPoint jp) {
        System.out.println("aop after 类名:" + jp.getTarget().getClass().getName());
        System.out.println("aop after 方法名:" + jp.getSignature().getName());
        System.out.println("aop after 学生添加完成:" + jp.getArgs()[0]);
    }
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("aop around 添加学生前");
        Object retVal = pjp.proceed();
        System.out.println(retVal);
        System.out.println("aop around 添加学生后");
        return retVal;
    }
    public void doAfterReturning(JoinPoint jp) {
        System.out.println("aop after returning 返回通知");
    }
    public void doAfterThrowing(JoinPoint jp, Throwable ex) {
        System.out.println("aop after throwing 异常通知");
        System.out.println("aop after throwing 异常信息:" + ex.getMessage());
    }
}

StudentService.java

package com.andrew.service;
public interface StudentService {
    public void addStudent(String name);
}

Test.java

package com.andrew.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.andrew.service.StudentService;
public class Test {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
        StudentService studentService = (StudentService) ac.getBean("studentService");
        studentService.addStudent("张三");
    }
}

1) StudentServiceImpl.java

package com.andrew.service.impl;

import com.andrew.service.StudentService;
public class StudentServiceImpl implements StudentService {
    @Override
    public void addStudent(String name) {
        System.out.println("添加学生" + name);
    }
}

Test.java运行结果:
aop before 类名:com.andrew.service.impl.StudentServiceImpl
aop before 方法名:addStudent
aop before 开始添加学生:张三
aop around 添加学生前
添加学生张三
aop after returning 返回通知
null
aop around 添加学生后
aop after 类名:com.andrew.service.impl.StudentServiceImpl
aop after 方法名:addStudent
aop after 学生添加完成:张三

2) StudentServiceImpl.java

package com.andrew.service.impl;
import com.andrew.service.StudentService;
public class StudentServiceImpl implements StudentService {
    @Override
    public void addStudent(String name) {
        System.out.println("添加学生" + name);
        System.out.println(1/0);
    }
}

Test.java运行结果:
aop before 类名:com.andrew.service.impl.StudentServiceImpl
aop before 方法名:addStudent
aop before 开始添加学生:张三
aop around 添加学生前
添加学生张三
aop after throwing 异常通知
aop after throwing 异常信息:/ by zero
aop after 类名:com.andrew.service.impl.StudentServiceImpl
aop after 方法名:addStudent
aop after 学生添加完成:张三
Exception in thread "main" java.lang.ArithmeticException: / by zero
...
分享到:
评论

相关推荐

    Spring之AOP配置文件详解

    ### Spring之AOP配置文件详解 #### 一、前言 在Java开发中,Spring框架因其强大的功能和灵活的配置而被广泛应用于企业级应用的开发。其中,面向切面编程(Aspect Oriented Programming,简称AOP)是Spring框架的...

    spring注解aop配置详解

    Spring AOP,即Aspect-Oriented Programming(面向切面编程),是Spring框架的重要特性,它为应用程序提供了声明式的企业级服务,如日志、事务管理等。本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁...

    spring-springMVC开发文档和AOP详解

    最后,《Spring3_AOP详解》深入剖析了Spring的AOP特性。AOP是面向切面编程的缩写,它允许我们在不改变原有代码结构的情况下,插入额外的功能,如日志、事务管理和性能监控等。通过代理机制,AOP可以在运行时将“切面...

    Spring aop术语详解

    Spring AOP 术语详解 Spring 中的 AOP 术语可能会使人感到困惑,但本文将对 AOP 术语进行通俗的解释。 关注点(Concern) 关注点是我们要考察或解决的问题。如订单的处理、用户的验证、用户日志记录等都属于关注...

    Spring AOP面向方面编程原理:AOP概念

    ### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程...

    springAOP详解

    ### Spring AOP 详解 #### 5.1 AOP 基本思想 **5.1.1 认识 AOP** AOP (Aspect Oriented Programming) 面向切面编程,是一种软件开发思想,它允许开发者将那些分散在整个应用各处的“切面”(如日志记录、安全控制...

    Spring中的AOP

    **Spring中的AOP详解** AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它为开发者提供了在不修改原有代码的情况下,插入新的功能或增强已有功能的能力。AOP的核心概念包括切面...

    Spring AOP实现机制

    **Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...

    Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现.doc

    Spring AOP 实现原理详解之 AOP 切面的实现 Spring AOP 是基于 IOC 的 Bean 加载来实现的,本文主要介绍 Spring AOP 原理解析的切面实现过程。AOP 切面的实现是将切面类的所有切面方法根据使用的注解生成对应 ...

    Spring——aop

    **Spring AOP 知识详解** 在Java开发领域,Spring框架是不可或缺的一部分,它提供了许多强大的功能,其中AOP(面向切面编程)是其重要特性之一。AOP允许开发者将关注点分离,使得业务逻辑代码与系统服务如日志、...

    spring对AOP的支持(使用Spring的配置文件来演示)

    **Spring AOP支持详解** Spring框架是Java领域中极为重要的一个组件,它为开发者提供了许多便利,其中之一就是对面向切面编程(Aspect Oriented Programming,简称AOP)的支持。AOP允许我们分离关注点,将横切关注...

    spring ioc di aop详解

    在 Spring 中,IOC(Inversion of Control,控制反转)和 DI(Dependency Injection,依赖注入)是两个核心概念,而 AOP(Aspect Oriented Programming,面向切面编程)则是实现模块化和解耦的重要工具。现在,我们...

    spring Aop文档

    ### Spring AOP 文档知识点详解 #### 一、Spring AOP 概述 Spring AOP(面向切面编程)是Spring框架中的一个关键模块,它为开发者提供了在应用程序中实现横切关注点(Cross-cutting Concerns)的能力。横切关注点...

    spring-aop.jar

    《Spring AOP 框架详解与应用》 在Java开发领域,Spring框架以其全面、灵活的特性成为了企业级应用的首选。其中,Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一...

    Spring AOP依赖jar包

    **Spring AOP 依赖 Jar 包详解** 在 Spring 框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,这些切面可以封装跨多个对象的行为或责任。Spring AOP 提供了在运行时实现切面的功能,...

    springAop的配置实现

    **Spring AOP 配置实现详解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它允许我们通过分离关注点来简化应用程序的开发。在传统的面向对象编程中,业务逻辑与日志记录...

    spring aop 注解例子

    **Spring AOP 注解例子详解** 在 Spring 框架中,面向切面编程(Aspect Oriented Programming,AOP)是一种强大的设计模式,它允许我们分离关注点,将业务逻辑与系统服务(如日志、事务管理等)解耦。在 Spring AOP...

    开源框架spring详解-----AOP的深刻理解

    标题 "开源框架spring详解-----AOP的深刻理解" 指向的是对Spring框架中核心概念之一的面向切面编程(Aspect Oriented Programming, AOP)的深入探讨。AOP是Spring用来解决横切关注点问题的一种编程模式,它允许...

    spring_AOP的MethodBeforeAdvice详解

    Spring AOP中的MethodBeforeAdvice是Spring框架提供的面向切面编程(AOP)的重要组成部分,用于在目标对象的方法执行之前执行一段代码。在AOP中,可以通过定义所谓的“advice”来插入横切关注点(cross-cutting ...

Global site tag (gtag.js) - Google Analytics