spring aop 應用實例

一、先自定義註解:

       @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 >


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章