我整了一个下午了,,就只有输出 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;
}}
其它均不输出,, 不知道什么回事切入点指示符
切入点表达式
通知类型这些东西我已经试过很多种了, 都是没用.
就是想统计 系统各模块的访问次数.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;
}}
还是只能靠自己..把搜索引擎搜烂了也没用.
终于自己解决了.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>
问题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>
采用spring AOP 的注解方式解决日志问题 http://www.phome.asia/forum/thread/23041.html