1.自定义注解,
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TFLogAnnotation { String module() default ""; String remark() default ""; TFLogOperationType tfoperationType() default TFLogOperationType.UNKNOWN; //这是个枚举类,定义在同级目录下 }
2.枚举类(非必须)
使用注解时手动可标注类型,更直观
/**
* 在自定义注解要用调用到的枚举类
*/
@AllArgsConstructor @Getter public enum TFLogOperationType { UNKNOWN("unknown"), DELETE("delete"), SELECT("select"), UPDATE("update"), INSERT("insert"); private String value; }
3.实体类
利用打日志的业务举例,织入到Spring内部的代码肯定要涉及到持久化存储。要构建日志类,根据自身的情况看是否继承基类(小项目不用)
/**
* 基类
**/
public class BaseEntityTF implements Serializable { private static final long serialVersionUID = 1L; private String createBy; @JsonFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) private Date createTime; private String updateBy; @JsonFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) private Date updateTime; private Map<String,Object> params; private String remarks; }
/**
* 操作日志实体类,数据库表名规范正确 小写 xx_xxx
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("DWAPP.WLOperLog")
public class OperateLogTF extends BaseEntityTF {
/**
* 日志主键
*/
@TableId("oper_id")
private Long operId;
/**具体字段涉及公司业务,此处省略
}
4.Service与实现
将数据持久化到数据库这个步骤必不可少,可以用接口分开,去编写mapper的xml映射等。当然写作业的话可以简单一些的可以写到一起。实现数据的持久化存储。被切面调用
/** * @auther TomasFeng * @date 2021/9/23-11:09 */
public interface TFLogOperateService {
void save(OperateLogTF operateLogTF);
}
@Component public class TFLogOperateServiceImpl implements TFLogOperateService { @Override public void save(OperateLogTF operateLogTF) { /** * 存到表。 */ System.out.println("save"); } }
5.重中之重:切面类。
规定切点表达式,以及各个切入点的逻辑代码。
package com.mediway.mdr.base.mylog.tfaspect; /** * @auther TomasFeng * @date 2021/9/23-11:15 */ /** * 切面类,构建出日志信息。持久化存储 */ @Aspect @Component public class TFAspect { @Autowired Service @Pointcut("@)") public void pointcut(){ } @Around("pointcut()") public Object around(ProceedingJoinPoint joinPoint){ Object result = null; //TODO 注入实体类并存到数据库 return result; } }