Spring AOP快速入门
来源:互联网 发布:淘宝密码忘了 编辑:程序博客网 时间:2024/05/18 00:05
- 目标:学会Spring AOP的基本用法
- 适合人群:已经学会Spring IOC基础用法
- 源码及jar包已经上传至我的资源,可自行下载
首先我们来设想一个场景,现在需要做一个能进行整数之间加减乘除的计算器,可以得到如下的代码:
com.spring.aop.Calculator
public interface Calculator { public int add(int i, int j); public int sub(int i, int j); public int mul(int i, int j); public int div(int i, int j);}
com.spring.aop.CalculatorImpl
public class CalculatorImpl implements Calculator { @Override public int add(int i, int j) { return i + j; } @Override public int sub(int i, int j) { return i - j; } @Override public int mul(int i, int j) { return i * j; } @Override public int div(int i, int j) { return i / j; }}
测试一下:
public class Test { public static void main(String[] args) { Calculator cal = new CalculatorImpl(); int result = cal.add(1, 3); System.out.println(result); }}
输出结果:4
看上去很棒,似乎一点问题都没有,但是现在需求来了:
在计算之前和计算之后记录参数和结果
那要怎么办呢?变动实现类吧:
//添加日志版public class CalculatorImpl implements Calculator { @Override public int add(int i, int j) { System.out.println("param: [" + i + "," + j + "]"); int result = i + j; System.out.println("result: " + result); return result; } @Override public int sub(int i, int j) { System.out.println("param: [" + i + "," + j + "]"); int result = i - j; System.out.println("result: " + result); return result; } @Override public int mul(int i, int j) { System.out.println("param: [" + i + "," + j + "]"); int result = i * j; System.out.println("result: " + result); return result; } @Override public int div(int i, int j) { System.out.println("param: [" + i + "," + j + "]"); int result = i / j; System.out.println("result: " + result); return result; }}
是不是顿时感觉原本简介的代码变得臃肿而冗余?如果你觉得可以容忍的话,那么试试满足新的需求:
将日志信息记录到数据库中
怎么办,接着每个地方都改一下吗?如果以后要记录到文本文档呢,做成报表呢?甚至是要时不时的在不同的记录方式之间切换呢?
显然,靠手工修改是很麻烦的,那么考虑如何简化一下吧,比如把相同的部分抽取出来,每次计算时先执行记录日志的方法,再计算。这是很有效的,并且Spring已经帮你做到了这些,下面说说如何使用它。
首先,我们应该明确几点:
- 既然使用了Spring,那么一切都要交给Spring来管理
- 哪些类的哪些方法需要记录日志
- 记录日志的方法是什么
- 在什么时候记录日志,计算前,计算后,还是出异常后…
明确了这几点之后,就开始理解下面这些代码了:
1.Calculator和CalculatorImpl(未记录日志版)是不用变动的
2.添加Spring IOC和AOP所需要的jar包
核心包
commons-logging-1.1.1.jar
spring-core-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jarAOP
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.net.sf.cglib-2.2.0.jar
3.记录日志的方法
com.spring.aop.AspectLogging
@Component@Aspectpublic class AspectLogging { // Before表示在指定方法前执行,execution(method)指定对哪些方法有效 @Before("execution(public int com.spring.aop.CalculatorImpl.add(int, int))") public void BeforeMethod() { System.out.println("Method begin"); } // @After在指定方法之后执行、使用*将匹配com.spring.aop包下所有的类的所有方法 @After("execution(* com.spring.aop.*.*(..))") public void AfterMethod(JoinPoint joinPoint) { // 输出相关信息 String methodName = joinPoint.getSignature().getName(); System.out.println("The method " + methodName + " end"); }}
4.Spring配置文件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:p="http://www.springframework.org/schema/p" 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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <bean id="calculator" class="com.spring.aop.CalculatorImpl" /> <!-- 需要扫描注解的包 --> <context:component-scan base-package="com.spring.aop" /> <!-- 使Aspect生效 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>
测试一下:
public class Test { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); Calculator calculator = (Calculator) ctx.getBean("calculator"); int result = calculator.add(11, 12); System.out.println("result:" + result); result = calculator.div(21, 3); System.out.println("result:" + result); }}
输出结果:
Method begin
The method add end
result:23
The method div end
result:7
可以看到,AOP已经正常工作了,以后需要改动记录日志的方法时只要在AspectLogging类中改动就行。
- Spring AOP快速入门
- Spring AOP(面向切面编程)【AOP快速入门】
- Spring AOP入门篇
- Spring AOP入门
- Spring AOP 入门实例
- Spring AOP 入门
- Spring AOP 入门(2)
- Spring AOP 入门实例
- Spring AOP 入门学习
- Spring AOP 入门学习
- spring AOP 入门
- Spring AOP入门
- spring AOP 入门实例
- spring aop入门例子
- Spring AOP入门
- Spring 入门 AOP
- Spring 入门 AOP
- spring aop 注解入门
- [leetcode] 67. Add Binary 解题报告
- Linux Crontab 安装使用详细说明
- 23种设计模式(15)_行为型_迭代器模式(Iterator Pattern)
- Android中strings.xml中首字符或尾字符空格无作用
- Java数据类型
- Spring AOP快速入门
- 32.利用UIViewAnimation动画制作一个简单的下拉菜单
- LDAP-轻量目录访问协议
- 如何用好 Google 等搜索引擎?
- CDN模式介绍
- python 内建模块
- ios快速创建一个app框架
- 爬虫之Scrapy
- Java算法---整数与IP地址间的转换