我整了一个下午了,,就只有输出  XXXXXXXXXXXXX=====>test anyPublicMethod()
其它均不输出,,  不知道什么回事切入点指示符
切入点表达式
通知类型这些东西我已经试过很多种了, 都是没用.
就是想统计 系统各模块的访问次数.applicationContext.xml:<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:aop="http://www.springframework.org/schema/aop" 
       xmlns:tx="http://www.springframework.org/schema/tx" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
       http://www.springframework.org/schema/aop 
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
  <!-- 配置AOP通知代理 -->
  <aop:aspectj-autoproxy />
  <bean id="itsAspect" class="com.supcon.electronic.its.common.AccessCountAspect">
    <property name="operationService"  ref="operationService" />
    <property name="order" value="10"/>  
  </bean>
JAVA:/* SUPCON Confidential */
package com.supcon.electronic.its.common;import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
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.annotation.Pointcut;
import org.springframework.core.Ordered;import com.supcon.electronic.its.service.OperationService;//*****************************************************************************
/**
 * AOP Service for user access count<br>
 *
 * @author Xujin.Jiao
 * @version Version 1.0
 */
//更新履历
//2009-08-17:创建
//*****************************************************************************@Aspect
public class AccessCountAspect implements Ordered { /**
 * AOP通知代理执行顺序默认值
 */
    private int order = 1;    /** 
     * 申明OperationService接口变量 
     */
    private OperationService operationService;    /** 
     * 获取Log4j实例 
     */
    protected Logger log = Logger.getLogger(AccessCountAspect.class.getName()); /**
 * @return the order
 */
public int getOrder() {
return order;
} /**
 * @param order the order to set
 */
public void setOrder(int order) {
this.order = order;
} /**
 * @return the operationService
 */
public OperationService getOperationService() {
return operationService;
} /**
 * @param operationService the operationService to set
 */
public void setOperationService(OperationService operationService) {
this.operationService = operationService;
} /**
 *  切点, 匹配任何有@RequestMapping()注解的方法
 */
@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
public void anyRequestMappingMethod() { } /**
 *  切点, 匹配任何位于com.supcon.electronic.its.controller包及其子包下的方法
 */
    @Pointcut("execution(* com.supcon.electronic.its.controller.*.*(..))")
public void anyControllerMethod() { } /**
 *  切点, 匹配任何public的方法
 */
@Pointcut("execution(public * *(..))")
public void anyPublicMethod() { } /**
 *  切点, 综合以上切点
 */
@Pointcut("anyControllerMethod() && anyPublicMethod() && anyRequestMappingMethod()")
public void anyInteractionMethod() { } @Before("anyPublicMethod()")
    public void test1(JoinPoint pjp) {
log.debug("XXXXXXXXXXXXX=====>test anyPublicMethod() ");
} @After("anyControllerMethod()")
    public void test2(JoinPoint pjp) {
log.debug("XXXXXXXXXXXXX=====>test anyControllerMethod() ");
} @After("anyRequestMappingMethod()")
    public void test3(JoinPoint pjp) {
log.debug("XXXXXXXXXXXXX=====>test anyRequestMappingMethod() ");
} // 前置通知
@Before("anyInteractionMethod()")
    public void updateAccessCount(JoinPoint pjp) {
        //java.lang.Object[] getArgs():获取连接点方法运行时的入参列表
        //Signature getSignature() :获取连接点的方法签名对象
        //java.lang.Object getTarget() :获取连接点所在的目标对象
        //java.lang.Object getThis() :获取代理对象本身
log.debug("XXXXXXXXXXXXX=====>getArgs() " + pjp.getArgs());
log.debug("XXXXXXXXXXXXX=====>getSignature() " + pjp.getSignature());
log.debug("XXXXXXXXXXXXX=====>getTarget() " + pjp.getTarget());
log.debug("XXXXXXXXXXXXX=====>getThis() " + pjp.getThis()); log.debug("XXXXXXXXXXXXX=====>pjp.toLongString() " + pjp.toLongString());
log.debug("XXXXXXXXXXXXX=====>pjp.getTarget().getClass().getName() " + pjp.getTarget().getClass().getName());
// 取得controller名称, 查询匹配模块名称, 向访问次数统计表更新访问次数字段 + 1
    } // 环绕通知
    @Around("anyInteractionMethod()")
    public Object aroundLogCalls(ProceedingJoinPoint joinPoint) throws Throwable {
     log.debug("before invoke method:" + joinPoint.getSignature().getName());
        Object object = joinPoint.proceed();
        log.debug("after invoke method:" + joinPoint.getSignature().getName());
        return object;
    }}

