解读@Bean和@Autowired、@Resource之间的区别

 更新时间:2025年03月27日 09:29:05   作者:liudachu  
这篇文章主要介绍了@Bean和@Autowired、@Resource之间的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

@Bean和@Autowired、@Resource的区别

@Bean 修饰的方法表示初始化一个对象并交由Spring IOC去管理,@Bean 只能和@Component @Repository @Controller @Service @Configration 配合使用.

@Autowired 可修饰变量和方法,用于完成自动装配(将需要的外部资源注入)

@Resource是java提供的注解,和@Autowired类似

@Bean和@Autowired的区别

网站上看到一个问题:

为什么@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");
    }
}

区别:

简单地解释:

  • @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

@Resource和@Autowired的区别

  • @Autowired会先按byType去找,如果没找到,则会按照byName去找
  • @Resource会先按byName去找,如果没找到则会byType去找。如果设置了name属性,则只会按byName去找,找不到就报错。
@Resource(name = "studentServiceImpl")
    private PersonService personService;

什么时候用Autowired、Resource?

  • Autowired:效率低下,先按类型查找,再按名字查找
  • Resource:按名字查找,后面要跟参数name,好处:当有多个Impl实现类时,可以通name快速找到

当只有一个Impl实类的时候,随便用哪个都差不多,>=2的时候,最好用@Resource,比@Autowired@Qualifier()效率高

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java web spring异步方法实现步骤解析

    Java web spring异步方法实现步骤解析

    这篇文章主要介绍了Java web spring异步方法实现步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • IDEA 2023创建JSP项目的完整步骤教程

    IDEA 2023创建JSP项目的完整步骤教程

    这篇文章主要介绍了IDEA 2023创建JSP项目的完整步骤教程,创建项目需要经过新建项目、设置项目名称和路径、选择JDK版本、添加模块和工件、配置Tomcat服务器等步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Java数据类型之细讲char类型与编码关系

    Java数据类型之细讲char类型与编码关系

    这几天一直在复习Java基础知识,特地写了一篇文章来做一下笔记,文中有非常详细的图文示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • java实现的二级联动菜单效果

    java实现的二级联动菜单效果

    这篇文章主要介绍了java实现的二级联动菜单效果,结合实例形式分析了java前台页面布局及与后台交互构造联动菜单的相关技巧,需要的朋友可以参考下
    2016-08-08
  • Spring防止重复点击的两种实现方法

    Spring防止重复点击的两种实现方法

    页面重复提交导致的问题就是数据被重复保存,我们经常会误触点击两次,所以本文小编给大家介绍了Spring防止重复点击的两种实现方法,需要的朋友可以参考下
    2025-01-01
  • mybatis分割字符串并循环,实现in多个参数的操作

    mybatis分割字符串并循环,实现in多个参数的操作

    这篇文章主要介绍了mybatis分割字符串并循环,实现in多个参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Liquibase结合SpringBoot使用实现数据库管理功能

    Liquibase结合SpringBoot使用实现数据库管理功能

    Liquibase 是一个强大的数据库管理工具,它帮助你通过自动化管理数据库的变更、版本控制、和回滚,简化了开发中的数据库迁移工作,这篇文章主要介绍了Liquibase结合SpringBoot使用实现数据库管理,需要的朋友可以参考下
    2024-12-12
  • 详解Java中LinkedHashMap

    详解Java中LinkedHashMap

    本文主要介绍了Java中LinkedHashMap的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-05-05
  • 详解堆排序算法原理及Java版的代码实现

    详解堆排序算法原理及Java版的代码实现

    如果将堆理解为二叉树,那么树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字,堆排序的时间复杂度为O(N*logN),这里我们就来详解堆排序算法原理及Java版的代码实现
    2016-06-06
  • java批量下载将多个文件(minio中存储)压缩成一个zip包代码示例

    java批量下载将多个文件(minio中存储)压缩成一个zip包代码示例

    在Java应用程序中有时我们需要从多个URL地址下载文件,并将这些文件打包成一个Zip文件进行批量处理或传输,这篇文章主要给大家介绍了关于java批量下载将多个文件(minio中存储)压缩成一个zip包的相关资料,需要的朋友可以参考下
    2023-11-11

最新评论