为什么当我访问一个 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。
当我像这样使用 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.
替代解决方案
如@Autowired
completely and inject all dependencies in XML. See
1 这包括 xmlns:context
属性(xmlns = XML NameSpace)和 xsi:schemaLocation
中的两个 URL。