Spring学习(二) 依赖注入

CANape快速上手 文章帮助记录CANape学习过程。 阅读详情

依赖注入(Dependency Injection)

(一)、概述
1、能注入的数据:

  • 基本类型和 String
  • 其他 bean 类型(在配置文件中或者注解中配置过的bean)
  • 复杂类型/集合类型

2、IOC的作用:
减低程序间的耦合(即依赖关系)
在当前类需要用到其他类的对象,由 Spring 为我们提供,而我们在配置文件中说明依赖关系的维护,这种方式就称为依赖注入。

(二)、注入方式
1、操作实例:

接口如下:

 public interface IAccountDao {
  
      void saveAccount();
  }

  public interface IAccountService {
  
      /**
       * 模拟保存账户
       */
      void saveAccount();
  }

实现类:

 @Service("accountService")
  public class AccountServiceImpl implements IAccountService {
  
      @Autowired
      @Qualifier("accountDao2")
      private IAccountDao accountDao = null;
  
  
      public void  saveAccount() {
          accountDao.saveAccount();
      }
  
  }

  @Repository("accountDao1")
  public class AccountDaoImpl implements IAccountDao {
  
      public void  saveAccount() {
          System.out.println("对象创建了111");
      }
  
  }

  @Repository("accountDao2")
  public class IAccountDaoImpl2 implements IAccountDao{
  
      public void  saveAccount() {
          System.out.println("对象创建了222");
      }
  }

2、使用注解提供

(1)如何使用:

  • 第一步:在类或方法的前面加上注解关键字
  • 第二步:引入约束,注意此处约束多了xmlns:context…
  • 第三步:添加配置文件,告知 Spring 在创建容器时要扫描的包,配置所需的标签不是在 bean 约束中,而是一个名称为context的名称孔家和约束中,完整配置如下:
  <?xml version="1.0" encoding="UTF-8"?>
     <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:context="http://www.springframework.org/schema/context"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/context
             http://www.springframework.org/schema/context/spring-context.xsd">
     
         <context:component-scan base-package="com.itheima"></context:component-scan>
     </beans>

(2)有哪些注解?

a.用于创建对象的

作用:等同于 xml 配置文件中编写一个 标签

  • @Component
    • 形式:@Component(value=" “)/@Component(” ")
    • 作用:用于把当前类对象存入 Spring 容器
    • 属性:
      value : 用于指定 bean 的 id,当我们不写的时候,它的默认值是当前类名,且首字母改小写;当值只有一个的时候可以省略

以下三个注解的作用与 @Component 完全一样,它们是 Spring 提供的更明确的划分,使三层对象更加清晰

  • @Controller 用于表现层
  • @Service 用于业务层
  • @Repository 用于持久层

b.用于注入数据的

作用:等同于在 标签中写一个 标签

@Autowired

  • 作用:自动按照类型注入,只要容器中有唯一的一个 bean 对象类型和要注入的变量类型匹配, 就可以注入成功如果IOC容器中没有任何
    bean 的类型和要注入的变量类型匹配,则报错
  • 出现位置:可以是变量上,也可以是方法上
  • 细节:在使用注解注入时,set 方法就不是必须的了

@Qualifier

  • 作用:在按照类型注入的基础上再按照名称注入,它在给类成员注入时不能单独使用,但是在给方法参数注入 时可以。

  • 属性:

    value : 用于指定注入的 bean 的 id

@Resource

  • 作用:直接按照 bean 的 id 注入,可以直接使用

  • 属性:

    name : 用于指定 bean 的 id

  • 等同于@Autowired+@Qualifier

**

以上三个注入都只能注入其他 bean 类型的数据,而基本类型和 String 类型的数据无法使用上述注解实现。另外,集合类型的注入只能通过 xml 配置文件实现**

@Value

  • 作用:用于注入基本类型和 String 类型的数据

  • 属性:

    value : 用于指定数据的值,它可以使用 Spring 中 Spel (即spring的el表达式)
    Spel 的写法:${表达式}

c.用于改变范围的

作用:等同于在 标签中使用 scope 属性

