一、本课目标
掌握使用注解实现AOP的方法
二、使用注解定义切面
2.1简介
AspectJ
面向切面的框架,它扩展了Java语言,定义了AOP语法,能够在编译期提供代码的织入。
@AspectJ
AspectJ5新增的功能,使用JDK5.0注解技术和正规的AspectJ切点表达式语言描述切面(所以在使用@AspectJ的时候,要保证所用的JDK是5.0或者以上的版本)
Spring通过集成AspectJ实现了以注解的方式定义增强类,大大减少了配置文件中的工作量
利用轻量级的字节码处理框架asm处理@AspectJ中所描述的方法参数名
2.2示例
需求:使用注解来实现日志切面
分析:
1、使用注解定义前置增强和后置增强实现日志功能
2、编写Spring配置文件,完成切面织入
image.png
实体类:
package entity;
/**
* 用户实体类
*/
public class User implements java.io.Serializable {
private Integer id; // 用户ID
private String username; // 用户名
private String password; // 密码
private String email; // 电子邮件
// getter & setter
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
增强类:
package aop;
import java.util.Arrays;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
/**
* 增强处理类
* @author Administrator
*
*/
@Aspect
public class UserServiceLogger {
private static Logger log = Logger.getLogger(UserServiceLogger.class);
@Before("execution(* service.UserService.*(..))")
public void before(JoinPoint jp) {
log.info("调用" + jp.getTarget() + "的" +
jp.getSignature() + "方法,方法参数" +
Arrays.toString(jp.getArgs()));
}
public void afterReturning(JoinPoint jp, Object result) {
log.info("调用" + jp.getTarget() + "的" +
jp.getSignature() + "方法,方法返回值" +
result);
}
}
dao层:
package dao;
import entity.User;
/**
* 增加DAO接口,定义了所需的持久化方法
*/
public interface UserDao {
public void save(User user);
}
package dao.impl;
import org.springframework.stereotype.Repository;
import dao.UserDao;
import entity.User;
/**
* 用户DAO类,实现UserDao接口,负责User类的持久化操作
*/
@Repository("userDao