首页 > 其他分享 >SpringBoot 依赖注入方式

SpringBoot 依赖注入方式

时间:2023-05-12 22:46:07浏览次数:38  
标签:依赖 SpringBoot OrderService getOrder orderService 属性 public 注入

前置知识

  • Spring DI(Dependency Injection)依赖注入:组件之间依赖关系由容器在运行期间决定,即由容器动态的将某个依赖关系注入到组件中
    • 谁依赖谁:应用程序依赖IOC容器
    • 为什么需要依赖:应用程序需要IOC容器提供对象需要的外部资源
    • 谁注入谁:IOC容器注入应用程序某个对象,应用程序依赖的对象
    • 注入了什么:注入某个对象所需要的外部资源,包括对象、资源、常量数据等
  • Spring DI 是通过反射实现的,它允许程序在运行期间动态的生成对象、执行对象的方法、改变对象的属性

依赖注入的方式

前置代码

public interface OrderService {
    Order getOrder();
}
@Service
public class OrderServiceImpl implements OrderService{

    @Override
    public Order getOrder() {
        return new Order();
    }
}

属性注入

  • @Resource Java提供的注解,存在两个属性:name、type。在Spring中是通过name属性来解析Bean的名字,而type属性解析Bean的类型
    • 如果使用name属性时,通过name指定的值自动注入
    • 如果使用type属性时,通过type指定的值自动注入
    • 如果都不指定name或者type属性时,通过反射机制使用name属性自动注入
  • @Autowired Spring提供的注解,只能根据type进行注入,如果type无法识别注入对象时,需要依赖@Qualifier注解通过value属性指定Bean的名称注入或者通过@Primary 的注解,解决依赖注入的歧义时决定要注入哪个Bean
  • @Value 注解一般使用读取配置文件的,该注解所在的类必须被Spring容器所管理
/**新增一个OrderService实现类,用于@Qualifier注解*/
@Service
public class OrderServiceImpl2 implements OrderService{

    @Override
    public Order getOrder() {
        return new Order();
    }
}
@RestController
@RequestMapping("/order")
public class OrderController {
    
    /**读取配置文件中的值*/
    @Value("${server.port}")
    private String port;

    /**属性注入:通过注解 @Autowired*/
    @Autowired
    private OrderService orderService;
    
    /**属性注入:通过注解 @Autowired + @Qualifier(value="") 指定要注入的类*/
    /**
        @Autowired
        @Qualifier("orderServiceImpl2")
        private OrderService orderService;
    */
   
    /**属性注入:通过注解 @Resource */
    /**
        @Resource
        private OrderService orderService;
    */

    @GetMapping("/getOrder")
    public Order getOrder(){
        return orderService.getOrder();
    }

}

setter方法注入(不推荐)

@RestController
@RequestMapping("/order")
public class OrderController {

    private OrderService orderService;

    /**setter方式注入,需要配合使用@Autowired注解*/
    @Autowired
    public void setOrderService(OrderService orderService){
        this.orderService = orderService;
    }

    @GetMapping("/getOrder")
    public Order getOrder(){
        return orderService.getOrder();
    }
}

构造器注入(推荐)

构造器注入的方式能够保证注入的组件不可变(因为属性使用final修饰了),并且确保需要的依赖不为空,还能避免出现循环依赖问题(如存在循环依赖,则在容器启动时就会报错)。构造器注入的依赖总是能够在返回客户端(组件)代码的时候保证完全初始化的状态

@RestController
@RequestMapping("/order")
public class OrderController {

    private final OrderService orderService;

    /**构造器方式注入*/
    public OrderController(OrderService orderService){
        this.orderService = orderService;
    }

    @GetMapping("/getOrder")
    public Order getOrder(){
        return orderService.getOrder();
    }
}

注意点:类中属性没被final修饰时,不能存在无参的构造函数,否则属性就会被赋值为null 

标签:依赖,SpringBoot,OrderService,getOrder,orderService,属性,public,注入
From: https://www.cnblogs.com/52-IT-y/p/17396398.html

