Spring4.2.4 使用XML配置方式实现AOP切入时出现错误:error at ::0 formal unbound in pointcut
测试代码如下:
public interface IUserService {
public void login(String name, String pwd);
public void setAdministratorUserName(String name);
}
public interface IStockService {
public long getStockLevel(String level);
public void applyDiscounts(Date date, BigDecimal bigDecimal);
}
public class DefaultUserService implements IUserService {
private String administratorUserName;
public DefaultUserService() {
}
public void login() {
}
public void login(String name) {
SecurityContext.setUserName(name);
}
public void login(String name, String pwd) {
SecurityContext.setUserName(name);
}
public String getAdministratorUserName() {
return this.administratorUserName;
}
public void setAdministratorUserName(String name) {
this.administratorUserName = name;
}
}
public class DefaultStockService implements IStockService {
public long getStockLevel(String level) {
try {
if(level == null) {
throw new IOException("stock level not null");
}
} catch (IOException e) {
e.printStackTrace();
}
return 1;
}
public void applyDiscounts(Date date, BigDecimal bigDecimal) {
System.out.println(date + " >> " + bigDecimal.byteValue());
}
}
public class SecurityContext {
private static SecurityContextHolder holder = new SecurityContextHolder();
public static String getUserName() {
return holder.getUserName();
}
public static void setUserName(String userName) {
holder.setUserName(userName);
}
private static class SecurityContextHolder {
private ThreadLocal<String> currentUser = new ThreadLocal<String>();
public String getUserName() {
return currentUser.get();
}
public void setUserName(String userName) {
currentUser.set(userName);
}
}
}
public class AspectBean {
public void logCall(Joinpoint joinpoint) {
System.out.println("--------------------");
System.out.println(joinpoint);
}
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/ch6/aspectBean.xml");
IUserService userService = (DefaultUserService) ctx.getBean("userService");
IStockService stockServic = (DefaultStockService) ctx.getBean("stockService");
userService.login("admin", "****");
stockServic.getStockLevel("a");
}
}
<?xml version="1.0" encoding="UTF-8"?> <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" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id="userService" class="com.ycx.ch6.section3.service.DefaultUserService"/> <bean id="stockService" class="com.ycx.ch6.section3.service.DefaultStockService"/> <bean id="aspectBean" class="com.ycx.ch6.section3.AspectBean"/> <aop:config proxy-target-class="true"> <aop:pointcut id="serviceCall" expression="execution(* com.ycx.ch6.section3.service.*Service.*(..))"/> <!-- <aop:pointcut id="serviceCall" expression="execution(* com.ycx.ch6.section3.*Service.*.*(..))"/> --> <!-- <aop:pointcut id="serviceCall" expression="execution(void com.ycx.ch6.section3.*Service.*.*(..))"/> --> <aop:aspect id="firstAspect" ref="aspectBean"> <aop:before method="logCall" pointcut-ref="serviceCall"/> </aop:aspect> </aop:config> </beans>
错误日志:
警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' defined in class path resource [conf/ch6/aspectBean.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJPointcutAdvisor]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' defined in class path resource [conf/ch6/aspectBean.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJPointcutAdvisor]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:478)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.ycx.ch6.section3.AspectBean.main(AspectBean.java:25)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJPointcutAdvisor]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:275)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:92)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:101)
at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:103)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:248)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:988)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:959)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:472)
... 10 more
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJPointcutAdvisor]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:122)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:267)
... 25 more
Caused by: java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:193)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.getMethodMatcher(AspectJExpressionPointcut.java:176)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.buildSafePointcut(AbstractAspectJAdvice.java:187)
at org.springframework.aop.aspectj.AspectJPointcutAdvisor.<init>(AspectJPointcutAdvisor.java:51)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
注:经过debug Spring使用annotation注解时使用的是aopalliance.jar中的Joinpoint接口声明
org.aopalliance.intercept.Joinpoint;
而xml配置时是用的aspectjrt.jar中的Joinpoint接口声明
org.aspectj.lang.JoinPoint;
修改后的代码:
public class AspectBean {
// import org.aopalliance.intercept.Joinpoint; // wrong interface import
import org.aspectj.lang.JoinPoint // right interface import
public void logCall(org.aspectj.lang.JoinPoint joinpoint) {
System.out.println("--------------------");
System.out.println(joinpoint);
}
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/ch6/aspectBean.xml");
IUserService userService = (DefaultUserService) ctx.getBean("userService");
IStockService stockServic = (DefaultStockService) ctx.getBean("stockService");
userService.login("admin", "****");
stockServic.getStockLevel("a");
}
}