Spring中的依赖注入DI详解

 更新时间:2024年01月08日 09:42:37   作者:nsnsttn  
这篇文章主要介绍了Spring中的依赖注入DI详解,组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将依赖关系注入到组件之中,依赖注入的目的并非为软件系统带来更多功能,是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台,需要的朋友可以参考下

spring自动注入的方式

xml方式

手动:

  • set方法注入
<bean name ="orderService" class ="com.zzy.service.OrderService">          
</bean>

<bean name ="userService" class ="com.zzy.service.UserService">
    <property name="orderService" ref= "orderService"></property>     
</bean>
  • 构造器注入
<bean name ="orderService" class ="com.zzy.service.OrderService">          
</bean>

<bean name ="userService" class ="com.zzy.service.UserService">
    <constructor-arg index="0" ref= "orderService"/>     
</bean>
  • p标签注入

不常用略

自动注入:

<bean name ="orderService" class ="com.zzy.service.OrderService">          
</bean>
<!--autowire  默认五种方式(ByType,ByName,default,no,constructor),
byType:根据类型去容器寻找
ByName:找set方法,去除Set后的名称去容器中寻找
no:默认
-->
<bean name ="userService" class ="com.zzy.service.UserService" autowire = "byType"> 
</bean>

spring注解方式(常用)

  • 属性注入
  • 方法注入
  • 构造器注入

直接看代码

package com.zzy.zzyNotes.spring.DI依赖注入;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
/**
 * @author: zzy
 * @createDate: 2022-01-07 15:28
 * @description:
 * spring依赖注入的方式
 * 1.属性注入
 * 2.方法注入
 * 3.构造器注入
 *  @Autowired  先根据Type,在根据名字注入,可以放在属性.普通方法,构造方法上
 *
 *  @Resource  根据名字注入,可以放在属性.普通方法上
 *
 *  @Qualifier  指定注入Bean的名字,可以放在属性.普通方法(单参数),普通方法形参前,构造方法形参前
 *
 *  @Primary  相同类型的Bean的优先级最高
 */
@Service
public class UserService {
    //一:属性注入 -------------------------------------------------------------------------------------------------------
    //接口
    @Autowired                         //@Autowired先根据Type,在根据名字
    @Qualifier("ticketsOrderService")  //指定寻找的名字
    private OrderService orderService;
    //类
    @Autowired                         //@Autowired先根据Type,在根据名字
    private GoodsOrderService goodsOrderService;
    //二:方法注入不一定是set方法) -----------------------------------------------------------------------------------------
    //使用方法注入
    //这个我们想指定注入水果Bean
    //方式有三种
    //1.@Primary FruitsOrderService上加@Primary
    //2.@Autowired 配合 @Qualifier("fruitsOrderService") @Qualifier可以加在参数前面
    //2.@Resource(name = "fruitsOrderService") 根据name注入
    private OrderService fruitsOrderService;
    private OrderService goodsOrderService2;
    @Autowired
    //@Resource(name = "fruitsOrderService")
    public void fruits(OrderService orderService,GoodsOrderService goodsOrderService) {
        this.fruitsOrderService = orderService;
        this.goodsOrderService2 = goodsOrderService;
    }
    //三:构造方法注入            -----------------------------------------------------------------------------------------
    //构造方法注入meatOrderService,啥也不加会注入fruitsOrderService,因为@Primary.需要用@Qualifier("meatOrderService")指定
    private OrderService meatOrderService;
    @Autowired
    public UserService( OrderService orderService) {
        this.meatOrderService = orderService;
    }
    public UserService() {
    }
    /**
     * 查询注入的Bean
     */
    public void getBean() {
        System.out.println(orderService);
        System.out.println("属性注入 --------");
        System.out.println(goodsOrderService);
        System.out.println("属性注入 --------");
        System.out.println(fruitsOrderService);
        System.out.println("方法注入 --------");
        System.out.println(goodsOrderService2);
        System.out.println("方法注入 --------");
        System.out.println(meatOrderService);
        System.out.println("构造器注入 --------");
    }
}

spring @Autowired自动注入的流程

spring自动注入的流程(简)

添加了@Autowired的会被标记为注入点,注入点两种

1.属性

2.方法

遍历所有的注入点

先通过Type,在根据Name寻找容器中的Bean,找不到就创建,找到后通过反射给Bean的属性赋值.静态属性不会赋值

到此这篇关于Spring中的依赖注入DI详解的文章就介绍到这了,更多相关Spring依赖注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java for循环标签跳转到指定位置的示例详解

    Java for循环标签跳转到指定位置的示例详解

    这篇文章主要介绍了Java for循环标签跳转到指定位置,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 深入理解Java设计模式之原型模式

    深入理解Java设计模式之原型模式

    这篇文章主要介绍了JAVA设计模式之原型模式的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2021-11-11
  • java中用String.Join美化代码的实例讲解

    java中用String.Join美化代码的实例讲解

    在本篇文章里小编给大家整理的是一篇关于java中用String.Join美化代码的实例讲解内容,有需要的朋友们可以学习下。
    2020-12-12
  • SpringBoot打成jar包瘦身方法总结

    SpringBoot打成jar包瘦身方法总结

    springBoot打包的时候代码和jar包打包在同一个jar包里面,会导致jar包非常庞大,下面这篇文章主要给大家介绍了关于SpringBoot打的jar包瘦身方法的相关资料,需要的朋友可以参考下
    2022-12-12
  • 浅谈Java基于Consul创建分布式锁

    浅谈Java基于Consul创建分布式锁

    这篇文章主要介绍了浅谈基于Consul创建分布式锁,Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置Consul是分布式的、高可用的、可横向扩展的,需要的朋友可以参考下
    2023-07-07
  • Maven依赖中scope的含义

    Maven依赖中scope的含义

    本文主要介绍了Maven依赖中scope的含义,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • java树结构stream工具类的示例代码详解

    java树结构stream工具类的示例代码详解

    Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。今天通过本文重点给大家介绍java树结构stream工具类的示例代码,感兴趣的朋友一起看看吧
    2022-03-03
  • 关于RabbitMQ的Channel默认线程

    关于RabbitMQ的Channel默认线程

    这篇文章主要介绍了关于RabbitMQ的Channel默认线程,通过jvm工具观察rabbitmq的线程使用情况,发现生产者每发一条消息,消费者这边就会创建一条线程,言下之意,一个channel当消息来到时就会异步处理这些消息,需要的朋友可以参考下
    2023-09-09
  • Java判断两个日期相差天数的方法

    Java判断两个日期相差天数的方法

    这篇文章主要介绍了Java判断两个日期相差天数的方法,以实例形式对比分析了java进行日期换算及对比的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • SpringBoot中封装Cors自动配置方式

    SpringBoot中封装Cors自动配置方式

    这篇文章主要介绍了SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03

最新评论