初学spring5(三)依赖注入(DI)

news2024/11/14 18:43:13

学习回顾:初学spring (五) 快速上手spring


Dependency Injection


一、概念

  • 依赖注入(Dependency Injection,DI)。
  • 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 .
  • 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 .

二、构造器注入

我们在之前的案例已经讲过了

三、Set 注入 (重点)

要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is .

测试pojo类 :
Address.java

 public class Address {
 
     private String address;
 
     public String getAddress() {
         return address;
    }
 
     public void setAddress(String address) {
         this.address = address;
    }
 }

Student.java

 package com.tang.pojo;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class Student {

    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbys;
    private Map<String,String> card;
    private Set<String> games;
    private String wife;
    private Properties info;

    public void setName(String name) {
        this.name = name;
   }

    public void setAddress(Address address) {
        this.address = address;
   }

    public void setBooks(String[] books) {
        this.books = books;
   }

    public void setHobbys(List<String> hobbys) {
        this.hobbys = hobbys;
   }

    public void setCard(Map<String, String> card) {
        this.card = card;
   }

    public void setGames(Set<String> games) {
        this.games = games;
   }

    public void setWife(String wife) {
        this.wife = wife;
   }

    public void setInfo(Properties info) {
        this.info = info;
   }

    public void show(){
        System.out.println("name="+ name
                + ",address="+ address.getAddress()
                + ",books="
       );
        for (String book:books){
            System.out.print("<<"+book+">>\t");
       }
        System.out.println("\n爱好:"+hobbys);

        System.out.println("card:"+card);

        System.out.println("games:"+games);

        System.out.println("wife:"+wife);

        System.out.println("info:"+info);

   }
}

3.1 常量注入

 <bean id="student" class="com.tang.pojo.Student">
    <property name="name" value="小明"/>
</bean>

测试:

 @Test
 public void test01(){
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
 
     Student student = (Student) context.getBean("student");
 
     System.out.println(student.getName());
 
 }

3.2 Bean注入

注意点:这里的值是一个引用,ref

<bean id="addr" class="com.tang.pojo.Address">
    <property name="address" value="重庆"/>
</bean>

<bean id="student" class="com.tang.pojo.Student">
    <property name="name" value="小明"/>
    <property name="address" ref="addr"/>
</bean>

3.3 数组注入

<bean id="student" class="com.tang.pojo.Student">
    <property name="name" value="小明"/>
    <property name="address" ref="addr"/>
    <property name="books">
        <array>
            <value>西游记</value>
            <value>红楼梦</value>
            <value>水浒传</value>
        </array>
    </property>
</bean>

3.4 List注入

 <property name="hobbys">
    <list>
        <value>听歌</value>
        <value>看电影</value>
        <value>爬山</value>
    </list>
</property>

3.5 Map注入

<property name="card">
    <map>
        <entry key="中国邮政" value="456456456465456"/>
        <entry key="建设" value="1456682255511"/>
    </map>
</property>

3.6 set注入

 <property name="games">
    <set>
        <value>LOL</value>
        <value>BOB</value>
        <value>COC</value>
    </set>
</property>

3.7 Null注入

 <property name="wife"><null/></property>

3.8 Properties注入

 <property name="info">
   <props>
       <prop key="学号">20190604</prop>
       <prop key="性别"></prop>
       <prop key="姓名">小明</prop>
   </props>
</property>

测试结果:
在这里插入图片描述

四、p命名和c命名注入

User.java :【注意:这里没有有参构造器!】

public class User {
     private String name;
     private int age;
 
     public void setName(String name) {
         this.name = name;
    }
 
     public void setAge(int age) {
         this.age = age;
    }
 
     @Override
     public String toString() {
         return "User{" +
                 "name='" + name + '\'' +
                 ", age=" + age +
                 '}';
    }
 }

4.1 P命名空间注入 : 需要在头文件中加入约束文件

 导入约束 : xmlns:p="http://www.springframework.org/schema/p"

<!--P(属性: properties)命名空间 , 属性依然要设置set方法-->
<bean id="user" class="com.tang.pojo.User" p:name="狂神" p:age="18"/>

