上下文:annotation-config是@AutoWired的替代品吗?

时间:2010-06-06 17:02:21

标签: java spring annotations autowired

我可以将context:annotation-config放入我的XML配置中是否正确,它会自动注入bean类而不需要任何注释?

所以不要使用这些注释类型:

public class Mailman
{
    private String name;

    @Autowired
    private Parcel Parcel;

    public Mailman(String name)
    {
        this.name = name;
    }

    @Autowired
    public void setParcel(Parcel Parcel)
    {
        this.Parcel = Parcel;
    }

    @Autowired
    public void directionsToParcel(Parcel Parcel)
    {
        this.Parcel = Parcel;
    }

}

我只需要写下这个:

<beans ... >
<bean id="mailMan" class="MailMan">
 <constructor-arg value="John Doe"/>
</bean>
<bean id="parcel" class="Parcel" />
<context:annotation-config />
</beans>

然后我的MailMan类看起来会更简单,而不需要注释:

public class Mailman
{
    private String name;

    private Parcel Parcel;

    public Mailman(String name)
    {
        this.name = name;
    }    
}

3 个答案:

答案 0 :(得分:6)

默认情况下,Spring上下文不会关注@Autowired注释。为了处理它们,上下文需要在上下文中注册AutowiredAnnotationBeanPostProcessor bean。

<context:annotation-config/>为你注册其中一个(以及其他一些),所以你确实需要它(除非你自己注册AutowiredAnnotationBeanPostProcessor,这是完全有效的。)

如果您不喜欢在代码中使用@Autowired,那么您可以使用<property>在XML中显式地注入属性,这只会将混乱从一个地方移动到另一个地方。

如果您的上下文非常简单,那么您可以使用隐式自动装配,如here所述。从本质上讲,这告诉Spring按属性名称或类型自动自动装配。这需要非常少的配置,但它很快失控 - 它的自动性意味着它很难控制,并且给你很小的灵活性。

@Autowired一般来说是最好的选择。

答案 1 :(得分:1)

<context:annotation-config />只是自动注册Spring提供的所有标准bean后处理器,如PersistenceAnnotationBeanPostProcessorAutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessorRequiredAnnotationBeanPostProcessor,这样你就不会不必在弹簧上下文文件中单独注册它们。您仍然需要在属性/设置器上提供@Autowired注释。

答案 2 :(得分:0)

没有

@Autowired该课程需要注释以及<context:annotation-config/>

使用注释时不需要xml配置部分。

同样来自doc注意<context:annotation-config/>仅查找在其定义的相同应用程序上下文中的bean上的注释。这意味着,如果您为DispatcherServlet放入WebApplicationContext,它只会检查@Autowired控制器中的bean,而不是您的服务。

如果您不需要使用注释,则需要指定xml配置。