新搞了一个单点登陆的项目,用的cas,要把源码的cas-webapp改形成适合咱们业务场景的项目,因而新加了一些spring的配置文件。php
可是在项目启动时报错了,错误日志以下:java
一月 08, 2016 11:01:34 下午 org.apache.catalina.core.StandardContext filterStart 严重: Exception starting filter springSecurityFilterChain org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'functionServiceImpl': Bean with name 'functionServiceImpl' has been injected into other beans [platformServiceImpl] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:548) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) at org.jasig.cas.web.init.SafeContextLoaderListener.contextInitialized(SafeContextLoaderListener.java:75) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5003) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5517) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)
去stackoverflow上面搜,说是spring循环依赖致使的。可是问了组里一个技术牛,说若是是出现spring循环依赖,在启动项目的时候是不会报错的,spring的循环依赖在运行的时候才会报错。web
循环依赖也可能出如今maven里,若是maven配置中出现了循环依赖,编译的时候就会报错。spring
那么,到底是什么缘由,我如今还不知道。apache
在个人web.xml文件中,引入了两次spring的applicationContext.xml文件。app
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring-configuration/*.xml /WEB-INF/deployerConfigContext.xml classpath:spring/applicationContext.xml </param-value> </context-param>
当我去掉我本身的spring配置时,项目启动就不报错了。webapp
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring-configuration/*.xml /WEB-INF/deployerConfigContext.xml </param-value> </context-param>
那是否是由于加载了两个applicationContext.xml,就至关于初始化了两个spring容器,有的单例类只容许存在一个实例,可是却出现了两个容器的bean,因此报错了呢?maven
具体问题待排查。ide
问题缘由查到了:spa
因为刚开始配置spring的时候加载了2遍applicationContext.xml,其中有一个动态代理切面的配置在两个配置文件中都存在重复了。详情见:
http://www.cnphp6.com/archives/22031
其实,仍是由于bean加载重复了。