解决方案 »

  1.   

    没人回~!
    还是只能靠自己..把搜索引擎搜烂了也没用.
    终于自己解决了.JAVA没写错, 即使 
    切入点指示符 
    切入点表达式 
    通知类型 
    这些东西 我有写错,,那调了几个小时后,,谁都能搞对.关键的原因还是在配置上.我将这段配置在文件   applicationContext.xml 中  <!-- 配置AOP通知代理 -->
      <aop:aspectj-autoproxy />
      <bean id="itsAspect" class="com.supcon.electronic.its.common.AccessCountAspect">
        <property name="operationService"  ref="operationService" />
        <property name="order" value="10"/>  
      </bean>而我将要匹配的类(即:所有controller 类) 却 配置在另外一个文件中:springmvc-servlet.xml中
    所以 以上代码 测试只出 XXXXXXXXXXXXX=====>test anyPublicMethod() 
    因为我想要匹配的controller类,没在applicationContext.xml 中定义所以将上段代码 移到 
    springmvc-servlet.xml 中, 即能解决主要问题.如下: 注意XML头
    <?xml version="1.0" encoding="GBK"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:p="http://www.springframework.org/schema/p" 
           xmlns:aop="http://www.springframework.org/schema/aop" 
           xmlns:context="http://www.springframework.org/schema/context" 
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">  <!-- 配置AOP通知代理 -->
      <aop:aspectj-autoproxy />  <!-- 定义异常处理VIEW -->
    <!-- 
      <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="/errors/error.jsp"/>
        <property name="exceptionMappings">
          <props>
            <prop key="org.compass.core.CompassException">dataAccessFailure</prop>
            <prop key="org.springframework.dao.DataAccessException">dataAccessFailure</prop>
            <prop key="org.springframework.transaction.TransactionException">dataAccessFailure</prop>
          </props>
        </property>
      </bean>
    -->
      <!-- 文件上传解析器-->
      <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />  <!-- 邮件配置 -->
    <!-- 
      <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="mail.mycompany.com"/>
      </bean>  <bean id="mailMessage" class="org.springframework.mail.SimpleMailMessage">
        <property name="from" value="[email protected]"/>
        <property name="subject" value="Your order"/>
      </bean>  <bean id="orderManager" class="com.mycompany.businessapp.support.OrderManagerImpl">
        <property name="mailSender" ref="mailSender"/>
        <property name="message" ref="mailMessage"/>
      </bean>
    -->
      <!-- Implementation of the HandlerMapping interface that maps handlers based on 
           HTTP paths expressed through the RequestMapping annotation at the type or method level.  -->
      <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="order">
          <value>2</value>
        </property>
      </bean>  <!-- 对controller包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
      <!-- 因为 Spring 所有功能都在 Bean 的基础上演化而来,所以必须事先将 Controller 变成 Bean,
            这是通过在类中标注 @Controller 并在 sample-servlet.xml 中启用组件扫描机制来完成的 
      <context:component-scan base-package="com.supcon.electronic.its.controller"/>
      -->
      <!-- The AnnotationMethodHandlerAdapter is responsible for processing annotated handler methods, 
           as mapped by this DefaultAnnotationHandlerMapping. For RequestMapping at the type level, 
           specific HandlerAdapters such as SimpleControllerHandlerAdapter apply. 
       -->
       <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
      <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />  <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
            p:prefix="/" p:suffix=".jsp"/>  <!-- 配置计划任务 -->
      <bean id="exampleJobTarget" class="com.supcon.electronic.its.cronjob.ExampleJob">
        <property name="userService"  ref="userService" />
      </bean>
      
      <!-- CDT-定时删除过车图片任务 -->
      <bean id="delPicJob" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass">
      <value>com.cdt.cqzhzx.its.cronjob.DelPicJob</value>
        </property>
    <!-- <property name="jobDataAsMap">-->
    <!--   <map>-->
    <!-- <entry key="hashMapService">  -->
    <!--        <ref bean="hashMapService" />  -->
    <!--     </entry>  -->
    <!--   </map>  -->
    <!-- </property>-->
      </bean>  <bean id="exampleJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="exampleJobTarget" />
        <property name="targetMethod" value="main" />
    <!-- 
        <property name="concurrent" value="false" />
    -->
      </bean>  <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="exampleJob" />
        <!-- run every morning at 6 AM -->
        <property name="cronExpression" value="0 44 11 ? * *" />
      </bean>
      
      <!-- CDT-定时删除过车图片任务执行配置 -->
      <bean id="delPicTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
       <property name="jobDetail" ref = "delPicJob" />
       <!-- run every morning at 1 AM -->
        <property name="cronExpression" value="0 00 00 ? * *" />    
      </bean>   <!-- 配置计划任务 -->
      <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
          <list>
            <ref bean="cronTrigger" />
            <ref bean="delPicTrigger" />
          </list>
        </property>
      </bean>  <!-- Controller 配置 -->
      <bean id="baseController" class="com.supcon.electronic.its.controller.BaseController" abstract="true">
        <property name="operationservice" ref="operationService" />
        <property name="encryptservice" ref="encryptService" />
      </bean>  <bean class="com.supcon.electronic.its.controller.LoginController" parent="baseController">
        <property name="userService"  ref="userService" />
        <!-- Added by Xujin.Jiao on 2009-5-13 -->
        <property name="fileUploadService"  ref="fileUploadService" />
      </bean>  <bean class="com.supcon.electronic.its.controller.UserController" parent="baseController">   
        <property name="userService" ref="userService" />
      </bean>  <bean class="com.supcon.electronic.its.controller.MenuController">
        <property name="userService" ref="userService" />
      </bean>  <bean class="com.supcon.electronic.its.controller.UserRoleController" parent="baseController">
        <property name="userRoleService" ref="userRoleService" />
      </bean>
      

  2.   

    此后,又出现两个小问题:都是在TOMCAT启动时抛出的异常
    问题1:Caused by: org.springframework.aop.framework.AopConfigException: 
    Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.解决方法:找到此JAR包,并加入工程中. 
    spring-framework-2.5.5\lib\cglib\cglib-nodep-2.1_3.jar问题2:Error creating bean with name 'cronTrigger' defined in ServletContext resource [/WEB-INF/springmvc-servlet.xml]: 
    Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: 
    Failed to convert property value of type [$Proxy43 implementing java.lang.Cloneable,java.io.Serializable,
    org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to 
    required type [org.quartz.JobDetail] for property 'jobDetail'; nested exception is 
    java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy43 implementing 
    java.lang.Cloneable,java.io.Serializable,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to 
    required type [org.quartz.JobDetail] for property 'jobDetail': 
    no matching editors or conversion strategy found我想可能是这个cglib-nodep-2.1_3.jar包与我的cronjob 计划任务类 有冲突
    因为之前运行的很好解决方法:
    将此BEAN移至cronjob 定义的下方:  <bean id="itsAspect" class="com.supcon.electronic.its.common.AccessCountAspect">
        <property name="operationService" ref="operationService" />
        <property name="order" value="10"/>  
      </bean>
      <!-- 集中控制中取得各种设备实时信息控制类 -->
      <bean class="com.supcon.electronic.its.controller.CCLiveController" parent="baseController">
       <property name="ccliveService" ref="ccliveService"/>
      </bean>  <!-- 部门树 -->
      <!-- 
      <bean class="com.cdt.cqzhzx.its.controller.DepTreeController" parent="baseController">
       <property name="depService" ref="departmentService"/>
      </bean>  
     -->  <!-- 系统管理模块数据更新 -->
      <bean class="com.supcon.electronic.its.controller.DataUpdateController" parent="baseController">
       <property name="dataUpdateService" ref="dataUpdateService"/>
      </bean>  <!-- 地理信息通用查询控制类 -->
      <bean class="com.supcon.electronic.its.controller.GisGeneralController" parent="baseController">
       <property name="gisService" ref="gisService"/>
      </bean>
      
      
      <bean id="itsAspect" class="com.supcon.electronic.its.common.AccessCountAspect">
        <property name="operationService" ref="operationService" />
        <property name="order" value="10"/>  
      </bean>
    </beans>
      

  3.   

    见过相似的内容在这里,已经解决了:使用Spring aop的注解实现问题 http://www.phome.asia/forum/thread/23049.html

     采用spring AOP 的注解方式解决日志问题 http://www.phome.asia/forum/thread/23041.html