Spring学习(二) 依赖注入

revit二次开发环境搭建(2024版)(小白友好) revit二次开发环境配置,SDK、addin manager和lookup新手友好安装教程 阅读详情

依赖注入(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>

【回归预测】GRNN广义回归神经网络-MATLAB 广义回归神经网络(GRNN)是一种基于径向基函数(RBF)的神经网络模型,主要用于非线性回归任务。与传统的回归分析方法相比,GRNN具有更强的非线性映射能力和学习速度,能够快速逼近复杂的非线性关系。输入层、模式层、求和层和输出层。输入层接收输入数据,模式层通过径向基函数将输入映射到高维空间,求和层对模式层的输出进行加权求和,最后输出层生成预测结果。GRNN的核心思想是利用高斯核函数计算输入与训练样本之间的相似度,然后根据相似度加权平均得到预测值。 阅读详情

相关推荐

【STM32CubeIDE入门】(一)工程创建&工程配置

​写在前面:如果是刚接触stm32cubeide的同学推荐与这一篇文章共同阅读,能够更加快速认识上手stm32cubeide。 1、打开stm32cubeide,选择好工作目录进入主界面后,点击创建工程。

涛涛子的博客 1万+

SpringBoot附件上传和下载

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

szw906689771的博客 1871

ROS下UR+Realsense相机进行手眼标定

手眼标定主要是用来确定相机坐标系和机械臂坐标系之间的转换关系,从而实现后续的抓取等任务。

weixin_42157689的博客 7569

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

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

codessl的博客 1014

RK3588视频转码实战:如何用FFmpeg+MPP实现16路1080P硬解压(附完整命令)

本文详细介绍了如何在RK3588处理器上使用FFmpeg和MPP框架实现16路1080P视频的硬件加速转码。通过解析RK3588的视频处理架构、环境搭建步骤和实战配置,提供了完整的命令示例和性能调优建议,帮助开发者高效处理多路视频转码任务。

weixin_29233333的博客 556

安卓光速虚拟机ADB调试实战:从密钥配置到设备连接

本文详细介绍了在安卓光速虚拟机中进行ADB调试的完整实战流程。核心在于通过密钥配置解决设备未授权问题,并启用网络调试与端口映射,最终实现电脑与虚拟机的稳定连接。文章提供了从原理理解、脚本修改到实战命令和疑难排查的全方位指南,帮助开发者和爱好者高效利用光速虚拟机作为移动测试沙盒。

CAT789的专栏 555

spring源码之@Resource

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

weixin_41011482的博客 516

Cesium.Ray 知识详解,示例代码

Cesium.Ray 是 CesiumJS 中用于表示三维空间中无限射线的核心类,广泛应用于地理信息系统(GIS)、三维可视化和碰撞检测等场景。射线由起点(origin)和方向向量(direction)定义,数学表达式为 ( P(t) = \text{origin} + t \times \text{direction} )。核心属性包括起点和方向向量,常用方法包括射线与平面的交点计算、根据距离获取射线上的点等。在 Cesium 中,Cesium.Ray 常用于地形碰撞检测、鼠标点选对象和雷达探测模拟等场景

大剑师兰特的GIS世界 425

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

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

it_lihongmin的博客 564

Gbase 8a GDCA考试真题100%

本文整理一些Gbase 8a中非常易错得考试真题及答案,而且都是不好搜的。加粗的是正确答案。

打工之路,一路生花 4300

把 ST03 的历史数据留得更久:ABAP Workload 统计保留期设置、原理与落地避坑指南

SAP ST03性能数据保留期配置指南 ST03/ST03N是SAP系统性能分析的核心工具,但默认数据保留期通常较短(3个月左右),难以满足跨季度对比、年度规划等需求。本文详细解析了ST03数据保留期的配置方法及注意事项: 数据存储机制:性能数据存储在监控库中,通过定期重组作业清理过期数据 配置路径:7.0+系统在"Workload Collector Database→Reorganization→Control"中按Profile分别设置 关键限制:保留期最大值建议不超过99,否则可

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 217

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

常用注解

Whx123A的博客 489

[AHK]获取通达信软件上的股票代码

PC上的股票交易软件的自动止损、自动下单等功能比较弱,不如期货交易软件。 自力更生,程序员都是自己打造工具。 根据IPO模型(Input 输入,Process处理,Output输出),为了方便自动化首先要获取当前交易软件上浏览的股票代码。 截图再OCR显然太麻烦,通过Winspy工具查看下交易软件自带功能的消息号(33780),大家记住这个号码! 下面在用AutoHotkey作为变成语...

liuyukuan的专栏 1万+

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

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

点滴记录IT技术进程 314

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

李双喆 14万+

假人有限元模型

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

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

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

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

从根儿上学习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、付费专栏及课程。

余额充值