Spring boot spring boot@autowired中的注释

Spring boot spring boot@autowired中的注释,spring-boot,autowired,Spring Boot,Autowired,我编写基本java已经有一段时间了,现在正在体验spring引导 在SpringBoot中经常可以看到注释 对我来说,注释是为了节省开发人员实现更少代码的时间,顾名思义是在线的。但这并不能满足我下面的问题 到目前为止,我正在经历@autowired。让我困惑的是@autowired启用依赖注入并告诉bean配置xml(我还不知道它有多有用) 比如说, class A { private int id; // With setter and getter method } c

我编写基本java已经有一段时间了,现在正在体验spring引导

在SpringBoot中经常可以看到注释

对我来说,注释是为了节省开发人员实现更少代码的时间,顾名思义是在线的。但这并不能满足我下面的问题

到目前为止,我正在经历@autowired。让我困惑的是@autowired启用依赖注入并告诉bean配置xml(我还不知道它有多有用)

比如说,

class A {

    private int id;

    // With setter and getter method
}

class B {

    private String name;

    @Autowired 
    A a;
    
B(A a){this.a = a} ;
    
    }
}
然而,在基本java中,它不允许在不使用@autowired的情况下将实例作为参数传递吗?为什么这突然变成了一种好处?或者我错过了什么

class A {

    private int id;

    // With setter and getter method
}

class B {

    private String name;

    A a;
B(A a){this.a = a} ;
    }
}

当您这样做时,您会得到好处(尽管不建议这样做)

现在,假设这些类位于@SpringBootApplication注释类的同一个或子包中,将为您自动配置,并使用Spring框架的反射将a注入B

但是,正如我所提到的,不建议这样做,您可能希望通过构造函数将其注入,因为这使您的组件更易于测试(您可以轻松地注入一个mock代替)。请注意,当您有一个带有构造函数的组件/bean,该构造函数接受参数@Autowired时,就会被推断出来,spring会尝试为您找到要注入其中的bean

@Component
class A {

    private int id;

    // With setter and getter method
}

@Component
class B {

    private String name;

    final A a;

    B(A a) {
        this.a = a;
    }

}

谢谢@p.streef当我们将实例注入构造函数时,就像我在传统方式中所做的那样,我们正在传递我们创建的实例。可能有许多与我们创建的相同类型的实例。spring boot如何知道我们创建的A的哪些实例要传递到B(autowird)中,或者它只是创建a的一个实例并在B中为变量分配一个类型?spring不会自动关联您自己创建的任何东西,除非您在启动期间(在自动关联发生之前)将其添加到上下文中。当我们说,使用自动关联时,a将被注入B,这是否意味着在创建实例B时将创建实例a?如果是这样的话,实际上,通过构造函数在B内部分配成员A有什么区别?我只是想知道为什么像autowired这样的注释在我听到的时候似乎太受欢迎了。它比那个要复杂一点。First spring创建了一个依赖组件的图,并决定首先创建哪个,以便可以将它注入依赖它的组件中。因此,我们的想法是,您只配置/注释类,而由spring实际创建,而不是手动创建这些组件
@Component
class A {

    private int id;

    // With setter and getter method
}

@Component
class B {

    private String name;

    final A a;

    B(A a) {
        this.a = a;
    }

}