3

I have the following controller defined:

@Controller
@RequestMapping("/test")
public class MyController extends AbstractController
{

    @Autowired
    public MyController(@Qualifier("anotherController") AnotherController anotherController))
    {
     ...
    }

}

I'm wondering if it's possible to use variables in the @Qualifier annotation, so that I can inject different controllers for different .properties files, e.g.:

@Controller
@RequestMapping("/test")
public class MyController extends AbstractController
{

    @Autowired
    public MyController(@Qualifier("${awesomeController}") AnotherController anotherController))
    {
     ...
    }

}

Whenever I try I get:

org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No matching bean of type [com.example.MyController] found for dependency: 
expected at least 1 bean which qualifies as autowire candidate for this 
dependency. Dependency annotations: 
{@org.springframework.beans.factory.annotation.Qualifier(value=${awesomeController})

I've included the following bean in my config.xml file:

<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:config/application.properties</value>
        </list>
    </property>
</bean>

But the bean doesn't work unless I declare the bean explicitly in the xml file.

How do I do this with annotations??

4

2 に答える 2

2

まず、依存性注入を構成プロパティに依存させるのは悪い習慣だと思います。あなたはおそらくこれをしようとして間違った方向に進んでいます。

ただし、質問に答えるには、placeHolder プロパティにアクセスするには、依存関係の挿入を完了する必要があります。それを確認するには、プロパティにアクセスするコードを@PostContruct注釈付きメソッド内に配置します。

getBean()メソッドを使用して、applicationContext から手動で Bean を取得する必要があります。

@Value("${awesomeController}")
private String myControllerName;

@PostConstruct
public void init(){
   AnotherController myController = (AnotherController) appContext.getBean(myControllerName);
}
于 2013-04-04T13:41:22.180 に答える
1

あなたがしていることが可能かどうかはわかりませんが、Spring 3.1+ を使用している場合に限り、少し異なるアプローチを提案できます。Spring プロファイルを使用してみることができます。

プロファイルごとに 1 つずつ、必要なさまざまなコントローラーを定義します。

<beans>
    <!-- Common bean definitions etc... -->

    <beans profile="a">
        <bean id="anotherController" class="...AnotherController" />
    </beans>

    <beans profile="b">
        <!-- Some other class/config here... -->
        <bean id="anotherController" class="...AnotherController"/>
    </beans>
</beans>

Controller が失われ、次の@Qualifierようになります。

@Autowired
public MyController(AnotherController anotherController) {
    ...
}

次に、実行時に、システム プロパティを使用して対応するプロファイルをアクティブ化することにより、使用するコントローラー Bean を指定できます。

-Dspring.profiles.active="a"

また:

-Dspring.profiles.active="b"

プロパティ ファイルに基づいてプロファイルを設定することは可能かもしれませんが、Spring ブログのこの投稿から Spring プロファイルの詳細を確認できます。それが多少役立つことを願っています。

于 2013-04-04T14:17:53.950 に答える