@Scope

  • 作用:用于指定 bean 的作用范围

  • 属性:

    value : 指定范围的取值,同 xml 中值,常用为 singleton , prototype

  • 和生命周期相关(了解) 作用:等同于在标签中使用 init-method 和 destroy-method

@PreDestory

  • 作用:用于指定销毁方法

@Postcontrust

  • 作用:用于指定初始化方法

测试类:

 public static void main(String[] args) {
          //1.获取核心容器对象
          ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
          //2.根据id获取Bean对象
          IAccountService as  = (IAccountService)ac.getBean("accountService");
  
          as.saveAccount();
      }
  }

3.第二种:使用 set 方法提供(更常用的方式)

使用的标签:property

出现的位置:bean 标签的内部

标签的属性:

  • name : 用于指定注入时所使用的 set 方法

  • value : 用于提供基本类型和 String 类型的数据

  • ref : 用于指定其他的bean类型数据,它指的就是在 Spring 容器中出现过的bean对象

优势:创建对象时没有明确的限制,可以直接使用默认构造函数

弊端:如果有某个成员必须有值,是有可能 set 方法没有执行

1、基本类型和 String 的注入方式

业务层

 public class AccountServiceImpl implements IAccountService {
      // 如果时经常变化的数据不适用于依赖注入,此处仅为演示
      private String name;
      private Integer age;
      private Date birthday;
  
      public void setName(String name) {
          this.name = name;
      }
  
      public void setAge(Integer age) {
          this.age = age;
      }
  
      public void setBirthday(Date birthday) {
          this.birthday = birthday;
      }
  
      public void  saveAccount() {
          System.out.println("service中的saveaccount()执行了" + name + "," + age + "," +birthday);
      }
  
  }

配置bean.xml

<bean id = "accountService" class = "com.itheima.service.impl.AccountServiceImpl">
          <property name="name" value ="taylor"></property>
          <property name="age" value="21"></property>
          <property name="birthday" ref="now"></property>
</bean>
  
<bean id = "now" class = "java.util.Date"></bean>

2、复杂集合类型的注入方式

用于给 List 结构集合注入的标签

  • list
  • array
  • set

用于给map结构集合注入的标签

  • map
  • properties

结构相同,标签可以互换,因此开发中只要记住两组标签即可

编写实例:

 public class AccountServiceImpl implements IAccountService {
 
     private String[] myStrs;
     private List<String> myList;
     private Set<String> mySet;
     private Map<String, String> myMap;
     private Properties myProps;
 
     public void setMyStrs(String[] myStrs) {
         this.myStrs = myStrs;
     }
 
     public void setMyList(List<String> myList) {
         this.myList = myList;
     }
 
     public void setMySet(Set<String> mySet) {
         this.mySet = mySet;
     }
 
     public void setMyMap(Map<String, String> myMap) {
         this.myMap = myMap;
     }
 
     public void setMyProps(Properties myProps) {
         this.myProps = myProps;
     }
 
     public void  saveAccount() {
         System.out.println(Arrays.toString(myStrs));
         System.out.println(myList);
         System.out.println(myMap);
         System.out.println(mySet);
         System.out.println(myProps);
     }
 
 }

配置如下:

<bean id = "accountService" class = "com.itheima.service.impl.AccountServiceImpl">
         <!--以下三个标签是等价的,set未列出-->
         <property name="myList">
             <list>
                 <value>aaa</value>
                 <value>bbb</value>
             </list>
         </property>
 
         <property name="myStrs">
             <array>
                 <value>aaa</value>
                 <value>bbbb</value>
             </array>
         </property>
 
         <property name="mySet">
             <array>
                 <value>aaa</value>
                 <value>bbbb</value>
             </array>
         </property>
 
         <!--以下两种方式等价-->
         <property name="myMap">
             <map>
                 <!--以下两种配置方式都可以-->
                 <entry key="testA" value="aaa"></entry>
                 <entry key="testA">
                     <value>bbb</value>
                 </entry>
             </map>
         </property>
 
         <property name="myProps">
             <props>
                 <prop key="testB">bbb</prop>
             </props>
         </property>
     </bean>

