Spring AOP实际项目中使用案例
2014-12-28 08:56
405 查看
OP有三种织入切面的方法:
其一是编译期织入,这要求使用特殊的Java编译器,AspectJ是其中的代表者;
其二是类装载期织入,而这要求使用特殊的类装载器,AspectJ和AspectWerkz是其中的代表者;
其三为动态代理织入,在运行期为目标类添加增强生成子类的方式,Spring AOP采用动态代理织入切面。
Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。
基于JDK的代理和基于CGLib的代理是Spring AOP的核心实现技术,认识这两代理技术,有助于探究Spring AOP的实现机理。只要你愿意,你甚至可以抛开Spring,提供自己的AOP实现。
AOP概念到处都在传,之前以为自己了解了,无非就是应用在日志、事务、权限方面的面向切面编程思想的一种架构或者设计模式罢了,今天在迁移一个项目的时候,发现了AOP的妙处。
实际场景描述,可以说基本每个表结构或者说数据对象都需要createuser,createdate,updateuser,updatedate,创建者,创建时间,修改者,修改时间,如果每次都要自己手动写,在每个dao的add和update方法中复制粘贴,很容易出错,而且工作量比较大的,不能保证完全正确。这个时候我们就可以使用AOP思想,来处理解决该问题。
Java代码
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远不止的,我们可以让我们的代码变得更加有质量的。
其一是编译期织入,这要求使用特殊的Java编译器,AspectJ是其中的代表者;
其二是类装载期织入,而这要求使用特殊的类装载器,AspectJ和AspectWerkz是其中的代表者;
其三为动态代理织入,在运行期为目标类添加增强生成子类的方式,Spring AOP采用动态代理织入切面。
Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。
基于JDK的代理和基于CGLib的代理是Spring AOP的核心实现技术,认识这两代理技术,有助于探究Spring AOP的实现机理。只要你愿意,你甚至可以抛开Spring,提供自己的AOP实现。
AOP概念到处都在传,之前以为自己了解了,无非就是应用在日志、事务、权限方面的面向切面编程思想的一种架构或者设计模式罢了,今天在迁移一个项目的时候,发现了AOP的妙处。
实际场景描述,可以说基本每个表结构或者说数据对象都需要createuser,createdate,updateuser,updatedate,创建者,创建时间,修改者,修改时间,如果每次都要自己手动写,在每个dao的add和update方法中复制粘贴,很容易出错,而且工作量比较大的,不能保证完全正确。这个时候我们就可以使用AOP思想,来处理解决该问题。
Java代码
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远不止的,我们可以让我们的代码变得更加有质量的。
相关文章推荐
- SpringAop在实际项目中的使用案例
- spring心得10--使用Aspectj进行AOP开发介绍及案例分析
- zTree的调用设使用(跨两个系统,两类技术实现的项目案例SpringMVC+Spring+MyBatis和Struts2+Spring+ibatis框架组合)
- spring项目中aop的使用
- spring心得2--bean的生命周期@Spring监听器的作用@Spring初始化容器案例分析@web项目使用
- SpringBoot项目中使用AOP
- 使用AOP记录SpringBoot项目编辑前后字段的具体改变
- 在spring中使用MethodInterceptor实现aop(附项目中demo)
- 项目案例: Springboot中使用过滤器映射访问路径
- SpringAop在实际项目中的使用案例
- spring心得2--bean的生命周期@Spring监听器的作用@Spring初始化容器案例分析@web项目使用
- zTree的调用设使用(跨两个系统,两类技术实现的项目案例SpringMVC+Spring+MyBatis和Struts2+Spring+ibatis框架组合)
- Session用法案例 -->实现简单购物车功能(实际项目可能不会这么使用)
- 第四节:MVC中AOP思想的体现(四种过滤器)并结合项目案例说明过滤器的实际用法
- Spring AOP解释及在项目中使用举例
- SpringBoot项目中使用AOP的方法
- SpringBoot项目中使用AOP
- Springboot项目使用aop切面保存详细日志到ELK日志平台
- 基于Spring AOP和Groovy日志模板配置的日志记录框架的二次实现与使用案例
- JAVA_WEB项目之Spring中使用AOP编程运用到Lucene中实现解耦