Spring AOP笔记
首先,web.xml配置一个listener
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
其实,使用默认的springListener配置文件路径:WEB-INF/applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <aop:aspectj-autoproxy/> <bean id="logAspect" class="com.amhuman.comm.LogAspect"></bean> <bean id="userService" class="com.amhuman.service.UserServiceImpl" /> <bean class="com.amhuman.comm.SpringHelper"></bean> </beans>
接下来就是编写切面了(这里还用到了自定义的注解,下面会补上代码)
package com.amhuman.comm;
import java.lang.reflect.Method;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
@Aspect
public class LogAspect {
@After("execution(public * *(..))")
public void afterSayHello(){
System.out.println("After : ");
}
@Before("execution(public * *(..))")
public void beforeSayHello(){
System.out.println("Before : ");
}
@Around("execution(public * *(..)) && @annotation(com.amhuman.comm.Log)")
public Object doLog(ProceedingJoinPoint pjp) throws Throwable{
String param = "";
Log logAnno = getAnno(pjp);
if(logAnno.id() != -1){
Object obj = pjp.getArgs()[logAnno.id()];
if(logAnno.fieldName() == ""){
param = obj.toString();
}else{
String fieldName = logAnno.fieldName();
Method getMethod = obj.getClass().getMethod("getUserName", null);
System.out.println(obj.getClass().toString());
System.out.println(getMethod.toString());
Object objddd = getMethod.invoke(obj, null);
System.out.println(objddd);
// param = getMethod.invoke(obj, null).toString();
}
}
System.out.println("#before asp : "+ param);
Object ret = pjp.proceed();
System.out.println("#aftor asp");
return ret;
}
private Log getAnno(ProceedingJoinPoint pjp) throws SecurityException, NoSuchMethodException{
Class<?> currClass = pjp.getTarget().getClass();
Method method = ((MethodSignature) pjp.getSignature()).getMethod();
String shortMethodName = method.getName();
Method realMethod = currClass.getMethod(shortMethodName, method.getParameterTypes());
Log logAnnotation = realMethod.getAnnotation(Log.class);
return logAnnotation;
}
}注解的代码:
package com.amhuman.comm;
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 Log {
public int id() default -1;
public String fieldName() default "";
}写个单元测试跑下:
package com.amhuman.test;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.amhuman.entity.User;
import com.amhuman.service.IUserService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext-test.xml" })
public class SpringTest {
@Resource
IUserService userService;
public IUserService getUserService() {
return userService;
}
public void setUserService(IUserService userService) {
this.userService = userService;
}
@Test
public void testUser(){
System.out.println(userService.getDefaultUser().getUserName());
System.out.println("================================");
System.out.println(userService.findById(100).getUserName());
System.out.println("================================");
System.out.println(userService.find(new User()).getUserName());
}
}对应的service代码
package com.amhuman.service;
import org.springframework.util.StringUtils;
import com.amhuman.comm.Log;
import com.amhuman.entity.User;
public class UserServiceImpl implements IUserService {
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
/* (non-Javadoc)
* @see com.amhuman.service.IUserService#getDefaultUser()
*/
@Override
public User getDefaultUser(){
System.out.println("###");
User user = new User();
user.setUserId(1001);
if(StringUtils.hasLength(this.userName)){
user.setUserName(this.userName);
}else{
user.setUserName("WUYC-TEST");
}
return user;
}
@Override
@Log(id = 0,fieldName="userId")
public User find(User user) {
if(user == null){
return getDefaultUser();
}
user.setUserName("WUTIANYU");
return user;
}
@Override
@Log(id = 0)
public User findById(Integer id) {
if(id == null){
return getDefaultUser();
}
User user = new User();
user.setUserId(id);
user.setUserName("UserName["+id+"]");
return user;
}
}搞定!
相关推荐
yupi0 2020-10-10
spring 2020-08-18
编程点滴 2020-07-29
幸运小侯子 2020-07-05
itjavashuai 2020-07-04
qingjiuquan 2020-06-29
shushan 2020-06-25
小鱿鱼 2020-06-22
咻pur慢 2020-06-18
melonjj 2020-06-17
qingjiuquan 2020-06-13
neweastsun 2020-06-05
小鱿鱼 2020-06-05
mxcsdn 2020-05-31
吾日五省我身 2020-05-27
牧场SZShepherd 2020-05-27
sweetgirl0 2020-05-14