Spring学习之旅(五)极速创建Spring AOP java工程项目
编译工具:eclipse。
简单说一下,Spring AOP是干嘛的?
假设你创建了一群类:类A,类B,类C,类D。。。。
现在你想为每个类都增加一个新功能,那么该怎么办呢?是不是想到了为每个类增加相同的新代码。这未免也Boring了吧。不过不用担心,Spring AOP就是来帮组你脱离这种单调乏味无聊愚蠢的工作的。
例子:创建类A,执行类A的方法。添加类A方法执行前后的时间显示。
1)新建Java工程项目
假设工程名为:spring_aop_hello
2)导入AOP所需jar包
注意,其中aspectjrt.jar和aspectjweaver.jar并不包含在Spring框架相关包里面。
需另外下载(附下载地址:http://www.eclipse.org/downloads/download.php?file=/tools/aspectj/aspectj-1.8.13.jar)
另,下载后需解压,相关详细操作请看博客(http://blog.csdn.net/u012453843/article/details/52347208)
3)在src目录下创建Spring配置文件,并在配置文件中引入AOP命名空间(相关版本的命名空间可在官网查询)
本例相关代码稍后在本篇贴出。
4)编写业务逻辑所涉及的有关类完成原始业务需求。
创建类A:
- package com.edu.aop.hello;
- public class A {
- private String a1;
- private String a2;
- public void methodA1(){
- System.out.println("A类的方法1被执行");
- }
- public void methodA2(){
- System.out.println("A类的方法2被执行");
- }
- public A(){}
- public A(String a1,String a2){
- this.a1=a1;
- this.a2=a2;
- }
- //省略相关setter/getter方法
- }
配置文件aop_hello.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 -->
- <bean id="a" class="com.edu.aop.hello.A"></bean>
- </beans>
测试主方法:
- package com.edu.aop.hello;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class Main {
- public static void main(String[] args) {
- //创建IoC容器
- @SuppressWarnings("resource")
- ApplicationContext ctx=new ClassPathXmlApplicationContext("aop_hello.xml");
- //从容器中取出对象
- A a=(A)ctx.getBean("a");
- //引用对象,按业务逻辑要求依次执行有关的方法
- a.methodA1();
- a.methodA2();
- }
- }
运行结果:
以上为原始业务逻辑,下面涉及AOP。
5)采用“AOP编程”完成新添业务需求
创建切片类X:
- package com.edu.aop.hello;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import org.aspectj.lang.JoinPoint;
- public class X {
- //连接点对象做参考,利用该参数,获取目标对象的方法
- public void methodX1(JoinPoint joinPoint){
- String methodName=joinPoint.getSignature().getName();//获取方法名
- System.out.println("我是前置通知,在A类方法:"+methodName+"()运行前被切入");
- //获取当前系统时间,并转换为yyyy年MM月dd日 HH:mm:ss格式,并显示
- Calendar startTimeNow=Calendar.getInstance();
- SimpleDateFormat fmt=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
- String startTime=fmt.format(startTimeNow.getTime());
- System.out.println("A类方法:"+methodName+"(),运行时间:"+startTime);
- }
- //连接点对象做参数,利用该参数,获取目标对象的方法
- public void methodX2(JoinPoint joinPoint){
- String methodName=joinPoint.getSignature().getName();//获取方法名
- System.out.println("我是后置通知,在A类方法:"+methodName+"()运行后切入");
- //获取当前系统时间,并转换为yyyy年MM月dd日 HH:mm:ss格式,并显示
- Calendar endTimeNow=Calendar.getInstance();
- SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
- String endTime=sdf.format(endTimeNow.getTime());
- System.out.println("A类方法:"+methodName+"()运行结束时间:"+endTime);
- }
- }
在配置文件内配置切片,配置完成后的文件代码为:
- <?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 -->
- <bean id="a" class="com.edu.aop.hello.A"></bean>
- <!-- 将切面类声明配置成一个bean -->
- <bean id="x" class="com.edu.aop.hello.X"></bean>
- <aop:config>
- <aop:aspect ref="x">
- <!-- 配置前置通知及前置通知的切入点 -->
- <aop:before method="methodX1" pointcut="execution(* com.edu.aop.hello.A.*())"></aop:before>
- <!-- 配置后置通知及后置通知的切入点 -->
- <aop:after method="methodX2" pointcut="execution(* com.edu.aop.hello.A.*())"></aop:after>
- </aop:aspect>
- </aop:config>
- </beans>
6)部署运行。
运行结果为:
参考书籍《Java EE框架开发技术与案例教程》
Spring学习之旅(五)极速创建Spring AOP java工程项目的更多相关文章
- Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探
由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...
- Spring学习之旅(四)Spring工作原理再探
上篇博文对Spring的工作原理做了个大概的介绍,想看的同学请出门左转.今天详细说几点. (一)Spring IoC容器及其实例化与使用 Spring IoC容器负责Bean的实例化.配置和组装工作有 ...
- Spring学习之旅(三)Spring工作原理初探
详细的废话相信很多书籍视频资料都已经很多了,这里说几个小编个人认为对于理解Spring框架很重要的点.欢迎批评指正. 1)Spring的控制反转 先说说“依赖”,在面向对象程序设计中,类A中用到了类B ...
- Spring学习之旅(五)--AOP
什么是 AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是 OOP(Object-Oriented Programing,面向对象编程)的补充和完善. OO ...
- Spring学习之旅(六)Spring AOP工作原理初探
AOP(Aspect-Oriented Programming,面向切面编程)是Spring提供的关键技术之一. AOP基于IoC,是对OOP(Object-Oriented Programming ...
- Spring学习之旅(十)--MockMvc
在之前的 Spring学习之旅(八)--SpringMVC请求参数 我们是通过在控制台输出来验证参数是否正确,但是这样做实在是太耗时间了,我们今天来学习下 MockMvc,它可以让我们不需要启动项目就 ...
- Spring学习之旅(十五)--SpringBoot
在使用 Spring 的过程中,有时候会出现一些 ClassNotFoundException 异常,这是因为 JAR 依赖之间的版本不匹配所导致的.而 Spring Boot 就能避免绝大多数依赖版 ...
- Spring学习总结(五)——Spring整合MyBatis(Maven+MySQL)一
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中. 使用这个类库中的类, Spring 将会加载必要的MyBatis工厂类和 session 类. 这个类库 ...
- mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)
文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文 ...
随机推荐
- ARM debian的图形界面安装
这里图形界面的安装比较简单,启动系统后,登录到root账户,首先要执行更新源的命令:apt-get update 然后直接执行下面的动作: 直接安装LXDE即可: 指令: apt-get insta ...
- 在Mac上安装MongoDB,配置全局路径
1.访问MongoDB官方下载地址 http://www.mongodb.org/downloads 2.点击“DOWNLOAD(tgz)”按钮: 3.将下载的文件压缩包解压后剪切到你的Mac中某个位 ...
- Xamarin.Android 利用Fragment实现底部菜单
效果图: 第一步:添加引用 引用 Crosslight.Xamarin.Android.Support.v7.AppCompat 这个包. 第二步:绘制Main和Fragment界面 fg_home. ...
- HTTP/2协议–特性扫盲篇
HTTP/2协议–特性扫盲篇 随着web技术的飞速发展,1999年制定的HTTP 1.1已经无法满足大家对性能的要求,Google推出协议SPDY,旨在解决HTTP 1.1中广为人知的性能问题.SPD ...
- shell运算符与流程控制-2
1.shell运算符 1.1.算数运算符 原生的bash不支持算数运算,可以通过其它方式实现例如expr. `expr a + b` #a b为数字,和运算符之间要有空格 #``不是单引号,为键盘上E ...
- Spring系列之手写注解与配置文件的解析
目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 Spring系列之AOP的原理及手动实现 引入 在前面我们已经完成了IOC,DI,AOP的实现,基本的功能都已经 ...
- eclipse连接github,链接不上 cannot open git-upload-pack(git-receive-pack)
2018年2月8日后禁止通过TLSv1.1协议连接https://github.com 和 https://api.github.com. 原文地址为https://githubengineering ...
- python使用多进程
python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势. 针对计算密集型场景需要使用多进程,python的multipro ...
- 隐马尔可夫模型(HMM)及Viterbi算法
HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引 ...
- iframe关闭操作
关闭自定义 Div+Iframe弹窗 :window.parent.$("div的id/class/name").remove();//移除div 关闭Iframe弹窗:windo ...