峰Spring4学习(6)spring AOP的应用例子

一、AOP简介:

二、AOP实例:

三、使用的例子

需求:在student添加的前后,打印日志信息;

0)spring AOP需要引用的jar包:

1)StudentService.java接口:

package com.cy.service;

public interface StudentService {
    public void addStudent(String name);
}

2)StudentServiceImpl.java实现类:

package com.cy.service.impl;

import com.cy.service.StudentService;

public class StudentServiceImpl implements StudentService {

    @Override
    public void addStudent(String name) {
        System.out.println("添加学生"+name);
    }

}

3)StudentServiceAspect.java切面类:

package com.cy.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class StudentServiceAspect {

    //前置通知,方法执行之前
    public void doBefore(JoinPoint jp){
        System.out.println("类名:" + jp.getTarget().getClass().getName());
        System.out.println("方法名:" + jp.getSignature().getName());
        System.out.println("开始添加学生:" + jp.getArgs()[0]);
    }

    //后置通知 方法完成之后
    public void doAfter(JoinPoint jp){
        System.out.println("类名:" + jp.getTarget().getClass().getName());
        System.out.println("方法名:" + jp.getSignature().getName());
        System.out.println("完成添加学生:" + jp.getArgs()[0]);
    }

    //环绕通知  可以在业务方法的前后添加逻辑
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("添加学生前");
        Object retVal = pjp.proceed();    //retVal为StudentServiceImpl.addStudent(String name)方法的返回值
                                          //因为返回值为void,所以console打印null
        System.out.println("添加学生后");
        System.out.println(retVal);
        return retVal;
    }

    //返回通知
    public void doAfterReturning(JoinPoint jp){
        System.out.println("返回通知");
    }

    //异常通知
    public void doAfterThrowing(JoinPoint jp, Throwable ex){
        System.out.println("异常通知");
        System.out.println("异常信息:" + ex.getMessage());
    }
}

4)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-2.5.xsd">

     <bean id="studentService" class="com.cy.service.impl.StudentServiceImpl"></bean>
     <bean id="studentServiceAspect" class="com.cy.advice.StudentServiceAspect"></bean>

     <aop:config>
         <aop:aspect id="studentServiceAspect" ref="studentServiceAspect">
             <aop:pointcut expression="execution(* com.cy.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>

5)测试代码:

public class T {

    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
        StudentService studentService = (StudentService) ac.getBean("studentService");
        studentService.addStudent("张三");
    }

}

1)没有异常抛出时,没有异常通知;console打印:

2)addStudent方法中构造异常,有异常通知,console打印:

StudentServiceImpl.java:

package com.cy.service.impl;

import com.cy.service.StudentService;

public class StudentServiceImpl implements StudentService {

    @Override
    public void addStudent(String name) {
        System.out.println("添加学生"+name);
        System.out.println(1/0);
    }

}

doAround方法中抛出异常是这句话:

--  Object retVal = pjp.proceed();

时间: 2024-10-13 19:52:19

峰Spring4学习(6)spring AOP的应用例子的相关文章

JavaEE学习之Spring aop

一.基本概念 AOP——Aspect-Oriented Programming,面向切面编程,它是spring框架的一个重要组成部分.一般的业务逻辑都有先后关系,我们可以理解为纵向关系,而AOP关注的是横向关系,每一个关注点可以理解为一个横切面.例如我们的大部分代码都会涉及到日志记录,很多的数据库操作都会涉及到事务的创建和提交.那么从横向关注这些逻辑,他们都一个个的切面. AOP技术的具体实现,可以通过动态代理技术或者是在程序编译期间进行静态的"织入"方式.AOP经常使用的场景包括:日

CgLib动态代理学习【Spring AOP基础之一】

如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发现其参数类型是ClassLoader classLoader, Class<?>[] interface, InvocationHandler handler, 只支持根据接口实现代理类,如果所有代码都是自己掌控,当然没有问题.所有的业务逻辑均抽象出接口,然后所有的业务类实现接口,这样所有的业务类

Spring+Maven学习实验- Spring AOP面向切面编程(二)

在 Spring AOP 中,有 3 个常用的概念,Advices . Pointcut . Advisor ,解释如下: Advices :表示一个 method 执行前或执行后的动作. Pointcut :表示根据 method 的名字或者正则表达式去拦截一个 method . Advisor : Advice 和 Pointcut 组成的独立的单元,并且能够传给 proxy factory 对象. 我们可以用名字匹配法和正则表达式匹配法去匹配要拦截的 method . 1 Pointcut

Spring学习十三----------Spring AOP的基本概念

? 版权声明:本文为博主原创文章,转载请注明出处 什么是AOP -面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 -主要的功能是:日志记录.性能统计.安全控制.事务处理.异常处理等 AOP实现方式 -预编译 -AspectJ -运行期动态代理(JDK动态代理.CGLib动态代理) -Spring AOP.Jboss AOP AOP相关概念 -切面(Aspect)   一个关注点的模块化,这个关注点可能会横切多个对象 -连接点(Joinpoint)   程序执行过程中

Java动态代理学习【Spring AOP基础之一】

Spring AOP使用的其中一个底层技术就是Java的动态代理技术.Java的动态代理技术主要围绕两个类进行的 java.lang.reflect.InvocationHandler java.lang.reflect.Proxy 首先从代码层面说明Java动态代理是如何实现的, 业务逻辑接口: /** * 创建一个人的接口,其中有一个吃的方法 */ public interface Person { public void eat(); } 创建一个实现该业务接口的类: /** * 人接口的

峰Spring4学习(4)spring自动装配

一.自动装配: Model类: People.java: package com.cy.entity; public class People { private int id; private String name; private int age; private Dog dog; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { r

spring学习九 spring aop详解

本文来自于:https://www.cnblogs.com/jingzhishen/p/4980551.html AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合.当我们需 要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关系,但并不适合定义

峰Spring4学习(5)bean之间的关系和bean的作用范围

一.bean之间的关系: 1)继承: People.java实体类: package com.cy.entity; public class People { private int id; private String name; private int age; private String className; public int getId() { return id; } public void setId(int id) { this.id = id; } public Strin

峰Spring4学习(1)HelloWorld

HelloWorld.java: package com.cy.test; public class HelloWorld { public void say(){ System.out.println("hello Spring 你好"); } } Test.java: package com.cy.service; import org.springframework.context.ApplicationContext; import org.springframework.co