Spring 通过注解方式实现AOP切面编程

        Spring 切面编程的目的是实现代码的业务逻辑的解耦。切面编程用于诸如日志记录,事务处理,等非业务性的逻辑操作。目前Spring的Aop只能应用于方法层级上,无法在类、成员字段等层级上操作。以下是Srping的Aop编程分为注解方式和xml配置方式。以下过程详细说明了通过注解方式实现AOP编程的过程。
  • 第一步:自定义注解

/**
 * 定义自定义管理员注解
 *
 */
public @interface RoleAdmin { }

  • 第二步:编写AOP切面类

/*声明为组件,让spring 自动管理*/
@Component
/*声明该类为切面bean*/
@Aspect
public class RequestInterceptor { 
        private final Logger logger = LoggerFactory.getLogger(RequestInterceptor.class); 

        /* 定义切点,这里不需要实现方法,拦截管理员访问的请求*/
        @Pointcut("@annotation(com.frame.annotation.RoleAdmin)")
        public void adminRequired() {}

        /*定义前置advice*/
        @Before("adminRequired()")
        public void adminCommon(JoinPoint point) {        
              HttpServletRequest request = getRequest();
        LoginUser user = (LoginUser) request.getSession().getAttribute(Constants.SESSION_USER_KEY);
        if ( user == null ) {
            setForward(request);
            throw new NoAdminException();
            //throw new NotLoginException();
        }
        if  ( user.getMemberType() != Constants.MEMBER_TYPE_ADMIN ) {
            throw new NoAdminException();
            //throw new NoAuthException();
        }
        String mac = (String)request.getSession().getAttribute(AdminUtil.ADMIN_MAC_ATTR_NAME);
        if(UtilString.isEmpty(mac)){
            throw new NoAdminException();
        }
        }
      
        private void setForward(HttpServletRequest request) {
               if ( "get".equalsIgnoreCase(request.getMethod()) ) {
                   String fw = request.getRequestURI().substring(request.getContextPath().length()+1);
                   String qs = request.getQueryString();
                   if ( ! UtilString.isEmpty(qs) ) {
                       fw += "?" + qs;
                   }

                   logger.debug("After login will forward to : {}", fw);
                   request.getSession().setAttribute(Constants.URL_FORWARD_KEY, fw);
                }
         } 

         /** * 在切面中获取http请求 * @return */ 
        private HttpServletRequest getRequest() { 
            return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); 
        }
}
 
 

  • 第三步:在application.xml中配置aop代理

               需要在application.xml中添加AOP代理。AOP代理分为JDK代理和cglib代理

               如果配置proxy-target-class="true",则表示是cglib代理。如下:

	<!-- 激活自动代理功能 -->
       <aop:aspectj-autoproxy proxy-target-class="true"/>

               如果采用JDK代理,则配置如下:

       <aop:aspectj-autoproxy/>

  •  第四步: 定义切面的引入点

        /*在需要切面的方法上定义JoinCut点*/
        @RoleAdmin
        @ResponseBody
        @RequestMapping(value="admin/activity/updateComment")
        public boolean updateCommentIsDelete(HttpServletRequest request,CommentPlan commentPlan){
            return false;
        }

你可能感兴趣的:(spring,AOP,BEFORE,interface,Aspect)