Spring AOP 入门示例

来源:互联网 发布:魔音变声软件下载 编辑:程序博客网 时间:2024/05/21 10:07

此示例根据尚硅谷佟刚老师的Spring4.0课程视频写成,仅在做记录,以备后用

1.新建Java工程,引入相关spring包,文件结构如下:


2.applicationContext.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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"><!-- 配置自动扫描 --><context:component-scan base-package="com.yinhai.cj.demo1.aop.impl"/>  <!-- 使aspectJ注解起作用:自动为匹配的类生成代理对象 -->  <aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>

3.相关代码:

Caculator.java代码:

package com.yinhai.cj.demo1.aop.impl;public interface Caculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j);}
CaculatorImpl.java代码,使用注解将此对象放入IOC容器

package com.yinhai.cj.demo1.aop.impl;import org.springframework.stereotype.Component;@Componentpublic class CaculatorImpl implements Caculator {@Overridepublic int add(int i, int j) {int result = i + j;return result;}@Overridepublic int sub(int i, int j) {int result = i - j;return result;}@Overridepublic int mul(int i, int j) {int result = i * j;return result;}@Overridepublic int div(int i, int j) {int result = i / j;return result;}}

LoggingAspect.java 代码,

package com.yinhai.cj.demo1.aop.impl;import java.util.Arrays;import java.util.List;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.stereotype.Component;//把这个类声明为一个切面,首先需要将该类放入ioc容器中、再声明为一个切面@Component@Aspectpublic class LoggingAspect {// 声明该方法为一个前置通知:在目标方法开始之前执行@Before("execution(public int com.yinhai.cj.demo1.aop.impl.Caculator.*(int, int))")public void beforeMethod(JoinPoint joinPoint) {String methodName = joinPoint.getSignature().getName();List<Object> args = Arrays.asList(joinPoint.getArgs());System.out.println("The method " + methodName + " begin with " + args);}// 后置通知:在目标方法执行之后之后执行(无论是否发生异常)@After("execution(public int com.yinhai.cj.demo1.aop.impl.Caculator.*(..))")public void afterMethod(JoinPoint joinPoint) {String methodName = joinPoint.getSignature().getName();List<Object> args = Arrays.asList(joinPoint.getArgs());System.out.println("The method " + methodName + " after with " + args);}// 后置通知:在目标方法执行之后之后执行(无论是否发生异常)@AfterReturning(value="execution(public int com.yinhai.cj.demo1.aop.impl.Caculator.*(..))", returning="result")public void afterTeturning(JoinPoint joinPoint, Object result) {String methodName = joinPoint.getSignature().getName();System.out.println("The method " + methodName + " end with " + result);}// 异常返回通知:当目标方法发生异常时执行@AfterThrowing(value="execution(public int com.yinhai.cj.demo1.aop.impl.Caculator.*(..))",throwing="e")public void afterThrowing(JoinPoint joinPoint, Exception e){String methodName = joinPoint.getSignature().getName();System.out.println("The method " + methodName + " exception " + e);}}

Main.java代码

package com.yinhai.cj.demo1.aop.impl;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");Caculator caculator = (Caculator) ctx.getBean(Caculator.class);int result = caculator.add(4, 1);System.out.println("result:" + result);result = caculator.div(4, 0);System.out.println("result:" + result);}}

执行结果:











0 0
原创粉丝点击