为何@Autowired仍生效?@Bean的autowire默认值为Autowire.NO
这是Spring的默认设计行为,两者负责的是完全不同维度的依赖注入逻辑,互不冲突,具体拆解如下:
@Bean的autowire属性到底管什么
这个属性是用来控制当前@Bean生成的bean自身的依赖注入方式,可选值里的Autowire.NO(默认),意思是Spring不会自动通过构造器、setter方法给这个bean注入它自己的依赖——但这只针对该bean内部的依赖装配,和外部代码用@Autowired注入这个bean本身没有任何关系。@Autowired的生效逻辑
@Autowired是显式的依赖注入注解,作用在字段、构造器或setter上,它的核心逻辑是:从Spring容器里找匹配类型(或配合@Qualifier找匹配名称)的已注册bean,然后注入到目标位置。只要被注入的bean已经在容器里(不管是@Bean还是@Component等方式注册的),@Autowired就能正常工作,完全不受该bean的@Bean.autowire属性影响。举个直白的例子
比如你有这样的@Bean定义:@Bean public UserService userService() { return new UserService(); }这里autowire默认是
NO,但你在另一个类里这么写依然能正常注入:@Component public class OrderService { @Autowired private UserService userService; }原因很简单:@Autowired只是从容器里拿已经存在的UserService bean,根本不会关心这个bean自己的autowire设置。
补充:@Bean的autowire属性现在很少用了
这个属性属于Spring早期的自动装配方案,现在官方更推荐直接在@Bean方法里通过参数注入依赖(构造器注入),或者在bean类内部用@Autowired,比如:@Bean public UserService userService(UserDao userDao) { // 直接通过方法参数注入依赖,更直观可控 return new UserService(userDao); }
内容的提问来源于stack exchange,提问作者Jayesslee

