Spring AOP实际项目中使用案例
package com.xxx.util;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Repository;import com.xxx.domain.BaseDomain;@Aspect@Repository("maintainAspect")public class MaintainAspect {final static Logger logger = LoggerFactory.getLogger(MaintainAspect .class);//扫描路径访问规则,对所有add**的方法进行代理写入//所有需要代理写入的方法必须继承BaseDomain,然后强制写入相关用户信息@Before("execution(public * com.xxx.dao.impl.*.add*(..)) && args(baseDomain,..)")public void appendCreateInfo(BaseDomain baseDomain) throws Exception {if (baseDomain instanceof Session || baseDomain instanceof SystemLog) {return;}Session session = ThreadVariable.getSession();if (session == null || session.getUserName() == null) {logger.error("系统尝试在无登陆的情况下添加[{}]对象", baseDomain.getClass().getName());throw new Exception("Session不存在,系统不能正常工作!");}baseDomain.setCreateDate(session.getAccessTime());baseDomain.setCreateUser(session.getUserName());}@Before("execution(public * com.tianque.locationtalk.dao.impl.*.update*(..)) && args(baseDomain,..)")public void appendUPdateInfo(BaseDomain baseDomain) throws Exception {if (baseDomain instanceof Session || baseDomain instanceof SystemLog) {return;}Session session = ThreadVariable.getSession();if (session == null || session.getUserName() == null) {logger.error("系统尝试在无登陆的情况下更新[{}]对象,对象ID为[{}]", baseDomain.getClass().getName(), baseDomain.getId());throw new Exception("Session不存在,系统不能正常工作!");}baseDomain.setUpdateDate(session.getAccessTime());baseDomain.setUpdateUser(session.getUserName());}}
?配置环境方面不需要任何更改,也不需要影响之前任何代码,即可实现对相关的数据对象自动添加createuser,createdate,updateuser,updatedate。
?
AOP非常good,这种没有侵害的改造让人非常赏心悦目。很多时候都是人云亦云,以为AOP只能处理事务、日志等东西,实际上AOP远不止的,我们可以让我们的代码变得更加有质量的。