Spring AOP 实现业务日志记录
2012-02-23 22:20
555 查看
1. 用户管理业务逻辑接口(UserManagerApplogic.java )
Java代码
package com.iteye.applogic;
public interface UserManagerApplogic {
public void addUser(String name);
}
2. 用户管理业务逻辑实现类(UserManagerApplogicImpl.java)
Java代码
package com.iteye.applogic.impl;
import org.springframework.stereotype.Component;
import com.iteye.applogic.UserManagerApplogic;
import com.iteye.annotation.BussAnnotation;
@Component("userManager")
public class UserManagerApplogicImpl implements UserManagerApplogic {
@BussAnnotation(moduleName="人员管理",option="添加用户")
public void addUser(String name) {
System.out.println("add a User!Name is "+name);
}
}
3.业务注释类(BusAnnotation.java)
Java代码
package com.iteye.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface BussAnnotation {
//模块名
String moduleName();
//操作内容
String option();
}
(1)RetentionPolicy(保留策略)是一个enum类型,共有三个值,分别是SOURCE,CLASS 和 RUNTIME。
SOURCE 代表的是这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面。
ClASS的 代表的是这个Annotation类型的信息保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这一些信息加载到虚拟机(JVM)中去.注意一下,当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS。
RUNTIME代表的是表示在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的。
(2)ElementType
@Target里面的ElementType是用来指定Annotation类型可以用在哪一些元素上的.
TYPE(类型)是指可以用在Class,Interface,Enum和Annotation类型上.
FIELD(属性)
METHOD(方法)
PARAMETER(参数)
CONSTRUCTOR(构造函数)
LOCAL_VARIABLE(局部变量)
ANNOTATION_TYPE
PACKAGE(包)
(3)@Documented
@Documented的目的就是让这一个Annotation类型的信息能够显示在javaAPI说明文档上;没有添加的话,使用javadoc生成API文档的时候就会找不到这一个类型生成的信息。
(4)@Inherited
如果需要把Annotation的数据继承给子类,那么就会用到@Inherited这一个Annotation类型。
4.切面类(LogInterceptor.java)
Java代码
package com.iteye.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import com.iteye.annotation.BussAnnotation;
@Aspect
@Component
public class LogInterceptor {
@Pointcut("execution(public * com.iteye..*.addUser(..))")
public void aApplogic() {}
@Around(value = "aApplogic() && @annotation(annotation) &&args(object,..) ", argNames = "annotation,object")
public Object interceptorApplogic(ProceedingJoinPoint pj,
BussAnnotation annotation, Object object) throws Throwable {
System.out.println("moduleName:"+annotation.moduleName());
System.out.println("option:"+annotation.option());
pj.proceed();
return object;
}
}
5.配置文件(applicationContext-aop.xml)
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<context:annotation-config />
<context:component-scan base-package="com.iteye"/>
<aop:aspectj-autoproxy />
</beans>
6.测试类( test.java (Junit) )
Java代码
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.iteye.applogic.UserManagerApplogic;
public class test {
@Test
public void test1()
{
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext("applicationContext-aop.xml");
UserManagerApplogic userManager = (UserManagerApplogic) ctx.getBean("userManager");
userManager.addUser("-li.bb-");
ctx.destroy();
}
}
Java代码
package com.iteye.applogic;
public interface UserManagerApplogic {
public void addUser(String name);
}
2. 用户管理业务逻辑实现类(UserManagerApplogicImpl.java)
Java代码
package com.iteye.applogic.impl;
import org.springframework.stereotype.Component;
import com.iteye.applogic.UserManagerApplogic;
import com.iteye.annotation.BussAnnotation;
@Component("userManager")
public class UserManagerApplogicImpl implements UserManagerApplogic {
@BussAnnotation(moduleName="人员管理",option="添加用户")
public void addUser(String name) {
System.out.println("add a User!Name is "+name);
}
}
3.业务注释类(BusAnnotation.java)
Java代码
package com.iteye.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface BussAnnotation {
//模块名
String moduleName();
//操作内容
String option();
}
(1)RetentionPolicy(保留策略)是一个enum类型,共有三个值,分别是SOURCE,CLASS 和 RUNTIME。
SOURCE 代表的是这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面。
ClASS的 代表的是这个Annotation类型的信息保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这一些信息加载到虚拟机(JVM)中去.注意一下,当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS。
RUNTIME代表的是表示在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的。
(2)ElementType
@Target里面的ElementType是用来指定Annotation类型可以用在哪一些元素上的.
TYPE(类型)是指可以用在Class,Interface,Enum和Annotation类型上.
FIELD(属性)
METHOD(方法)
PARAMETER(参数)
CONSTRUCTOR(构造函数)
LOCAL_VARIABLE(局部变量)
ANNOTATION_TYPE
PACKAGE(包)
(3)@Documented
@Documented的目的就是让这一个Annotation类型的信息能够显示在javaAPI说明文档上;没有添加的话,使用javadoc生成API文档的时候就会找不到这一个类型生成的信息。
(4)@Inherited
如果需要把Annotation的数据继承给子类,那么就会用到@Inherited这一个Annotation类型。
4.切面类(LogInterceptor.java)
Java代码
package com.iteye.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import com.iteye.annotation.BussAnnotation;
@Aspect
@Component
public class LogInterceptor {
@Pointcut("execution(public * com.iteye..*.addUser(..))")
public void aApplogic() {}
@Around(value = "aApplogic() && @annotation(annotation) &&args(object,..) ", argNames = "annotation,object")
public Object interceptorApplogic(ProceedingJoinPoint pj,
BussAnnotation annotation, Object object) throws Throwable {
System.out.println("moduleName:"+annotation.moduleName());
System.out.println("option:"+annotation.option());
pj.proceed();
return object;
}
}
5.配置文件(applicationContext-aop.xml)
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<context:annotation-config />
<context:component-scan base-package="com.iteye"/>
<aop:aspectj-autoproxy />
</beans>
6.测试类( test.java (Junit) )
Java代码
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.iteye.applogic.UserManagerApplogic;
public class test {
@Test
public void test1()
{
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext("applicationContext-aop.xml");
UserManagerApplogic userManager = (UserManagerApplogic) ctx.getBean("userManager");
userManager.addUser("-li.bb-");
ctx.destroy();
}
}
相关文章推荐
- Spring AOP 实现业务和异常日志记录实战
- Spring AOP 实现业务日志记录
- spring aop 实现用户操作日志记录功能(转)
- 利用Spring AOP实现业务和异常日志记录
- Spring AOP实现日志记录
- Spring AOP 实现业务日志记录 (注解)
- Spring AOP 实现业务日志记录
- Spring AOP实现系统日志记录
- 请教.Net平台大型业务系统中“日志记录” 的较好解决办法,类似Java下用AOP方式实现的最好
- openssh 源码更改实现记录日志功能及动态回放思路
- LogBack sl4j 通过MDC实现日志记录区分用户Session[以Spring mvc为例] - 独木桥
- 利用特性功能实现简易的AOP日志记录功能
- Spring aop Aspect实现Service或Controller日志记录
- apache实现按天记录日志
- 使用代理模式扩展logback,实现自定义的日志记录功能
- Laravel框架实现利用中间件进行操作日志记录功能
- 基于Spring AOP实现可控的请求日志保存,自定义注解
- 通过脚本实现从日志文件中提取时间最近的几条记录
- 全Sql语句实现SBO事务日志记录与查询
- ASP.NET记录错误日志的实现方法