当前位置:  开发笔记 > 编程语言 > 正文

@Bean和@Autowired之间的区别

如何解决《@Bean和@Autowired之间的区别》经验,为你挑选了3个好方法。

为什么我不能@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相同的东西?



1> DaveyDaveDav..:

@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在一个类中定义了它,而在另一个类中定义了它,它就会变得有用@Autowired.


@PowerFlower,绝对正确,我的观点是解释问题背景的差异.当然,两个注释都有更多的复杂性,但我试图给出这个具体例子的简单,高级解释.

2> pmverma..:
@Bean
BookingService bookingService() {
    return new BookingService();
}

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

@Autowired
BookingService bookingService;

通过从Spring Application Context @Autowired注入BookingServicebean(即Object)来注释变量.

(即)带@Bean注释的已注册bean 将注入带注释的变量@Autowired.

希望这清除你的怀疑!



3> 小智..:

@DaveyDaveDave的很好答案在示例中,而不是

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

您可以在BookingService类上使用@Service批注

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有