一、先自定義註解:
@Retention(RetentionPolicy.RUNTIME )
@Target({ ElementType. METHOD })
@Documented
public @interface Anno {
Class name();
}
service 方法上的註解:
/**
* 添加自定義區域的方法
*/
@Override
@Anno(name=CustomRegion. class)
public int saveCustomRegion(CustomRegion region) {
return mapper.insertSelective(region);
}
二、代理類:
@Aspect
public class AopImpl {
private static final Logger LOG = LoggerFactory.getLogger(AopImpl.class);
/**
* 切入點
*/
@Pointcut("@annotation(com.etrip.core.aop.Anno)")
public void addParam() {
}
/**
*
* @param jp
* @param anno
* 註解
* @return
* @throws Throwable
* @author majianguo
* @date 2013- 6- 24 下午1:59:32
* @comment 方法執行前後都執行的參數
*/
@SuppressWarnings("unchecked")
@Around("addParam() && @annotation(anno)")
(ProceedingJoinPoint 只能應用到 Around環繞註解中) 其他可用JoinPoint
public Object getParm(ProceedingJoinPoint jp, Anno anno) throws Throwable {
final JsonMapper mapper = JsonMapper.nonDefaultMapper();
// 獲得參數
final Class clazz = anno.name();
LOG.info( "Class is :{}", clazz);
// 獲得參數
final Object[] parames = jp.getArgs();
Validate. notNull(parames);
// 獲得參數的map
final Map<String, Object> parMap = parseParames(parames);
parMap.put( "ip", ShiroSecurity. getCurrentIp());
parMap.put( "createDate", Dates. getDateTime());
parMap.put( "createUser", ShiroSecurity.getCurrentUserId());
final Object[] objs = { mapper.fromJson(mapper.toJson(parMap), clazz) };
return jp.proceed(objs);
}
/**
* 解析方法參數
*
* @param parames
* 方法參數
* @return 解析後的方法參數
*/
private Map<String, Object> parseParames(Object[] parames) {
final JsonMapper mapper = JsonMapper.nonDefaultMapper();
final JavaType type = mapper.createCollectionType(HashMap.class , String.class, Object.class);
LOG.info( "parames[0] : {}", parames[0]);
return mapper.fromJson(mapper.toJson(parames[0]), type);
}
}
三、 applicationContext.xml
<bean id= "aopImpl" class="com.etrip.core.aop.AopImpl" ></bean>
<!-- 定義aspectj -->
<aop:aspectj-autoproxy proxy-target-class= "true">
<aop:include name= "aopImpl" />
</aop:aspectj-autoproxy >