4、使用构造函数提供

使用的标签:constructor-arg

标签所在位置:bean 标签的内部

标签中的属性:

  • type : 用于指定要注入的数据类型,该类型也是构造函数中某个或某些参数的类型
  • index : 用于指定要注入的数据给构造函数中指定索引位置的参数赋值,索引的位置时从0开始
  • name(常用) : 用于指定给构造函数中指定名称的参数赋值
  • value : 用于提供基本类型和String类型的数据
  • ref : 用于指定其他的bean类型数据。它指的就是在spring的IOC核心容器出现过的bean对象

特点:在获取 bean 对象时,注入数据是必须的操作,否则无法操作成功

弊端:改变了 bean 对象的实例化方式,使我们在用不到这些数据的情况下也必须提供带参构造函数,因此开发中较少使用此方法,除非避无可避

例:

public class AccountServiceImpl implements IAccountService {
     // 如果时经常变化的数据不适用于依赖注入,此处仅为演示
     private String name;
     private Integer age;
     private Date birthday;
 
     public AccountServiceImpl(String name, Integer age, Date birthday){
         this.name = name;
         this.age = age;
         this.birthday = birthday;
     }
 
     public void  saveAccount() {
         System.out.println("service中的saveaccount()执行了");
     }
 
 }

测试类:

 public static void main(String[] args) {
         //1.获取核心容器对象
         ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
         //2.根据id获取Bean对象
         IAccountService as  = (IAccountService)ac.getBean("accountService");
         as.saveAccount();
     }

配置如下:

 <bean id = "accountService" class = "com.itheima.service.impl.AccountServiceImpl">
         <constructor-arg name = "name" value="taylor"></constructor-arg>
         <constructor-arg name = "age" value = "23"></constructor-arg>
         <constructor-arg name = "birthday" ref = "now"></constructor-arg>
 </bean>
 
 <bean id = "now" class = "java.util.Date"></bean>

STM32CubeMX之emWin移植 “前面两章介绍了SDRAM和LTDC的使用,本篇文章将介绍emWin移植到STM32。”硬件环境:STM32F429IGT6软件环境:STM32CubeMX v5.5.0... 阅读详情

相关推荐

SystemRDL:从寄存器描述到自动化生成的完整指南

本文详细介绍了SystemRDL如何通过“一份描述,多处生成”的理念,彻底解决芯片与FPGA设计中手动维护寄存器带来的不一致与低效问题。文章提供了从语言快速上手、核心组件讲解到使用PeakRDL工具链实现自动化代码与文档生成的完整实战指南,帮助硬件工程师构建高效、可靠的寄存器开发流程。

weixin_29243279的博客 657

SpringBoot附件上传和下载

