ivan_070 2024-07-23 09:22 采纳率: 87.5%
浏览 0
已结题

为什么这里可以被@Autowired

我们项目里面其中一段代码如下:

@Component
@RequiredArgsConstructor
public class MailSender {

    private final MailAccount mailAccount;

}

这里的MailAccount.java就是一个普通的class,没有任何注解。这里我就很奇怪,因为使用了@RequiredArgsConstructor,所以mailAccount被自动装配,但MainCount不是一个bean,为什么没有报错呢?
我自己创建一个测试项目,加上类似的语句就报错了,提示:
Could not autowire. No beans of 'MailAccount' type found.
请问这是什么问题呢?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-23 09:22
    关注

    引自免费微信小程序:皆我百晓生

    你的疑问很合理。在Spring框架中,@Autowired注解用于自动装配bean。一个bean通常是带有Spring注解并由Spring容器管理的对象。然而,在你提供的代码中,MailAccount类没有任何Spring注解,那么理论上它不应该能被自动装配到MailSender类中。这种情况下的自动装配是通过@RequiredArgsConstructor实现的,这是一种Lombok库提供的注解,用于自动生成一个构造函数,这个构造函数会接收所有标记为final的字段作为参数。换句话说,这个注解创建了一个构造函数,并自动将所有标记为final的字段注入到该构造函数中。在这种情况下,Spring会尝试找到并注入MailAccount类型的bean。如果Spring容器中存在该类型的bean,那么这个过程就会成功,否则就会报错。

    至于你提到在自己的测试项目中出现了“Could not autowire. No beans of 'MailAccount' type found.”的错误,这可能是因为在你的测试项目中并没有定义或配置MailAccount类型的bean。要解决这个问题,你需要确保在你的Spring配置中创建了MailAccount类型的bean。这可以通过添加 @Component 或其他相关注解到 MailAccount 类上实现,或者在你的配置类中通过 @Bean 注解创建一个新的bean实例。下面是一个简单的例子:

    @Component
    public class MailAccount {
        // ...你的代码...
    }
    

    或者

    @Configuration
    public class AppConfig {
        @Bean
        public MailAccount mailAccount() {
            return new MailAccount(); // 或者返回你的MailAccount实例的其他方式
        }
    }
    

    只要确保Spring容器中存在MailAccount类型的bean,那么在你的 MailSender 类中使用 @Autowired MailAccount mailAccount 就应该不会有问题了。这是因为 @RequiredArgsConstructor 会自动处理构造函数中的依赖注入。如果Spring容器中没有找到相应的bean,那么就会像你看到的那样报错。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月31日
  • 已采纳回答 7月23日
  • 创建了问题 7月23日