基于注解的AOP实现
一、实现思路
利用Spring AOP技术,实现dao层方法的耗时统计。要求:
1、DAO层:在com.sw.dao包下创建接口UserDao.java,定义增删改查四个方法
2、DAO层的实现类:在com.sw.dao包下创建impl包,在impl包下创建UserDao接口的实现类UserDaoImpl,在UserDaoImpl类中实现增删改查四个方法
3、pojo对象AnnoAdvice,定义通知
4、基于注解的方式配置Spring AOP
5、测试
二、编码实现
1、新建项目
搭建环境:pom.xml文件、Spring配置文件applicationContext.xml
2、DAO层
com.sw.dao包,UserDao接口
public interface UserDao {
void insert();
void delete();
void update();
void select();
}
com.sw.dao.impl包,UserDao接口的实现类UserDaoImpl
@Repository
public class UserDaoImpl implements UserDao {
Random random = new Random();
public void insert() {
try {
Thread.sleep(1000+random.nextInt(500));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("添加用户信息");
}
public void delete() {
try {
Thread.sleep(1000+random.nextInt(500));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("删除用户信息");
}
public void update() {
try {
Thread.sleep(1000+random.nextInt(500));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("更新用户信息");
}
public void select() {
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("查询用户信息");
}
}
3、配置Spring AOP
applicationContext.xml
<!--Spring IOC容器的注解扫描-->
<context:component-scan base-package="com.sw"/>
4、测试业务功能
com.sw.dao包,UserDaoImpl类方法创建测试,右键→Generate→Test
public class UserDaoImplTest {
UserDao userDao;
@Before
public void setUp() throws Exception {
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
userDao = applicationContext.getBean("userDaoImpl", UserDao.class);
}
@Test
public void insert() {
userDao.insert();
}
@Test
public void delete() {
userDao.delete();
}
@Test
public void update() {
userDao.update();
}
@Test
public void select() {
userDao.select();
}
}
5、定义通知
com.sw.pojo包,AnnoAdvice类
@Aspect
@Component
public class AnnoAdvice {
private long startTime;
private long endTime;
Logger logger = Logger.getLogger(AnnoAdvice.class);
//切入点
@Pointcut("execution(* com.sw.dao.*.*(..))")
public void pointCut(){}
//前置通知
@Before("pointCut()")
public void before(JoinPoint jp){
startTime = new Date().getTime();
}
@After("pointCut()")
public void after(JoinPoint jp){
endTime = new Date().getTime();
//方法名
String methodName = jp.getSignature().getName();
//全限定类名
String className = jp.getTarget().getClass().getName();
logger.info(className+"."+methodName+",耗时:"+(endTime-startTime)+"毫秒");
}
}
6、开启AOP自动代理
applicationContext.xml
<!-- 开启AOP的自动代理 -->
<aop:aspectj-autoproxy/>
三、更新需求
实现dao层除查询以外方法的耗时统计。
1、修改通知
com.sw.pojo包,AnnoAdvice类
//切入点
@Pointcut("execution(* com.sw.dao.*.delete*(..))" +
"||execution(* com.sw.dao.*.update*(..))" +
"||execution(* com.sw.dao.*.insert*(..))")
public void pointCut(){}