2017-01-16 14 views
1

私は、@Serviceアノテーションを持つTestClassクラスからなるapp_testというアプリを持っています。私はid = '' TestClass 'のXMLファイルにbeanを持つライブラリクラス' lib_test 'を持っています。どちらも別のパッケージになっています。同じクラス名を持つ2つのbeanを注入する

それらは異なるパッケージにあるので

Import com.app.TestClass 

    Class TestController 
    { 
    Private final TestClass testClass; 

    @Inject 
    TestController (TestClass testClass) 
    { 
     This.testClass =testClass; 
    } 
    } 

それは型によって注入する必要があり、以下のようにIは@Service Beanを注入mです。しかし、コントローラーは資格のあるBeanを見つけられません。

@Qualifierを与え、@Serviceに名前を付けることで解決できます。しかし、それは必要ですか?両方とも異なるパッケージに入っているので、タイプごとにautowireする必要がありますか?いくつかのコンセプトが欠けていますか?

+0

可能な複製:http://stackoverflow.com/questions/3925681/spring-autowired-with-2-beans-of-the-same-type – pringi

+1

いいえ同じパッケージと異なる名前のものです。 Mは別のパッケージと同じ名前について話しています。 –

答えて

1

彼らは同じ型スプリングのであれば、彼らは別のパッケージに含まれているが、私は@Primaryで任意のサービスクラスをマーキングすることをお勧めしたいどの

を使用することを知りません。

package com.app.TestClass 
@Primary 
@Repository 
public class TestClass implements XXX 

この方法では、デフォルトのautowire候補として選択され、他のbeanのautowire-candidateは必要ありません。

また、@Autowired @Qualifierを使用するのではなく、@Resourceを使用して特定の豆を選ぶのがより洗練されています。

+2

彼らは同じタイプではありません。メソッドとすべてが違うだけで、Beanの名前は同じです。そして、それは重複を与えていないので、それは見つからない。 –

1

私はこれを常にSpringの標準Bean命名規則の奇妙な制限として見出しています。同じ名前のクラスがある場合、大きなプロジェクトに重複する名前にクラスのパッケージ部分は含まれません。私はいつも違うBeanNameGeneratorで春のプロジェクトを設定する理由

これは、次のとおりです。

public class CustomAnnotationConfigWebApplicationContext extends AnnotationConfigWebApplicationContext { 
    private BeanNameGenerator qualifiedAnnotationBeanNameGenerator = new QualifiedNameAnnotationBeanNameGenerator(); 

    @Override 
    protected BeanNameGenerator getBeanNameGenerator() { 
     return this.qualifiedAnnotationBeanNameGenerator; 
    } 
} 

と発電機:この設定で

public class QualifiedNameAnnotationBeanNameGenerator extends AnnotationBeanNameGenerator { 

    @Override 
    protected String buildDefaultBeanName(BeanDefinition definition) { 
     String qualifiedName = definition.getBeanClassName(); 
     return Introspector.decapitalize(qualifiedName); 
    } 
} 

、異なるパッケージに含まれている一般的なクラス名が自動的に認識されています異なるものとして正しいものが注入される。

関連する問題