4.2 c 命名空间注入 : 需要在头文件中加入约束文件

 导入约束 : xmlns:c="http://www.springframework.org/schema/c"
<!--C(构造: Constructor)命名空间 , 属性依然要设置set方法-->
<bean id="user" class="com.tang.pojo.User" c:name="狂神" c:age="18"/>

发现问题:爆红了,刚才我们没有写有参构造!
解决:把有参构造器加上,这里也能知道,c 就是所谓的构造器注入!

测试代码:

 @Test
 public void test02(){
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
     User user = (User) context.getBean("user");
     System.out.println(user);
 }

五、Bean的作用域

在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象 .
在这里插入图片描述
几种作用域中,request、session作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。

5.1 Singleton

当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置:

<bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">

测试:

 @Test
 public void test03(){
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
     User user = (User) context.getBean("user");
     User user2 = (User) context.getBean("user");
     System.out.println(user==user2);
 }

5.2 Prototype

当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置:

<bean id="account" class="com.foo.DefaultAccount" scope="prototype"/>  
 或者
<bean id="account" class="com.foo.DefaultAccount" singleton="false"/>

5.3 Request

当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>

针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。

5.4 Session

当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/708253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL-每日一题【180.连续出现的数字】

题目 表&#xff1a;Logs 编写一个 SQL 查询&#xff0c;查找所有至少连续出现三次的数字。 返回的结果表中的数据可以按 任意顺序 排列。 查询结果格式如下面的例子所示&#xff1a; 示例 1: 解题思路 1.要查询至少连续出现三次的数字&#xff0c;则可以转化为&#xff08;…

软考A计划-系统集成项目管理工程师-项目整体管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

【C#】文件拖拽,获取文件路径

系列文章 【C#】编号生成器&#xff08;定义单号规则、固定字符、流水号、业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

vue2实现一个上边为搜索,下面为复选框选中后,右侧显示已选中组件

目录 vue2实现一个上边为搜索&#xff0c;下面为复选框选中后&#xff0c;右侧显示已选中组件component / ProjectSelectItem.vue使用组件效果 vue2实现一个上边为搜索&#xff0c;下面为复选框选中后&#xff0c;右侧显示已选中组件 component / ProjectSelectItem.vue <…

对于小米随手吸尘器各种问题的初始办法

本人在什么值得买发过&#xff0c;现在只不过是为了让账号看起来更丰盈一点&#xff0c;现在再发一次。 充不进去电/使用的时候短暂吸气&#xff0c;这两个问题&#xff0c;在上个月的时候我就已经发现了这个问题。 然后我就拆开了那个主机&#xff0c;就是那个保温杯一样的东…

SpringCloud(3) Ribbon负载均衡,负载均衡策略,自定义负载均衡

目录 1.Ribbon负载均衡流程2.Ribbon负载均衡策略3.自定义负载均衡策略如何实现4.总结 1.Ribbon负载均衡流程 假设我们有一台 order-service 订单服务&#xff0c;两台 user-service 用户服务&#xff0c;当订单服务需要调用用户服务获取用户信息的时候&#xff0c;应该怎么分配…

Windows下mysql 8.0.11 安装教程

http://www.jb51.net/article/140950.htm &#xff1a;此文章注意my.ini的扩展名 MySQL安装参考&#xff1a;mysql-8.0.11-winx64.zip在Windows中的安装配置-百度经验 MySQL卸载&#xff1a;https://blog.csdn.net/cxy_summer/article/details/70142322 下载最新的MySQL 1、…

经商必看的10本书籍推荐

1、《经理人参阅&#xff1a;商业模式与商业思维》 这本书被誉为商业模式的圣经。该书通过可视化工具&#xff0c;包括商业模式画布和价值主张画布&#xff0c;帮助企业家、创业者和经理人创造创新的商业模式。本书通过图表、图像和实例&#xff0c;详细讲解了商业模式的构建方…

智慧饮品未来发展方向:点赋科技AI智能饮品机器人的崛起

随着人们对健康饮品的追求和科技的不断创新&#xff0c;智慧饮品正在迅速崛起并成为未来饮品市场的热点。其中&#xff0c;AI智能饮品机器人作为一种创新的服务形式&#xff0c;将在未来发展中扮演重要角色。点赋科技将探讨智慧饮品市场的未来发展方向以及AI智能饮品机器人的潜…

