【问题标题】:Spring 3 MVC BeanCreationException - Class is an interfaceSpring 3 MVC BeanCreationException - 类是一个接口
【发布时间】:2012-10-19 23:57:58
【问题描述】:

我对 Spring 比较陌生,甚至对注解和自动装配也比较陌生。我不知道如何连接我的豆子。这个想法是通过更改 application-config.xml 在 CacheService 和 NoCacheService 之间切换,但我无法克服异常。

例外

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Service' defined in ServletContext resource [/WEB-INF/application-config.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [webapp.Services]: Specified class is an interface
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:997)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:943)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:848)
<snip>

类:

package webapp;
interface Service {
    List<String> get();
}

@Service("cache")
CacheService implements Service {
    //from cache then from IO bound source
    @Autowired
    public CacheService(int v1, int v2)
    ...
}

@Service("nocache")
NoCacheService implements Service {
    //from IO bound source
    ....
}

控制器:

@RequestMapping("/")
@Controller
public class ServiceController {

    @Autowired
    Service service;
    ...
}

应用程序配置 xml:

<mvc:annotation-driven />
<context:component-scan base-package="webapp"/>

<beans:bean id="Service" class="webapp.Service">
    <beans:property name="cache" ref="cache" />
</beans:bean>


<beans:bean id="cache" class="webapp.CacheService">
    <beans:constructor-arg index="0" value="50"/> <!-- v1 -->
    <beans:constructor-arg index="1" value="100"/> <!-- v2 -->
</beans:bean>

<beans:bean id="nocache" class="webapp.NoCacheService">
</beans:bean>

【问题讨论】:

    标签: spring spring-mvc dependency-injection autowired


    【解决方案1】:

    您可以选择使用注释或 xml 来连接事物,在这种特定情况下,有两种方式配置的 bean,这将导致您看到的问题。让我试着列举一些变化:

    .1。删除<beans:bean id="Service" class="webapp.Service"> <beans:property name="cache" ref="cache" /> </beans:bean>,因为您的webapp.Service 是一个接口,也是您出现错误消息的原因。

    .2。通过配置实例化CacheService会更好,所以去掉@Service注解,只保留这个:

    <beans:bean id="cache" class="webapp.CacheService">
        <beans:constructor-arg index="0" value="50"/> <!-- v1 -->
        <beans:constructor-arg index="1" value="100"/> <!-- v2 -->
    </beans:bean>
    

    .3。 NoCacheService 不需要在 xml 文件中,它可以像您已经完成的方式使用组件扫描来实例化。

    .4。现在要注入 CacheService 或 NoCacheService,因为有两个实例,您必须指出将哪一个注入到 Controller 中,您可以这样做:

    @RequestMapping("/")
    @Controller
    public class ServiceController {
    
        @Autowired @Qualifier("cache") //or noCache
        Service service;
        ...
    }
    

    【讨论】:

    • 如何在不修改控制器的情况下在“cache”和“noCache”之间切换?在application-config xml中不能这样做吗?
    • 你可以,但是@Controller会被组件扫描自动创建,如果你想你可以删除组件扫描行并在xml中做所有事情,那么你可以像正常一样创建控制器豆:`
    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多