@Bean和@Autowired之间的区别

时间:2015-12-09 07:21:03

标签: java spring dependency-injection

为什么我不能在这种情况下使用@Autowired

@SpringBootApplication
public class Application {

    @Autowired
    BookingService bookingService;

    public static void main(String[] args) {
        bookingService.book("Alice", "Bob", "Carol");
    }
}

但可以使用@Bean

@SpringBootApplication
public class Application {

    @Bean
    BookingService bookingService() {
        return new BookingService();
    }

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
        BookingService bookingService = ctx.getBean(BookingService.class);
        bookingService.book("Alice", "Bob", "Carol");
    }
}

生成BookingService同样的事情的两种方法不是吗?

6 个答案:

答案 0 :(得分:115)

@Bean@Autowired做了两件截然不同的事情。这里的其他答案更详细地解释,但更简单:

  • @Bean告诉Spring'这是这个课程的一个实例,请保留它并在我问'时将它还给我。

  • @Autowired说'请给我一个这个类的实例,例如,我之前使用@Bean注释创建的实例。

这有意义吗?在你的第一个例子中,你要求Spring给你一个BookingService的实例,但你永远不会创建一个,所以Spring没有什么可以给你。在你的第二个例子中,你正在创建一个BookingService的新实例,告诉Spring它,然后,在main()方法中,要求它回来。

如果您愿意,可以从第二个main()方法中删除另外两行,并将两个示例合并如下:

@SpringBootApplication
public class Application {

  @Autowired
  BookingService bookingService;

  @Bean
  BookingService bookingService() {
    return new BookingService();
  }

  public static void main(String[] args) {
    bookingService.book("Alice", "Bob", "Carol");
  }
}

在这种情况下,@Bean注释为Spring赋予BookingService@Autowired使用它。

这是一个毫无意义的例子,因为你在同一个类中使用它,但是如果你在一个类中定义了@Bean,并且在{1}}不同的。

答案 1 :(得分:7)

@Bean
BookingService bookingService() {
    return new BookingService();
}

注释@Bean仅在Spring应用程序上下文中将服务注册为bean(一种Object)。简单来说,它只是注册而不是别的。

@Autowired
BookingService bookingService;

使用@Autowired注释变量从Spring Application Context注入BookingService bean(即Object)。

(即)带有@Bean注释的注册bean将被注入到用@Autowired注释的变量。

希望这能清除你的怀疑!

答案 2 :(得分:4)

@DaveyDaveDave的精彩回答 在示例中而不是

@Bean
  BookingService bookingService() {
    return new BookingService();
  }

您可以在BookingService类

上使用@Service注释

答案 3 :(得分:2)

这里有关于@Autowired注释的好文章:http://www.baeldung.com/spring-autowire

@Autowired注释可以通过在配置类上定义@ComponentScan(" namespace.with.your.components.for.inject")来实例化您的注射器

@Configuration
@ComponentScan("com.baeldung.autowire.sample")
public class AppConfig {}

所有组件必须用@Component注释标记。它取代了@Bean注释。

答案 4 :(得分:0)

@Bean仅用于元数据定义来创建bean(等效于tag)。 @Autowired是将依赖项注入到一个Bean中(等效于ref XML标签/属性)。

答案 5 :(得分:0)

无论您使用@Autowire实例化了哪个类,都可以在方法上使用@Bean将其实例化为带有@Configuration注释的类。

@Autowire和@Bean都是初始化Class实例的方法。

区别在于,如果使用@Bean实例化一个类,则可以更好地控制初始化。例如,如果要实例化Resilience4J断路器类,如果在使用@Bean的方法中进行实例化,则可以选择使用如下代码设置所有配置

aujourd'hui

在这种情况下,使用@Bean显然是更好的方法。