Spring Boot 自动装配的几种用法示例小结

 更新时间:2025年07月23日 11:15:31   作者:何中应  
文章介绍了SpringBoot自动装配的多种用法,包括基础的@Bean注册、策略模式通过applicationContext获取指定Service实现类,以及高级的获取接口所有实现类集合和Map映射,感兴趣的朋友跟随小编一起看看吧

说明:自动装配是Spring Boot框架的一大特点,简单说,是项目启动时,自动创建一系列Bean对象。

本文介绍几个借助Spring Boot自动装配的用法。

基础用法

用法一:基本操作

最基础的用法是用 @Bean 注解,手动将对象放入到 Spring Boot 的IOC容器中,其他地方就可以使用 @Autowired 注解直接使用该对象。

如下:

(某个类对象,注意类上没有额外加注解)

public class DemoService {
    public String test() {
        return "test";
    }
}

(将对象放入到 IOC 容器中)

import com.hezy.service.DemoService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AutoBeanConfiguration {
    @Bean
    public DemoService testBean() {
        return new DemoService();
    }
}

(直接注入使用)

import com.hezy.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/demo")
public class DemoController {
    @Autowired
    private DemoService demoService ;
    @GetMapping
    public String sayHello() {
        return demoService.test();
    }
}

启动项目,调用,正常返回结果

另外,使用 @Bean 注解将对象放入 IOC 容器,需要配合类上的 @Configuration 注解,所以通常来说,我们都会创建一个配置类,将需要实例化的 Bean 对象都放入到这个配置类中,最后再使用服务注册的方式,将这个配置的全限定类名放到 META-INF 文件下的 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件里,这样其他引入该模块的其他模块,就能直接注入该模块的 Bean 对象。

用法二:获取指定Service

在一些场景,比如将数据生成文件(excel、word、pdf),我们需要根据配置来调用指定的 Service 实现类(ExcelServiceImpl、WordServiceImpl、PdfServiceImpl),我们通常的做法是给这些 Service 设置一个名称,然后使用 applicationContext 的 ap i获取指定实现类调用。

如下:

(创建一个写服务接口,其他具体实现类实现该接口)

/**
 * 写服务接口
 */
public interface WriteService {
    String write(String content);
}

(excel实现类)

import org.springframework.stereotype.Service;
/**
 * excel实现类
 */
@Service("excel")
public class ExcelServiceIImpl implements WriteService {
    @Override
    public String write(String content) {
        return "excel:" + content;
    }
}

(word实现类)

import org.springframework.stereotype.Service;
/**
 * word实现类
 */
@Service("word")
public class WordServiceImpl implements WriteService {
    @Override
    public String write(String content) {
        return "word:" + content;
    }
}

(pdf实现类)

import org.springframework.stereotype.Service;
/**
 * pdf实现类
 */
@Service("pdf")
public class PdfServiceImpl implements WriteService {
    @Override
    public String write(String content) {
        return "pdf:" + content;
    }
}

(使用,使用 applicationContext 的 getBean方法获取指定实现类调用其方法执行)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
@Service
public class TestService {
    @Autowired
    private ApplicationContext applicationContext;
    public String test(String type, String content) {
        return applicationContext.getBean(type, WriteService.class).write(content);
    }
}

(具体使用哪一个实现类,来自前端传递的参数)

    @Autowired
    private TestService testService;
    @GetMapping("/write")
    public String write(String type, String content) {
        return testService.test(type, content);
    }

启动项目,传递执行写操作的类型及内容,如下。这样就很方便了,是策略模式的一种体现。

高级用法

用法一:获取某接口的所有实现类

假设一个场景,我们需要获取某接口的所有实现类,依次执行,返回最终结果。这时我们可以通过下面这种方式,直接获取所有实现类的集合:

    @Autowired
    private List<WriteService> writeServices;
    public String test2() {
        return writeServices.size() + "";
    }

启动项目,调用接口,打断点查看集合,可见该接口的所有实现类

这种用法场景挺多的,作者在实际开发中也遇到过。可以参看下面这两篇博客介绍:

用法二:获取具体实现类的Map映射

在前面基础用法中,我们提到获取指定 Service 可以使用 applicationContext 的 api,其实更简单的可以直接使用下面这种方式:

    @Autowired
    private Map<String, WriteService> writeServiceMap;
    public String test3() {
        return writeServiceMap.size() + "";
    }

启动项目,断点打在这里,可以看到 Map 里面存的 key 是 Bean 名称,value 是具体实现类

所以基础用法的代码,可以修改如下:

    @Autowired
    private Map<String, WriteService> writeServiceMap;
    public String test(String type, String content) {
        return writeServiceMap.get(type).write(content);
    }

这种写法是不是更简洁、优雅

总结

本文介绍了Spring Boot 自动装配的几种用法。

到此这篇关于Spring Boot 自动装配的几种用法示例小结的文章就介绍到这了,更多相关springboot自动装配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot实现PDF添加水印的三种方法

    SpringBoot实现PDF添加水印的三种方法

    本文主要介绍了SpringBoot实现PDF添加水印的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • java中Map集合的常用方法总结大全

    java中Map集合的常用方法总结大全

    开发中最常用的就是List集合和Map集合,Map集合是基于java核心类java.util中的,下面这篇文章主要给大家总结介绍了关于java中Map集合的一些常用方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 解决spring.thymeleaf.cache=false不起作用的问题

    解决spring.thymeleaf.cache=false不起作用的问题

    这篇文章主要介绍了解决spring.thymeleaf.cache=false不起作用的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java中的JetCache 实战

    Java中的JetCache 实战

    这篇文章主要介绍了Java中的JetCache实战,JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用,下文更多相关资料需要的小伙伴可以参考一下
    2022-04-04
  • java 网络编程之TCP通信和简单的文件上传功能实例

    java 网络编程之TCP通信和简单的文件上传功能实例

    下面小编就为大家分享一篇java 网络编程之TCP通信和简单的文件上传功能实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • SpringMVC结合ajaxfileupload.js实现文件无刷新上传

    SpringMVC结合ajaxfileupload.js实现文件无刷新上传

    这篇文章主要介绍了SpringMVC结合ajaxfileupload.js实现文件无刷新上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • SpringMVC使用自定义验证器进行数据验证的方法

    SpringMVC使用自定义验证器进行数据验证的方法

    SpringMVC 提供了强大的数据验证机制,可以方便地验证表单提交的数据,除了自带的验证器之外,SpringMVC 还支持自定义验证器,允许开发者根据业务需求自定义验证规则,本文将介绍如何在 SpringMVC 中使用自定义验证器
    2023-07-07
  • SpringBoot使用责任链模式优化业务逻辑中的if-else代码

    SpringBoot使用责任链模式优化业务逻辑中的if-else代码

    在开发过程中,我们经常会遇到需要根据不同的条件执行不同的逻辑的情况,我们可以考虑使用责任链模式来优化代码结构,使得代码更加清晰、可扩展和易于维护
    2023-06-06
  • 详解Java 集合类 List 的那些坑

    详解Java 集合类 List 的那些坑

    这篇文章主要介绍了Java 集合类 List 的那些坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java语言实现最大堆代码示例

    Java语言实现最大堆代码示例

    这篇文章主要介绍了Java语言实现最大堆代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-12-12

最新评论