附件上传 @PostResource(name = "新增填报", path = "/addEmmissionsReductionInput", requiredLogin = false, requiredPermission = false) @ApiOperation(value = "新增填报", response = Long.class) public ResponseData addEmmissionsReductionInput( AddEmmissionsReduction

szw906689771的博客 1871

电力电子课设救星:用Simulink实现Buck变换器双闭环控制(PID调参技巧)

本文是电力电子课程设计的实用指南,详细讲解如何利用Simulink仿真平台实现Buck变换器的电压电流双闭环控制。文章核心聚焦于PID参数整定的实战技巧,提供了从手动调试口诀到MATLAB脚本自动优化的完整方案,旨在帮助学生高效完成课设,深入理解闭环控制原理并生成专业报告。

weixin_29179311的博客 296

Spring 基于注解的配置(三)(@Resource,@PostConstruct ,@PreDestory)

简介:Spring也用提供JSR-250 @Resource 注解在属性或者Bean setter方法上使用,它是JavaEE 5和 JavaEE 6的公共部分

codessl的博客 1014

一步一步搭建S32K14x的AutoSar项目----MCAL工程创建及说明

一步一步搭建S32K14X的Autosar项目--MCAL工程创建及说明

wo580231的博客 2493

基于Web的智能家居(源码+开题)

实践上,智能家居系统的普及和应用将极大改善人们的居住体验,提高生活质量,同时也有助于促进智能家居产业链的发展和完善,为社会经济发展注入新的活力。此外,本研究还将对基于Web的智能家居系统的用户体验进行深入研究,通过用户调研和数据分析,不断优化系统功能和界面设计,提升用户的使用体验和满意度。针对以上问题,本研究将综合运用物联网、云计算、大数据等新一代信息技术,通过系统架构设计、功能模块开发、安全性保障、用户体验优化等多个方面的研究工作,力求为基于Web的智能家居系统的研发和应用提供全面而有效的解决方案。

sryue06的博客 1902

spring源码之@Resource

这个注解加载的时候经过的类是CommonAnnotationBeanPostProcessor 和Autowired一样,也是postProcessProperties()方法。 而且 InjectionMetadata metadata = findResourceMetadata(beanName, bean.getClass(), pvs); 这一行的内部流程和AutowiredAnnotationBeanPostProcessor是一样的所以看一下就可以,不在这里一一解析了。 不一样的点在于inj

weixin_41011482的博客 516

【Python・统计学】(两)多因素方差分析(原理及代码)

自学笔记,分享给对统计学原理不太清楚但需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文不涉及公式讲解(文科生小白友好体质)~(部分定义等来源于知乎) 本文重点:多因素方差分析 【1.多因素方差分析简单原理】 【2.多因素方差分析步骤】 【3.多因素方差分析代码】

TUTO_TUTO的博客 4864

Spring源码 - @Resource、@PostConstruct、@PreDestroy原理分析(CommonAnnotationBeanPostProcessor - 下)

目录 一、注解LifecycleMetadata的生命周期 1、findLifecycleMetadata(递归获取生命周期注解添加到容器) 2、invokeInitMethods 3、invokeDestroyMethods 二、注解InjectionMetadata的生命周期 1、findResourceMetadata(递归获取@Resource注解添加到容器) 2、check...

it_lihongmin的博客 564

【新手必看】蓝牙的HOGP和HID、GATT有什么区别和联系

让新手宏观了解蓝牙HOGP、HID、GATT这三个协议的区别和联系

qq_51976334的博客 1565

手把手教你用示波器抓取MIPI D-PHY波形:从LP11到HS Burst的完整信号解析

本文详细介绍了使用示波器精准捕获MIPI D-PHY信号的关键技巧,包括探头选择、示波器参数设置、信号状态解析及高级触发配置。通过实战案例和波形分析,帮助工程师快速识别从LP11到HS Burst的各种信号状态,解决常见的信号完整性问题,提升调试效率。

weixin_30471561的博客 560

注解的使用:开发中我们可以使用注解 取代 xml配置文件。

常用注解

Whx123A的博客 489

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景,在 Windows Presentation Foundation(WPF)开发中,依赖项属性是一个核心且强大的特性,它为构建灵活、可扩展的用户界面提供了关键支持。理解并熟练运用依赖项属性,对于开发高效、健壮的 WPF 应用程序至关重要。本文将深入探讨 WPF 依赖项属性,通过丰富的代码示例和对关键概念的详细解释,帮助读者全面掌握这一重要特性及其应用场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

Spring学习(二)——依赖注入

Spring依赖注入学习,详细介绍Spring装配Bean的三种方式,以及如何在JavaConfig中引入XML配置文件进行混合配置。

点滴记录IT技术进程 314

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

spring框架学习(二)依赖注入

spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入。接口注入不作要求,下面介绍前两种方式。 1,set注入   采用属性的set方法进行初始化,就成为set注入。     1)给普通字符类型赋值。 public class User{ privateString username; publicString getUsername()

李双喆 14万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring学习笔记(二)——Spring依赖注入

目录依赖注入的概念Spring依赖注入构造函数注入:set方法注入复杂类型的注入/集合类型的注入依赖注入纯xml配置实现 依赖注入的概念 依赖注入:Dependency Injection。它是 spring 框架核心 ioc 的具体实现。 我们的程序在编写时,通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。 ioc 解耦只是降低他们的依赖关系,但不会消除。例如...

不愿意做鱼的小鲸鱼の博客 200

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

从根儿上学习spring 二 之依赖注入原理了解

很快我们发现在SpringApplication#prepareContext里使用了getAllSources方法,在并将获取到的primarySources属性传给了SpringApplication类的load方法,跟随着load方法一步一步debug下去就会发现spring把TestMain.class封装成了BeanDefinition,并放到了DefaultListableBeanFactory的Map类型的beanDefinitionMap属性中了,key为testMain。

baidu_19338587的博客 770

Spring学习(二)--- Spring的依赖注入

初学Spring依赖注入的时候,不清楚到底是怎么回事?到底是作用在什么地方?依赖注入到底是干什么用的?遂从网上找到了下面一些总结: ================================================================================ 横线中间总结来源于:https://www.cnblogs.com/wenbinshen/p/9...

szjshang的博客 253

Spring框架学习二 IOC依赖注入

class:则是该id所对应的类,class里所写的一定是要类的完全限定名(3) 编写main方法,获取User对象使用ApplicationContext获取IOC容器,参数所需写的是配置文件的名称使用ApplicationContext对象的getBean方法取得Bean对象,参数写的是第三步填写的唯一标识id打印user,即可获取user对象的地址。

Q53100的博客 188

Spring学习二(DI依赖注入)

一、 Bean的作用域   bean的作用域:主要是指Spring创建的Bean对象是单例、多例、request、session级别。   singleton: 单例模式【在一个spring容器中,对象只有一个实例。(默认值)】   prototype:多例模式/原型模式【在一个spring容器中,存在多个实例,每次getBean 返回一个新的实例。】   request:该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplication

qibulemingzi的博客 269

Spring学习笔记(二)依赖注入

注:本文部分内容参考https://blog.youkuaiyun.com/ncepu_Chen/article/details/91903396#_454 文章目录依赖注入的三种数据类型依赖注入三种方式1.构造函数注入2.Set方法注入(常用)3.使用注解实现常用注解用于创建对象的注解用于注入对象的注解用于改变作用范围的注解和生命周期相关的注解 依赖注入的三种数据类型 1.String与其他基本数据类型 2...

qq_35225663的博客 292

【Spring】学习二(依赖注入和整合mybatis)

目录 一:Spring 之 DI(依赖注入) 二:使用 Spring简化、整合Mybatis 一:Spring 之 DI(依赖注入) 1、DI:中文名称:依赖注入 2、英文名称(Dependency Injection) 3、DI 是什么? 3.1 DI 和 Ioc...

韧锋zzZ的Blog 570

Spring5学习(二):Spring 配置、依赖注入

Spring5学习(二)5.Spring 配置5.1 别名5.2 Bean的配置5.3 import6.依赖注入6.1 构造器注入6.2 Set注入6.3 其他注入6.4 bean的作用域 5.Spring 配置 5.1 别名 <alias name="user" alias="usernew"/> 5.2 Bean的配置 <!-- id:bean的唯一标识符,也就是相当于我门学的对象名 class:bean对象所对应的全限定名:包名 + 类型

weixin_44609958的博客 231

Spring5学习(二)—— 依赖注入

文章目录前言一、构造器注入二、set方法注入三、扩展方法注入1. p-命名空间2. c-命名空间 前言 依赖:Bean对象的创建依赖于Spring容器。 注入:Bean对象的所有属性都由Spring容器注入 依赖注入的三种方式: 构造器注入 set方法注入 拓展方法注入 一、构造器注入 即实体类有参构造时,向有参构造器中输入属性值。示例 其在.xml配置文件中注入方式为: <bean id="username" class="com.yumi.User"> <!-- 1.下标赋值

人生海海 386

【 从零到精通Spring学习笔记(二)依赖注入】

Spring笔记 ,关于依赖注入,1.setter注入 2.构造器注入

2402_88700528的博客 952
上一篇: Spring学习(一) Bean的装配与管理
下一篇: Spring学习(三) 基于xml和注解的IOC案例
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值