URL(URI) 中的编码与乱码(下)--查询字符串(query string)中的编码

在上篇中, 初步谈论了 URL 中含有中文字符时的转义编码, 提到了所使用的编码是 utf-8. 不过你可能会有点疑问, 一定都是要用 utf-8 编码吗? 还是因为页面编码本身是 utf-8 的缘故呢? 毕竟在那个例子中, 页面的编码也恰好是 utf-8. 在 GBK 编码页面下的 URL 转义 这次, 将继…

Linux10.地址空间

1.几乎所有的语言&#xff0c;如果它有地址的概念&#xff0c;这个地址一定不是物理地址&#xff0c;是虚拟地址(线性地址)。 2.诸如网卡&#xff0c;硬盘和显卡等外设内部也具有寄存器。 3.在makefile中&#xff0c;gcc -o 文件A 文件1 文件2(…)可以写成 :gcc -o $ $^ 4.地…

程序员常用的几个效率小工具,可好用了!

目录 &#x1f5a5;️ Hexed.it &#x1f5bc;️ Carbon &#x1f5bc;️ Draw.net 今天给大家推荐几个平时工作学习中常用到的小工具&#xff0c;让你效率拉满&#xff01; &#x1f5a5;️ Hexed.it 在线地址&#xff1a;HexEd.it - Browser-based Online and Offline He…

增强深度学习与对抗训练对癫痫发作的鲁棒预测

标题&#xff1a;Augmenting Deep Learning with Adversarial Training for Robust Prediction of Epilepsy Seizures Abstract: 癫痫是一种慢性疾病&#xff0c;涉及异常的大脑活动&#xff0c;导致患者失去对意识或运动活动的控制。因此&#xff0c;在癫痫发作之前检测出癫…

Learn Mongodb DB数据库部署 ②

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; PHP MYSQL &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

类加载的时机

类加载的时机 类的生命周期 类从被加载到虚拟机内存开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期包括以下 7 个阶段&#xff1a; 加载 验证 准备 解析 初始化 使用 卸载 验证、准备、解析 3 个阶段统称为连接。 加载、验证、准备、初始化和卸载这 5 个阶段的…

【MATLAB第49期】基于MATLAB的深度学习ResNet-18网络不平衡图像数据分类识别模型

【MATLAB第49期】基于MATLAB的深度学习ResNet-18网络不平衡图像数据分类识别模型 一、基本介绍 这篇文章展示了如何使用不平衡训练数据集对图像进行分类&#xff0c;其中每个类的图像数量在类之间不同。两种最流行的解决方案是down-sampling降采样和over-sampling过采样。 在…

力扣 -- 64.最小路径和

题目链接&#xff1a;64. 最小路径和 - 力扣&#xff08;LeetCode&#xff09; 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目的。 参考代码&#xff1a; class Solution { public:int minPathSum(vector<vector…

filezilla 刷新文件

ubuntu上的filezilla一直右键找不到文件刷新的选项&#xff0c;今天终于找到了 点击那个循环利用的按钮&#xff0c;就是刷新文件和文件夹&#xff0c;这个和mac上的操作有点不一致&#xff0c;很奇怪哈

PHP --- 基础(01)

简单介绍 &#xff08;1&#xff09;PHP基本语法操作 <?php $iphone13 5880; // 变量首字母不能是数字&#xff0c;同时变量区分大小写 $iphone12 5000; // 变量名尽量有意义 $shen $iphone13 $iphone12 echo $shen; // echo是在php中常用的输出、显示功能的命令 ?&…

使用 arpl 在 PVE 上安装黑群晖

arpl 是 GitHub 上开源的自动装载程序&#xff0c;能够实现使用 arpl 在物理机或虚拟机中安装黑群晖 1. 下载 arpl 在 GitHub 项目 fbelavenuto/arpl 的 Releases 中选择下载最新版本&#xff0c;选择 img.zip 后缀的文件进行下载 解压后可以得到一个名为 arpl.img 的文件&am…