3

我定义了以下控制器:

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

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

}

我想知道是否可以在 @Qualifier 注释中使用变量,以便我可以为不同的 .properties 文件注入不同的控制器,例如:

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

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

}

每当我尝试时,我都会得到:

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})

我在 config.xml 文件中包含了以下 bean:

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

但是除非我在 xml 文件中明确声明 bean,否则 bean 不起作用。

我如何使用注释来做到这一点?

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 Profiles。

定义您想要的不同控制器,每个配置文件一个:

<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>

您的控制器将丢失@Qualifier并变为:

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

然后在运行时,您可以通过使用系统属性激活相应的配置文件来指定要使用的控制器 bean,例如:

-Dspring.profiles.active="a"

或者:

-Dspring.profiles.active="b"

可以根据属性文件设置配置文件,但您可以从Spring 博客上的这篇文章中找到有关 Spring 配置文件的更多信息。我希望这会有所帮助。

于 2013-04-04T14:17:53.950 回答