spring aop开发日志管理
2017-02-16 22:20
429 查看
aop是spring框架的两大核心之一,即面向切面编程,它是对oo编程的补充。那么spring aop在实际项目开发中有什么作用呢?它最大的作用就是完成日志记录,一个简单的例子,你在ATM上取款系统是会记录下来一些信息的,比如取款时间、银行卡号、ATM位置、等等。不管是一般还是不一般的项目,应该来说,只要是敏感的数据,只要用户对它进行操作了,牵扯到数据库了,系统都应该以日志的形式记录下来。有日志记录功能,当用户对数据进行“非法”操作的时候,spring aop会很容易帮你找到当事人。
使用spring aop开发日志管理相当常见,现在几乎可以说每个业务系统都需要有日志管理模块,有的叫审计,间接地和安全挂上了钩。
1、定义Log实体
2、自定义注解AnnotationLog
其中@Target等4个注解的作用
3、实现AOPLog
4、LogDAO和LogDAOImpl
5、配置文件写spring aop配置,本人例子是在Spring-context.xml里写配置
6、使用注解
到这里,使用spring aop完成日志记录就结束了。
使用spring aop开发日志管理相当常见,现在几乎可以说每个业务系统都需要有日志管理模块,有的叫审计,间接地和安全挂上了钩。
1、定义Log实体
import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "SYS_LOG") public class Log { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", unique = true, nullable = false) private Integer id; /** * 操作账户 * */ @Column(name = "USERUID") private String useruid; /** * 操作用户名称 * */ @Column(name = "USERNAME") private String username; /** * 操作位置 * */ @Column(name = "OPPOSIT") private String opposit; /** * 操作内容 * */ @Column(name = "OPCONT") private String opcont; /** * 操作时间 * */ @Column(name = "CREATETIME") private Date createtime; //setters and getters }
2、自定义注解AnnotationLog
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface AnnotationLog { /** * 功能说明:日志名 * @return */ String name() default ""; /** * 功能说明:日志描述 * @return */ String description() default ""; }
其中@Target等4个注解的作用
3、实现AOPLog
import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import com.onenzg.common.hibernate.HibernateDAO; import com.onezg.common.log.domain.Log; import com.onezg.common.log.service.LogService; import com.onezg.sys.usermanage.domain.UserInfo; import com.onezg.sys.usermanage.services 4000 .UserServices; public class AopLog extends HibernateDAO<Log> { /** * 引入LogService */ @Autowired private LogService logservice; @Autowired private UserServices userServices; /** * 功能说明:输出log信息 */ public void writeLogInfo(JoinPoint point) throws Throwable { Method method = ((MethodSignature) point.getSignature()).getMethod(); AnnotationLog ann = method.getAnnotation(AnnotationLog.class); if (ann != null) { UserInfo cui = userServices.getCurrentUser(); if (null != cui) { Map<String, Object> map = new HashMap<String, Object>(); map.put("uid", cui.getuId()); map.put("givenName", cui.getuName()); logservice.insertLog(ann.name(), ann.description(), map); } } } }
4、LogDAO和LogDAOImpl
import java.util.Map; public interface LogDao { /** * 功能说明:AOP保存日志信息 * @param strLocation 参数 * @param strContent 参数 * @param userInfo 要保存的信息集合 */ void insertLog(String strLocation, String strContent, @SuppressWarnings("rawtypes") Map userInfo); }
import java.util.Date; import java.util.Map; import org.springframework.stereotype.Repository; import com.onezg.common.exception.DatabaseException; import com.onezg.common.hibernate.HibernateDAO; import com.onezg.common.log.dao.LogDao; import com.onezg.common.log.domain.Log; @Repository(value = "logdao") public class LogDaoImpl extends HibernateDAO<Log> implements LogDao { @SuppressWarnings("rawtypes") @Override public void insertLog(String strLocation, String strContent, Map userInfo) { //useruid String useruid = String.valueOf(userInfo.get("uid")); //username, 操作账户. String userName = String.valueOf(userInfo.get("givenName")); //opposit, 操作位置. String opposit = strLocation; //opcont, 操作内容. String opcont = strContent; try { Log log = new Log(); //bean对象 //封装bean数据处理 log.setUseruid(useruid); log.setUsername(userName); log.setOpposit(opposit); log.setOpcont(opcont); log.setCreatetime(new Date()); //保存对象 this.save(log); } catch (Exception ex) { throw new DatabaseException("插入登录日志失败", ex.getMessage()); } } }
5、配置文件写spring aop配置,本人例子是在Spring-context.xml里写配置
<!-- Aop配置——开始 --> <aop:config proxy-target-class="true"> <aop:aspect id="goLogAspect" ref="AfterReturningAdvice"> <aop:pointcut id="actionPointcut" expression="within(com.onezg..*)" /> <aop:before pointcut-ref="actionPointcut" method="writeLogInfo" /> </aop:aspect> </aop:config> <beans:bean id="AfterReturningAdvice" class="com.onezg.common.aop.AopLog"></beans:bean> <!-- Aop配置——结束 -->
6、使用注解
@AnnotationLog(name = "用户管理", description = "修改用户") @RequestMapping(value = "/userupdate") public void getUserUpdate(HttpSession session, HttpServletRequest request, HttpServletResponse response, Model model, UserInfoDTO dto) { try { userServices.updateUser(dto); } catch (Exception e) { throw new ParameterException("用户修改失败", e.getMessage()); } }
到这里,使用spring aop完成日志记录就结束了。
相关文章推荐
- java开发的日志的管理使用Spring的AOP
- Spring AOP进行日志记录,管理
- Spring AOP进行日志记录,管理
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- Spring AOP 日志管理
- SpringAop进行日志管理。
- Spring AOP进行日志记录,管理
- Spring-aop 日志管理小例子
- spring+mybatis基于 AOP实现业务日志管理
- Spring AOP进行日志记录,管理
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- Spring Aop 日志管理及配置文件的详细配置
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前和调用后记录相关日志。)
- Spring Aop自定义注解拦截Controller实现日志管理
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- 最全面的 Spring事务管理和AOP切面日志的注入 —aop:pointcut expression解析
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)