为什么当我访问一个 bean 时 @autowired 不工作

why @autowired is not working when I access a bean

当我像这样使用 BeanFactory 从 spring bean 配置文件访问 bean 时:

public class Person {
    private String id,address;
    @Autowired
    private Customer customer;
     //setters & getters
    }

和bean配置文件

<bean name="person" class="com.ram.spring.model.Person"></bean>
<bean class="com.ram.spring.model.Customer">
    <property name="email" value="ram@adp.com"></property>
    <property name="name" value="Ram"></property>
</bean>

这里是执行者class

public class PersonExecutor {

    public static void main(String[] args) {
        BeanFactory context = new XmlBeanFactory(new ClassPathResource("Spring.xml"));
        Person person = (Person)context.getBean("person");
        System.out.println(person.getCustomer());
    }

}

当我执行这个时,我得到了 null。注释不支持 BeanFactory 吗??有什么想法吗??

您必须使用 AnnotationConfigApplicationContext 或 您必须添加到 Spring.xml 才能激活注释扫描。

正如@jens 所建议的那样

你应该主动annotation scan

<context:component-scan base-package="package_path">
</context:component-scan>
<context:annotation-config />

希望有所帮助

方法 1: 在您的 xml

中包含以下代码
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"

    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config />

    <!-- Remaining bean declaration -->
</beans>

方法 2: 删除 @Autowired 并仅在 xml 文件中注入客户。

<bean name="person" class="com.ram.spring.model.Person">
    <property name="customer" ref="customer"></property>
</bean>
<bean name="customer" class="com.ram.spring.model.Customer">
    <property name="email" value="ram@adp.com"></property>
    <property name="name" value="Ram"></property>
</bean>

为什么不起作用?

在 XML 上下文中使用 Spring 时,默认情况下不会激活使用注释。这意味着 @Autowired@Transactional@PostConstruct 和您将使用的任何其他注释都不会被利用。

我该如何解决?

要使 Spring 知道注释,您需要添加以下行:

<context:annotation-config />

因此,Spring 将在它创建的 bean 中搜索注释并相应地处理它们。

这需要激活 context 命名空间。在您的上下文顶部,确保您拥有所有 context 相关链接和参数1:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config />

    <!-- Your context -->
</beans>

不需要你的情况<context:component-scan />。如果您使用完整注释上下文(例如 类 注释为 @Component),这将很有用。查看 <context:annotation-config /><context:component-scan /> in this answer.

之间的区别

替代解决方案

, you could also drop @Autowired completely and inject all dependencies in XML. See 了解更多详情。


1 这包括 xmlns:context 属性(xmlns = XML NameSpace)和 xsi:schemaLocation 中的两个 URL。