springaop---->springaop的使用(一)
与大多数技术一样, AOP 已经形成了自己的术语。描述切面的常用术语有通知(advice)、切点(pointcut)和连接点(join point)。从今天开始,我们对spring的切面编程做一个总结。她们都是你漫漫长路上,只配错过的好姑娘。
spring中的aop
spring的切面可以应用以下的5种类型的通知:
- 前置通知(Before):在目标方法被调用之前调用通知功能;
- 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
- 返回通知(After-returning):在目标方法成功执行之后调用通知;
- 异常通知(After-throwing):在目标方法抛出异常后调用通知;
- 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
对于spring中aop的支持,主要分为@AspectJ 注解驱动的切面和基于xml的spring的配置。以下我们对这两种配置做一个简单的了解。测试的代码目录如下:
以后可能对于spring的关于aop学习,这个目录可能会添加代码。application-xml.xml是学习xml配置的,application-aop.xml是学习@Aspectj注解配置的。
springaop的xml配置方式
一、我们的application-xml.xml文件内容如下:
<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="myService" class="com.linux.huhx.business.service.MyAspectService3"/>
<bean id="myAspect" class="com.linux.huhx.aspect.XmlUserfulAspect"/> <aop:config>
<aop:aspect id="xmlAspect1" ref="myAspect">
<aop:pointcut id="businessService" expression="execution(* com.linux.huhx.business.service.MyAspectService3.*())"/> <aop:before method="beforeExecute" pointcut-ref="businessService"/>
<aop:after method="afterExecute" pointcut-ref="businessService"/>
</aop:aspect>
</aop:config>
</beans>
二、我们的切面类XmlUserfulAspect如下:
package com.linux.huhx.aspect; /**
* @Author: huhx
* @Date: 2017-12-15 下午 12:31
* @Desc: 切面类
*/
public class XmlUserfulAspect { public void beforeExecute() {
System.out.println("before execute.");
} public void afterExecute() {
System.out.println("after execute.");
}
}
三、我们简单的定义一个应用切面的服务类
package com.linux.huhx.business.service; /**
* @Author: huhx
* @Date: 2017-12-15 下午 12:28
*/
public class MyAspectService3 { public void serviceMethod() {
System.out.println("my aspect service1 method.");
}
}
四、在main的类中我们对上述的切面进行测试
package com.linux.huhx.main; import com.linux.huhx.business.service.MyAspectService3;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* @Author: huhx
* @Date: 2017-12-15 下午 12:32
* @Desc: 基于xml配置的aop测试主体类
*/
public class XmlServiceMain {
private ApplicationContext context = null; @Before
public void initApplicationContext() {
context = new ClassPathXmlApplicationContext("application-xml.xml");
} @Test
public void aspectServiceTest_1() {
MyAspectService3 myAspectService1 = context.getBean("myService", MyAspectService3.class);
myAspectService1.serviceMethod();
}
}
打印的结果如下:
before execute.
my aspect service1 method.
after execute.
springaop中关于注解的方式
这里面设计的代码比较多,主要是为了测试不同的知识点。这里全部贴出代码,后续再做整理。后续我们对这两种的配置方式做一个比较细致的过程讲解。使用aspectj,我们需要在pom.xml文件中添加依赖:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.11</version>
</dependency>
一、application-aop.xml的文件内容如下
<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"> <aop:aspectj-autoproxy/> <bean id="myService1" class="com.linux.huhx.business.service.MyAspectService1"/>
<bean id="myService2" class="com.linux.huhx.business.service.MyAspectService2"/> <!--declare an aspect-->
<bean id="myAspect" class="com.linux.huhx.aspect.NotVeryUsefulAspect"/>
<bean id="myAspect1" class="com.linux.huhx.aspect.LittleUserfulAspect"/>
</beans>
二、两个测试切面的服务类如下:
- MyAspectService1:这里面主要测试切面的5种类型的通知。
package com.linux.huhx.business.service; import java.io.FileNotFoundException; /**
* @Author: huhx
* @Date: 2017-12-15 上午 10:08
* @Desc: 一个简单的测试aspect的实类
*/
public class MyAspectService1 { public void serviceMethod() {
System.out.println("myaspect service1 method.");
} public String returnServiceMethod() {
return "return huhx.";
} public String throwExceptionMethod() {
System.out.println("throw exception method.");
try {
throw new FileNotFoundException("not found class.");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return "hello world";
} public String aroundServiceMethod1() {
System.out.println("around service method.");
return "huhx";
}
}
- MyAspectService2.java:这里面测试切面传递参数。
package com.linux.huhx.business.service; import java.util.Map; /**
* @Author: huhx
* @Date: 2017-12-15 上午 11:17
*/
public class MyAspectService2 { public void serviceMethod_1(Map<String, String> map) {
System.out.println("service method." + map);
}
}
三、两个切面的类如下
- NotVeryUsefulAspect:是针对于上述的MyAspectService1类的,为了测试5种通知类型。
package com.linux.huhx.aspect; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*; /**
* @Author: huhx
* @Date: 2017-12-15 上午 9:51
* @Desc: 定义一个aspect
*/ @Aspect
public class NotVeryUsefulAspect {
private static final String pointCutString = "execution(* com.linux.huhx.business.service.MyAspectService1.*())"; @Before(pointCutString)
public void beforeExecute() {
System.out.println("before advice.");
} @After(pointCutString)
public void afterExecute() {
System.out.println("after advice.");
} @AfterReturning(value = pointCutString, returning = "retVal")
public void afterReturingExecute1(String retVal) {
System.out.println("after throwing " + retVal);
} @AfterThrowing(value = pointCutString, throwing = "exception")
public void afterThrowingExecute1(Throwable exception) {
System.out.println("throwing in advice show message: " + exception.getMessage());
} @Around(value = pointCutString)
public void arundExecute1(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("before around.");
System.out.println(pjp.proceed());
System.out.println("after around.");
}
}
- LittleUserfulAspect:是对应于MyAspectService2类的,为了测试切面中参数的传递。
package com.linux.huhx.aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut; import java.util.Map; /**
* @Author: huhx
* @Date: 2017-12-15 上午 11:16
* @Desc: 定义一个切面
*/
@Aspect
public class LittleUserfulAspect { @Pointcut("execution(* com.linux.huhx.business.service.MyAspectService2.*(..)) && args(map,..)")
public void anyMethod(Map<String, String> map) {} @Before(value = "anyMethod(map)")
public void beforeExecute(Map map) {
System.out.println("before execute." + map);
}
}
四、我们的测试主体类ServiceMain
package com.linux.huhx.main; import com.linux.huhx.business.service.MyAspectService1;
import com.linux.huhx.business.service.MyAspectService2;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.HashMap;
import java.util.Map; /**
* @Author: huhx
* @Date: 2017-12-15 上午 10:13
* @Desc: 测试的main类
*/
public class ServiceMain {
private ApplicationContext context = null; @Before
public void initApplicationContext() {
context = new ClassPathXmlApplicationContext("application-aop.xml");
} @Test
public void aspectServiceTest_1() {
MyAspectService1 myAspectService1 = context.getBean("myService1", MyAspectService1.class);
myAspectService1.serviceMethod();
} @Test
public void aspectServiceTest_2() {
MyAspectService1 myAspectService1 = context.getBean("myService1", MyAspectService1.class);
myAspectService1.returnServiceMethod();
} @Test
public void aspectServiceTest_3() {
MyAspectService1 myAspectService1 = context.getBean("myService1", MyAspectService1.class);
myAspectService1.throwExceptionMethod();
} @Test
public void aspectServiceTest_4() {
MyAspectService1 myAspectService1 = context.getBean("myService1", MyAspectService1.class);
myAspectService1.aroundServiceMethod1();
} /* 其它的切面实现类 */
@Test
public void aspectServiceTest_5() {
MyAspectService2 myAspectService2 = context.getBean("myService2", MyAspectService2.class);
Map<String, String> dataMap = new HashMap<>();
dataMap.put("username", "linux");
dataMap.put("password", "12345");
myAspectService2.serviceMethod_1(dataMap);
}
}
友情链接
springaop---->springaop的使用(一)的更多相关文章
- 梳理清楚springAOP,轻松面向切面编程
不知道大家有没有这样的感觉,平时经常说aop,但是对aop中的一些概念还是模糊,总感觉很飘渺,今天来梳理下关于aop的知识. 一.概念 我们知道现在开发都是spring,讲的最多的也是springAO ...
- Spring-AOP实践 - 统计访问时间
公司的项目有的页面超级慢,20s以上,不知道用户会不会疯掉,于是老大说这个页面要性能优化.于是,首先就要搞清楚究竟是哪一步耗时太多. 我采用spring aop来统计各个阶段的用时,其中计时器工具为S ...
- Spring-Aop入门
(一)Aop术语定义 1.通知(advice) 通知定义了切面要做什么工作,即调用的方法,同时定义了什么时候做这些工作,即以下五种类型 (1)前置通知(Before) :在目标方法调用之前执行切面方法 ...
- 转-springAOP基于XML配置文件方式
springAOP基于XML配置文件方式 时间 2014-03-28 20:11:12 CSDN博客 原文 http://blog.csdn.net/yantingmei/article/deta ...
- SpringAOP详解(转载大神的)
AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之.翻译过来就是"面向方面编程&q ...
- spring-aop学习
SpringAOP学习 author:luojie 1. AOP中的基本概念 AOP的通用术语,并非spring java所特有.很遗憾AOP的术语不是特别的直观.但如果让Spring java来 ...
- SpringAOP之静态代理
一.SpringAOP: ⒈AOP:Aspect Oriented Programming 面向切面编程, 实现的是核心业务和非核心业务之间的的分离,让核心类只做核心业务,代理类只做非核心业务. ⒉ ...
- springaop实现登陆验证
1.首先配置好springmvc和springaop 2.先写好登陆方法,通过注解写代理方法 通过代理获得登陆方法的参数方法名,然后再aop代理方法内进行登陆验证 贴出代码 package com.h ...
- spring-aop示例
具体案例放在github上,主要是jar包在上面 https://github.com/guoyansi/spring-aop-example knights.xml <?xml version ...
- 使用SpringAop 验证方法参数是否合法
(原文地址:http://blog.csdn.net/is_zhoufeng/article/details/7683194) 1.依赖包 aspectjweaver.jar 其中Maven的配 ...
随机推荐
- 多媒体开发之h264中的sps---sps信息提取之帧率
------------------------------author:pkf -----------------------------------------time:2015-8-20 --- ...
- repo sync出现“fatal: '../platform/abi/cpp.git' does not appear to be a git repository”的解决方案
在我下载Android源代码时,在最后一步调用repo sync,出现“fatal: '../platform/abi/cpp.git' does not appear to be a git rep ...
- 测试webservice的时候,如果出现这个错误:"The test form is only available for requests from the local machine"
测试webservice的时候,如果出现这个错误:"The test form is only available for requests from the local machine&q ...
- PLSQL Developer连接不上64位Oracle 10g的解决办法
下载instantclient-basic-win32-10.2.0.4.zip 假设Oracle 10g的安装目录为D:\oracle\product\10.2.0\db1 首先,将instantc ...
- html 禁用点击事件
1.css禁用鼠标点击事件 .disabled { pointer-events: none; } 注:(这个没有试过) jquery禁用a标签方法1 $(document).ready(functi ...
- 支持Android 的几款开源3D引擎调研
最近由于工作需要,对支持Android的一些开源3D引擎做了调研,结果如下: 1.Ogre 十分强大的一款3D引擎,号称工业级标准的开源项目,不仅可以用于游戏,还可以用于其他和3D相关的软件.大多数该 ...
- 按键精灵如何调用Excel及按键精灵写入Excel数据的方法教程---入门自动操作表格
首先来建立一个新的Excel文档,在桌面上点击右键,选择[新建]-[Excel工作表],命名为[新手学员]. 现在这个新Excel文档是空白的,我们接下来会通过按键精灵的脚本来打开并写入一些数据.打开 ...
- lnmp无法删除.user.ini文件的解决办法
有一次使用命令lnmp vhost del删除虚拟主机后,需要使用ftp或者rm命令删除网站目录,但是却发现网站目录下有个文件.user.ini文件没有自动删除,出现提示rm: cannot remo ...
- UNIX环境编程学习笔记(27)——多线程编程(二):控制线程属性
lienhua342014-11-09 1 线程属性概括 POSIX 线程的主要属性包括 scope 属性.detach 属性.堆栈地址.堆栈大小.优先级.在头文件 pthread.h 中定义了结构体 ...
- 【QT】Cannot find file: untitled.pro,项目路径不要包含中文。
Cannot find file: D:\文件及下载相关\文档\untitled\untitled.pro. 17:01:45: 进程"D:\Englishpath\QT5.9.3\5.9. ...