Spring错误创建名为'org.springframework.aop.config.internalAutoProxyCreator

时间:2017-05-27 03:56:54

标签: java spring aop spring-aop

我正在尝试为Spring AOP执行一个简单的程序。它的代码如下 - :BusinessService .java

package com.kruders.spring.aop;

public interface BusinessService {
    void doSomeThing();
}

BusinessImpl.java

package com.kruders.spring.aop;

import org.springframework.stereotype.Service;

public class BusinessImpl implements BusinessService {
    public void doSomeThing() {
        System.out.println("Do Something Here");
    }
}

BusinessAspect.java

package com.kruders.spring.aspect;

import org.aspectj.lang.ProceedingJoinPoint;

public class BusinessAspect {
    public void before() {
        System.out.println("Before method is called");
    }

    public void after() {
        System.out.println("After method is called");
    }

    public void afterReturning() {
        System.out.println("After returning method is called");
    }

    public void afterThrowing() {
        System.out.println("After throwing method is called");
    }

    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Around method is called");
        System.out.println("Around before is running");
        joinPoint.proceed(); 
        System.out.println("Around after is running");  
    }
}

Main.java

package com.kruders.spring.core;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.kruders.spring.aop.BusinessService;

public class Main {
    public static void main(String args[]) {
        ApplicationContext appContext = new ClassPathXmlApplicationContext("Spring-Business.xml");
        BusinessService businessService = (BusinessService)appContext.getBean("businessService");
        businessService.doSomeThing();
    }
}

弹簧Business.xml

<?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: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.xsd
                        http://www.springframework.org/schema/aop 
                        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <bean id="businessService" class="com.kruders.spring.aop.BusinessImpl" />
    <!-- Aspect -->
    <bean id="businessAspect" class="com.kruders.spring.aspect.BusinessAspect" />

    <aop:config>
        <aop:aspect ref="businessAspect">
            <aop:pointcut id="businessExp"
                          expression="execution(* com.kruders.spring.aop.BusinessImpl*.*(..))" />
            <aop:before
                    method="before"
                    pointcut-ref="businessExp"/>
            <aop:after
                    method="after"
                    pointcut-ref="businessExp"/>
            <aop:after-returning
                    method="afterReturning"
                    pointcut-ref="businessExp"/>
            <aop:after-throwing
                    method="afterThrowing"
                    pointcut-ref="businessExp"/>
            <aop:around
                    method="around"
                    pointcut-ref="businessExp"/>
       </aop:aspect>
    </aop:config>
</beans>

我已经包含了所有的AOP罐子并使用了spring-4.3.6

Spring Aop Jars-:

aspectj-1.6.9,aspectj-DEVELOPMENT-20160512153500,aspectjrt,aspectj-weaver,spring-aop jars 

但仍然出错。

INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@621be5d1: startup date [Sat May 27 08:59:02 IST 2017]; root of context hierarchy
May 27, 2017 8:59:02 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [Spring-Business.xml]
May 27, 2017 8:59:02 AM org.springframework.aop.framework.DefaultAopProxyFactory <clinit>
INFO: CGLIB2 not available: proxyTargetClass feature disabled
May 27, 2017 8:59:02 AM org.springframework.context.support.ClassPathXmlApplicationContext refresh
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Initialization of bean failed; nested exception is java.lang.AbstractMethodError: org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors()Ljava/util/List;
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Initialization of bean failed; nested exception is java.lang.AbstractMethodError: org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors()Ljava/util/List;
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    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.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:223)
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:702)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:527)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.kruders.spring.core.Main.main(Main.java:10)
Caused by: java.lang.AbstractMethodError: org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors()Ljava/util/List;
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.setBeanFactory(AbstractAdvisorAutoProxyCreator.java:57)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1647)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1615)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    ... 11 more

2 个答案:

答案 0 :(得分:1)

看起来这是一个类路径问题。正如here所述,aspectjspring-aop罐之间存在一些冲突。

已将您的项目移植到maven项目,下面是pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>springaop</groupId>
    <artifactId>springaop</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <resources>
            <resource>
                <directory>src</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>


    </dependencies>
</project>

同样在Main class中,

ApplicationContext appContext = new ClassPathXmlApplicationContext("Spring-Business.xml");

发出警告说appContext未关闭。 appContext是执行一些I / O操作的ResourceLoader,在执行I / O操作后释放资源至关重要。因此,已将其更改为ClassPathXmlApplicationContext,其中.close()方法最终释放资源,您可以更精确地在finally块中执行此操作。

总之,主要方法如下:

ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
                "Spring-Business.xml");
        BusinessService businessService = (BusinessService) appContext.getBean("businessService");
        businessService.doSomeThing();
        appContext.close();

希望这有帮助!祝你好运!

答案 1 :(得分:-1)

aopaplliance-alpha1.jar不包含Advice类,因此为了能够使用它,您必须单独下载aopalliance-1.0.jar文件并将其添加到依赖项中。

包含该文件的一个链接是here