SpringMVC:注释中的变量

时间:2013-04-04 13:34:48

标签: java spring spring-mvc dependency-injection annotations

我定义了以下控制器:

@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不起作用。

如何使用注释?

2 个答案:

答案 0 :(得分:2)

首先,我认为依赖注入依赖于配置属性是不好的做法。你可能试图这样做的方向错误。

但是要回答你的问题:访问placeHolder属性需要完成依赖注入。为了确保它,您可以将访问该属性的代码放在@PostContruct带注释的方法中。

您需要使用getBean()方法从applicationContext手动检索bean。

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

@PostConstruct
public void init(){
   AnotherController myController = (AnotherController) appContext.getBean(myControllerName);
}

答案 1 :(得分: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博客上找到有关this post的Spring配置文件的更多信息。我希望这有所帮助。