0

私は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>
4

1 に答える 1

0

注釈または 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 ファイルにある必要はありません。既に行った方法で component-scan を使用してインスタンス化できます。

.4. CacheService または NoCacheService を注入するには、2 つのインスタンスがあるため、どちらを Controller に注入するかを指定する必要があります。これは次の方法で行うことができます。

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

    @Autowired @Qualifier("cache") //or noCache
    Service service;
    ...
}
于 2012-10-20T00:08:42.153 に答える