为了以后更好的实习,今天了解了一下spring的aop的基础知识,做了一些简单的测试,算入门aop吧,记录下来,方便以后查阅!
spring的版本2.5.6,由于目前aspectj的aop比spring做得更出色,而且spring也提倡直接使用aspectj的底层实现,所以我直接采用了spring提供的aspectj实现;首先基于Annotation的方式,因为这种方式简单一点:
假设场景:一个普通的服务员,能打招呼,提供服务,这个服务员不会使用礼貌用语;于是公司给她们进行了一次培训,好让她们每个人都有学会礼貌用语,显得都有素质,于是每个服务员都变成了有礼貌有素质的服务员。
第一步:加入jar包
不多讲,先加入几个基本的jar包,测试时少了jar包再添加进去就行
第二步:定义一个接口,对应文件: Waiter.java
package com.aop.interfaces;
/**
* @author 紫竹
* 模拟没有礼貌的服务生
*/
public interface Waiter {
/**
* 打招呼
* @param name 顾客的姓名
*/
void greetTo(String name);
/**
* 提供服务
*/
void serverTo();
/**
* 服务结束,bye
*/
void bye();
}
package com.aop.impl;
import org.springframework.stereotype.Component;
import com.aop.interfaces.Waiter;
/**
* @author 紫竹
* Waiter的实现类,简单实现里面的方法,直接使用System打印出来
*/
@Component("naiveWaiter")
public class NaiveWaiter implements Waiter {
@Override
public void greetTo(String name) {
System.out.println("greet to " + name + "....");
}
@Override
public void serverTo() {
System.out.println("server to ....");
}
@Override
public void bye() {
System.out.println("bye !");
}
}
package com.aop.test;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.aop.interfaces.Waiter;
/**
* @author 紫竹
* 测试spring的环境
*/
public class Client {
private ApplicationContext context = null;
@Before
public void before(){
context = new ClassPathXmlApplicationContext("beans.xml");
}
@Test
public void testNaiveWaiter(){
Waiter w = (Waiter)context.getBean("naiveWaiter");
String name = "Tom";
w.greetTo(name);
w.serverTo();
w.bye();
}
}
配置文件: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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
<context:annotation-config />
<context:component-scan base-package="com.aop" />
<!-- <aop:aspectj-autoproxy />-->
</beans>
输出结果:
greet to Tom....
server to ....
bye !
环境没有问题,继续测试;
公司给她们培训之后,于是他们每个人都有素质了,那么她们每个人都有素质了,在给顾客打招呼之前需要说hello,服务前后需要记录时间,结束后需要祝福语,have a good day!每个人都需要添加这些礼貌用语,使用aop进行统一操作
有礼貌的服务生代理类:NiceWaiterProxy.java
package com.aop.proxy;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* @author 紫竹
* 礼貌的服务生代理:在打招呼之前说一声hello,服务的时候记录时间,结束后say:good bye, have a good day
*/
@Aspect
@Component
public class NiceWaiterProxy {
/**
* 测试execution语法:以下10种都能匹配,懂的,匹配范围依次增大
*/
// @Pointcut("execution(public void com.aop.impl.NaiveWaiter.greetTo(String))")
// @Pointcut("execution(public void com.aop.impl.NaiveW aiter.greetTo(*))")
// @Pointcut("execution(public void com.aop.impl.NaiveWaiter.greetTo(..))")
// @Pointcut("execution(public * com.aop.impl.NaiveWaiter.greetTo(..))")
// @Pointcut("execution(* com.aop.impl.NaiveWaiter.greetTo(..))")
// @Pointcut("execution(* com.aop.impl.*.greetTo(..))")
// @Pointcut("execution(* com.aop.*.*.greetTo(..))")
// @Pointcut("execution(* com.aop.impl..greetTo(..))")//多级目录不确定的情况
// @Pointcut("execution(* com.aop.impl..greet*(..))")
@Pointcut("execution(* *..greet*(..))")
public void greetTo(){};
@Pointcut("execution(public void com.aop.impl.NaiveWaiter.server*(..))")
public void server(){}
@Pointcut("execution(public void com.aop.impl.NaiveWaiter.bye())")
// @Pointcut("execution(public void com.aop.impl.NaiveWaiter.bye(..))")//匹配既可以有参数,也可以无参数
// @Pointcut("execution(public void com.aop.impl.NaiveWaiter.bye(*))")//只匹配有参数的
public void bye(){};
//在pointcut匹配的方法之前执行
@Before("greetTo()")//注解里面的名字和Pointcut处声明的方法名字相同
public void before(){
System.out.print("hello , ");
}
//在pointcut匹配的方法之后执行
@After("bye()")
public void after(){
System.out.print("have a good day!!!");
}
//在pointcut匹配的方法的前后都执行
@Around("server()")
public void around(ProceedingJoinPoint pjp){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
System.out.println("I am a clock , record: " + sdf.format(new Date()) );
try {
pjp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("I am a clock , record: " + sdf.format(new Date()) );
}
}
重新运行测试类,输出结果:
hello , greet to Tom....
I am a clock , record: 2011-48-11 22:48:42
server to ....
I am a clock , record: 2011-48-11 22:48:42
bye !
have a good day!!!
很好,文明用语都添加上了,aop 最基础的东西测试完毕了