相关文章

  • 还在为项目初始化、依赖管理问题困扰?Dubbo Initializer 来了!
    作者:Dubbo社区通过这篇文章,你将学习如何在1分钟内用DubboInitializer模板快速创建DubboSpringBoot项目,帮你解决项目初始化问题。什么是DubboInitializer?DubboInitializer是一款帮助开发者快速生成DubboSpringBoot项目的UI工具,它帮助生成具有基本Dubbo配......
  • SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤
    之前介绍了SpringBoot集成Jpa的简单使用,接下来介绍一下使用Jpa连接数据库对数据进行排序、分页、条件查询和过滤操作。首先创建Springboot工程并已经继承JPA依赖,如果不知道可以查看我的另一篇文进行学习,这里不做介绍。文章地址(https://www.cnblogs.com/eternality/p/17391141.html......
  • vulstudy之DVWAsql注入练习
    Vulstudy/DVWAsql注入练习目录Vulstudy/DVWAsql注入练习 一.Vulstudy搭建 二.Sql注入 Low级别: medium级别 High级别 一.Vulstudy搭建vulstudyvulstudy是专门收集当下流行的漏洞学习平台,并将其制作成docker镜像,方便大家快速搭建环境,节省搭建时间,专注于漏洞学习上。......
  • 无感BLDC方案 采样脉冲注入辨识初始位置, adc采集反电势确定过
    无感BLDC方案采样脉冲注入辨识初始位置,adc采集反电势确定过零点,位置式pid或者增量式pid进行速度闭环,代码架构设置合理,系统和核心控制均采用独立状态机,代码备注清晰明了,方便移植使用。主控stm32f0。ID:44200692608210233......
  • spring出现依赖关系形成循环问题,The dependencies of some of the beans in the appli
    出现这个问题大多使用的springboot都是在2.6.x以上,springboot在2.6.x就将依赖循环禁用了,解决方式有以下几种:解决方式:1、第一种解决方式:可以优化自己程序的逻辑,优化bean的依赖关系,只要不形成一个环状就不会出该问题了 2、第二种解决方式:可以使用@Lazy注解(懒加载)和@Autowired注......
  • 高频注入和滑模观测器 dsp平台完整工程,包括smo和hfi,转子初始
    高频注入和滑模观测器dsp平台完整工程,包括smo和hfi,转子初始位置辩识等,工程编译0错误0警告,无任何lib,无任何lib,算法全开源,核心代码部分基本全注释了。ID:97300666467456425......
  • vue-element-admin安装依赖报错问题
    前言vue-element-admin中文官网要使用中文版,直接去gitgithub下载包:https://github.com/PanJiaChen/vue-element-admin/tree/i18ngitee下载包:https://gitee.com/panjiachen/vue-element-admin/tree/i18n分支记得选择这个i18n问题解决1.修改package.json文件tui-editor这......
  • springboot 大文件切片上传
    1.前端(vueelementui&原生)初始变量声明: currentFile:{},//当前上传的文件bigFileSliceCount:20,//大文件切片后的子文件数量(也可使用其它限定方式,如按照文件大小,每10MB切一片,此处采用的是固定切片的子文件数量的方式倒推切片大小) 接口:切片上传图片&合并......
  • java基于springboot+html的学生就业管理系统的设计与实现,附源码+数据库+文档,包安装调
    1、项目介绍本系统是利用现代化的计算机网络技术将传统信息宣传方式整合,按照实践过程设计完成的。同时完善服务,初步设计一个学生就业管理系统平台以利于相关的事务操作。为了使系统在各项管理中发挥更大的作用,实现计算机信息化高效的管理,现将开发目标功能需求介绍如下:(1)管理员模......
  • SpringBoot中单元测试如何对包含AopContext.currentProxy()的方法进行测试
    今天在工作中遇到一个问题,一个Service类中有一个方法,其中使用了AopContext.currentProxy()去访问自身的函数,例如intresult=((OrderServiceImpl)AopContext.currentProxy()).save();单元测试方法如下:@InjectMocksprivateOrderServiceImplorderServiceUnderTest;@Tes......