Spring:使用@Autowired注入属性消除setter的XML配置问题
关于Spring XML配置中@Autowired字段注入失败的问题
嘿,这个坑我之前踩过!你说得没错,在注解驱动的Spring配置里,给@Component标注的Bean属性加@Autowired确实能省掉setter方法——Spring会通过反射直接给字段赋值。但换到XML配置里就不行了?这其实是Spring两种配置方式的机制差异导致的。
为什么XML里直接用@Autowired字段注入会失败?
Spring的XML配置默认遵循JavaBean规范,它会优先通过setter方法或者构造器来完成依赖注入。如果你只在属性上加了@Autowired,但XML里没开启注解支持,Spring根本不会识别这个注解,它还是会去找对应的setXxx()方法,找不到就会提示“无法解析属性”。
解决方案:两种方式实现XML配置下的无setter注入
方式1:开启XML的注解支持(推荐)
在你的Spring XML配置文件里加上<context:annotation-config/>标签,它会激活Spring的注解处理器,这样Spring就能识别并处理Bean属性上的@Autowired注解了,不需要写setter方法。
举个例子:
- 你的Bean类(不用写setter):
public class UserService { @Autowired private UserDao userDao; // 业务方法... }
- XML配置文件:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 关键:开启注解配置支持,让Spring处理@Autowired --> <context:annotation-config/> <!-- 定义依赖Bean --> <bean id="userDao" class="com.example.UserDao"/> <!-- 定义目标Bean,不需要配置property标签,靠@Autowired注入 --> <bean id="userService" class="com.example.UserService"/> </beans>
方式2:纯XML实现无setter注入(不推荐,太繁琐)
如果你不想用任何注解,可以通过Spring的AutowiredAnnotationBeanPostProcessor手动注册处理器,不过这种方式代码冗余,不如第一种方便:
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> <bean id="userDao" class="com.example.UserDao"/> <bean id="userService" class="com.example.UserService"/>
本质和方式1一样,只是显式注册了注解处理器。
额外提醒
如果你不想用@Autowired,纯XML里还是老老实实用setter或者构造器注入吧——比如给属性加setter方法,然后在XML里用<property name="userDao" ref="userDao"/>配置,这是XML配置的标准写法,IDE也不会报错。
内容的提问来源于stack exchange,提问作者J.E.Y
相关产品推荐
相关产品推荐

