一、为什么要使用AOP编程?
1)、把横切关注点与业务逻辑分离,独立模块化;
2)、不改变当前代码而可以动态添加功能;
3)、可拓展性强
二、spring框架中使用AOP
1)、aop-*.xml配置切面
<!-- 自动扫描包开启注解 -->
<aop:config proxy-target-class="true" />
<context:annotation-config />
<bean id="logService" class="com.test.aop.LogService" />
<!-- 用户操作日志切面 -->
<aop:config>
<!-- 切入点 -->
<aop:pointcut expression="execution(* com.test.admin.controller.*.*(..)) and @annotation(logInfo)" id="pointcutSysLog" />
<aop:aspect ref="logService">
<aop:after-returning method="afterSysLog" pointcut-ref="pointcutSysLog" />
</aop:aspect>
</aop:config>
2)、aop切面方法
public class LogService {
public static final Logger log = Logger.getLogger(LogService.class);
//保存日志的实现类
@Resource
SysLogService sysLogService;
/**
* 操作日志
*
* @param list
* @param title
* @param content
*/
public void afterSysLog(JoinPoint point, Log logInfo) {
// 拦截的放参数类型
String authorizeCaseInfoIds = null;
HttpServletRequest request = null;
log.info("方法参数:" + point.getArgs() + "*******注解参数:" + logInfo.menuName() + "****操作类型*****" + logInfo.operType());
try {
for (Object obj : point.getArgs()) {
if (obj instanceof HttpServletRequest) {
request = (HttpServletRequest) obj;
}
if (obj instanceof String[]) {
authorizeCaseInfoIds = Arrays.toString((String[]) obj);
}
if (obj instanceof Integer[]) {
authorizeCaseInfoIds = Arrays.toString((Integer[]) obj);
}
}
//自定义entity
UsersInfo usersInfo = (UsersInfo) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (usersInfo != null) {
SysLog cLog = new SysLog();
cLog.setCreateTime(new Date());
cLog.setOperationUrl(request.getRequestURI() + request.getQueryString());
cLog.setLoginIp(request.getRemoteAddr());
cLog.setLoginTime(new Date());
if (StringUtils.hasText(authorizeCaseInfoIds)) {
cLog.setLoginOperator(logInfo.desc() + authorizeCaseInfoIds);
} else {
cLog.setLoginOperator(logInfo.desc());
}
cLog.setCreater(usersInfo.getUserName());
cLog.setLoginName(usersInfo.getUserName());
sysLogService.save(cLog);
}
} catch (Exception e) {
log.debug("转换错误:" + e.getMessage() + "*******注解参数:" + logInfo.menuName() + "****操作类型*****" + logInfo.operType());
}
}
}