SpringMVCを利用しております。
各コンポーネントの中で、xmlで定義した定数のようなものを利用したいと思い、
application-config.xmlに
xml
1<bean id="processName" class="java.lang.String"> 2 <constructor-arg value="xxxx" /> 3</bean>
このように記述しBeanを定義し、これを各コンポーネント内で
Java
1@Autowired 2private String processName;
このようにフィールドインジェクションを利用しDIをさせようとしたところ、以下エラーが発生し上手くいきませんでした。
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
DIの候補で一致する型が複数(もしくは0?)件の場合に出るエラーだったかと思いますが、他にjava.lang.String型でBean定義をしていないのです。
その後試行錯誤していたところ、
Java
1@Autowired(required=false) 2private String processName;
とすると、期待通りエラーも出ず「processName」に「xxxx」という文字列がDIされていました。
上記required=falseはAutowiredでDIさせるBeanが見つからなかった場合にエラーにしない設定だと思っていたのですが、これはどういう動きでしょうか?
上記の動作から、@Autowiredの動きですが
- 型から一致するBeanを探しDIさせる(required=falseが設定されていない場合ここで見つからなければ例外発生)
- 次に名前で一致するBeanを探しDIさせる
- それでも見つからない場合はnullの状態のままとする(DIさせない)
こういった動きなのでしょうか?
もしそうなのであれば、
@Qualifier("")
@Resource
でもDIさせられるかと思い
Java
1@Qualifier("processName") 2private String processName; 3 4@Resource 5private String processName; 6 7@Resource(name="processName") 8private String processName;
こう試しましたが、これらも例外が発生し上手くDIさせられませんでした。
(xmlでbeanにQualifierで命名する方法が検索したのですがよく分からず・・・)
私の希望するDIとしては、
@Autowired(required=false)
これが最善策なのでしょうか?
上記では駄目でした
質問投稿後も、まさかと思い色々試していたのですが
Java
1@Autowired(required=false) 2private String processName;
これはあくまでも型で一致するBeanを引っ張って来ているだけのようでした。
てっきり変数名と一致するIDのBeanをDIしているのかと思っていました。
なので
Java
1@Autowired(required=false) 2private String processNameaaaaa;
といったふうに変えてもDIされていて、
上記@Autowiredの記述の状態(変数名がprocessNameaaaaa)で
xml
1<bean id="processName" class="java.lang.String"> 2 <constructor-arg value="xxxx" /> 3</bean> 4<bean id="testName" class="java.lang.String"> 5 <constructor-arg value="aaaa" /> 6</bean>
と、String型のbeanを複数定義したところ
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: expected single matching bean but found 2: processName,testName
と例外が発生してしまいました。
そこで改めて以下のようにしたところ希望通りの動きになりました
Java
1@Autowired(required=false) 2@Qualifier("processName") 3private String processNameaaaaa;
xml
1<bean id="processName" class="java.lang.String"> 2 <constructor-arg value="xxxx" /> 3</bean> 4<bean id="testName" class="java.lang.String"> 5 <constructor-arg value="aaaa" /> 6</bean>
上記だと問題なく「processNameaaaaa」には「xxxx」がDIされていました。
そうなってくると色々と理解ができないのですが
@Autowired(required=false)
これを設定した時点で型によるDIは失敗しているのかと思えば、型によるDIをしていたようですし、
併記する形で
@Qualifier("processName")
を記述したらprocessNameというIDのbeanをDIさせていますし、意味が分かりません。。。
なぜ
@Autowired
private String processNameaaaaa;@Qualifier("processName")
private String processNameaaaaa;@Autowired
@Qualifier("processName")
private String processNameaaaaa;
これらではDIさせられないのでしょうか・・・

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。