【SSM详细教程】-03-Spring参数注入

精品专题:

01.《C语言从不挂科到高绩点》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12753294.html?spm=1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm=1001.2014.3001.5482

02. 《SpringBoot详细教程》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12789841.html?spm=1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12789841.html?spm=1001.2014.3001.548203.《SpringBoot电脑商城项目》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12752883.html?spm=1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12752883.html?spm=1001.2014.3001.548204.《VUE3.0 核心教程》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12769996.html?spm=1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12769996.html?spm=1001.2014.3001.5482

================================

|| 持续分享系列教程,关注一下不迷路 ||

|| 视频教程:小破站:墨轩大楼 ||

================================

在Spring IOC容器中,当我们需要向bean对象中注入参数时,可以一些参数注入的手段向指定属性中注入特定的值,本小节就带着大家一起看看参数注入的方式。

1. 注入基本值

<value /> 元素可以通过字符串来指定属性或构造器参数的值。容器将字符串从java.lang.String 类型转换为实际的属性或者参数类型后给Bean对象注入。

添加Hero类,定义好属性,并使用lombok添加get和set方法

java 复制代码
@Data
public class Hero {
    private String name;
    private String job;
    private String sex;
}

在applicationContext.xml中配置Hero的Bean

XML 复制代码
 <bean id="myHero" class="com.moxuan.spring01.day02.Hero">
      <property name="name">
          <value>孙悟空</value>
      </property>
      <property name="job">
          <value>打野</value>
      </property>
      <property name="sex" value="男"></property>
  </bean>

由上面配置可以看出,当要注入基本值时,可以使用<value> 元素注入,也可以使用value属性进行注入。注入后,测试代码如下:

java 复制代码
/**
* 测试注入基本值
 */
@Test
public void test01(){
    AbstractApplicationContext context =
            new ClassPathXmlApplicationContext("applicationContext.xml");
    Hero hero = context.getBean("myHero",Hero.class);
    System.out.println(hero);

}

运行效果:

2. 注入Bean对象

注入Bean对象,定义格式有内部Bean和外部Bean两种。

2.1 注入内部Bean对象

给英雄添加一个武器类

java 复制代码
/**
 * 武器类
 */
@Data
public class Weapon {
    String name;

    public Weapon(){
        this.name = "赤手空拳";
    }
}

给Hero添加Weapon类型的属性,作为英雄的武器。

java 复制代码
@Data
public class Hero {
    private String name;
    private String job;
    private String sex;
    private Weapon weapon;
}

在applicationContext.xml中使用内部Bean的方式,给Hero的weapon属性注入值

XML 复制代码
<bean id="myHero" class="com.moxuan.spring01.day02.Hero">
  <property name="name">
    <value>孙悟空</value>
  </property>
  <property name="job">
    <value>打野</value>
  </property>
  <property name="sex" value="男"></property>
  <property name="weapon">
    <!--            使用内部Bean对象注入-->
    <bean class="com.moxuan.spring01.day02.Weapon"></bean>
  </property>
</bean>

编写测试方法:

java 复制代码
@Test
public void test01(){
    AbstractApplicationContext context =
        new ClassPathXmlApplicationContext("applicationContext.xml");
    Hero hero = context.getBean("myHero",Hero.class);
    System.out.println(hero);

}

运行效果

2.2 注入外部Bean对象

修改applicationContext.xml如下

XML 复制代码
<!--配置武器Bean-->
<bean id="myWeapon" class="com.moxuan.spring01.day02.Weapon">
  <property name="name" value="金箍棒"></property>
</bean>
<bean id="myHero" class="com.moxuan.spring01.day02.Hero">
  <property name="name">
    <value>孙悟空</value>
  </property>
  <property name="job">
    <value>打野</value>
  </property>
  <property name="sex" value="男"></property>
  <!--ref引用外部Bean对象,通过外部Bean对象的id或者name属性值引用-->
  <property name="weapon" ref="myWeapon"></property>
  <!--        <property name="weapon">-->
  <!--            使用内部Bean对象注入-->
  <!--            <bean class="com.moxuan.spring01.day02.Weapon"></bean>-->
  <!--        </property>-->
</bean>

测试方法不变,运行效果如下图所示:

3. 注入集合

Spring容器可以通过<list/>,<set/>,<map/>以及<props/>元素来定义和设置与Java类型中对应List,Set,Map及Properties的属性。

3.1 注入list集合

首先给英雄添加技能列表,和toString方法,具体代码如下:

java 复制代码
package com.moxuan.spring01.day02;

import lombok.Data;

import java.util.List;

@Data
    public class Hero {
        private String name; // 名称
        private String job;  // 职业
        private String sex;  // 性别
        private Weapon weapon;  //武器
        private List<String> skills; // 技能列表

        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append("英雄名称:"+name+"\n");
            sb.append("英雄职业:"+job+"\n");
            sb.append("英雄性别:"+sex+"\n");
            sb.append("英雄武器:"+weapon.getName()+"\n");
            sb.append("英雄技能:\n");
            for (String skill :skills){
                sb.append("\t"+skill+"\n");
            }
            return sb.toString();
        }
    }

在applicationContext.xml中使用<list/> 为英雄对象注入技能列表:

XML 复制代码
<bean id="myHero" class="com.moxuan.spring01.day02.Hero">
  <property name="name">
    <value>孙悟空</value>
  </property>
  <property name="job">
    <value>打野</value>
  </property>
  <property name="sex" value="男"></property>
  <!--ref引用外部Bean对象,通过外部Bean对象的id或者name属性值引用-->
  <property name="weapon" ref="myWeapon"></property>
  <property name="skills">
    <list>
      <value>1技能:护身法咒</value>
      <value>2技能:斗战冲锋</value>
      <value>3技能:如意金箍</value>
      <value>被动技能:大圣神威</value>
    </list>
  </property>
</bean>

测试方法不变:

java 复制代码
 @Test
public void test01(){
    AbstractApplicationContext context =
            new ClassPathXmlApplicationContext("applicationContext.xml");
    Hero hero = context.getBean("myHero",Hero.class);
    System.out.println(hero);

}

3.2 注入set集合

首先给英雄添加克制英雄集合,restrainHeros,并在toString方法中添加克制英雄集合输出的代码,具体如下:

java 复制代码
package com.moxuan.spring01.day02;

import lombok.Data;

import java.util.List;
import java.util.Set;

@Data
public class Hero {
    private String name; // 名称
    private String job;  // 职业
    private String sex;  // 性别
    private Weapon weapon;  //武器
    private List<String> skills; // 技能列表
    private Set<String> restrainHeros;// 克制英雄集合

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("英雄名称:"+name+"\n");
        sb.append("英雄职业:"+job+"\n");
        sb.append("英雄性别:"+sex+"\n");
        sb.append("英雄武器:"+weapon.getName()+"\n");
        sb.append("英雄技能:\n");
        for (String skill :skills){
            sb.append("\t"+skill+"\n");
        }
        sb.append("克制英雄:\n");
        for(String hero:restrainHeros){
            sb.append("\t"+hero+"\n");
        }
        return sb.toString();
    }
}

在applicationContext.xml中使用<set>为克制英雄注入值,具体如下:

XML 复制代码
<!--克制英雄-->
<property name="restrainHeros">
  <set>
    <value>鲁班七号</value>
    <value>黄忠</value>
    <value>伽罗</value>
  </set>
</property>

测试代码不变,运行效果如下:

3.3 注入map集合

修改Hero类,添加关系链,并修改toString代码,如下:

java 复制代码
package com.moxuan.spring01.day02;

import lombok.Data;

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

@Data
public class Hero {
    private String name; // 名称
    private String job;  // 职业
    private String sex;  // 性别
    private Weapon weapon;  //武器
    private List<String> skills; // 技能列表
    private Set<String> restrainHeros;// 克制英雄集合
    private Map<String,String> relationship; // 关系链

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("英雄名称:"+name+"\n");
        sb.append("英雄职业:"+job+"\n");
        sb.append("英雄性别:"+sex+"\n");
        sb.append("英雄武器:"+weapon.getName()+"\n");
        sb.append("英雄技能:\n");
        for (String skill :skills){
            sb.append("\t"+skill+"\n");
        }
        sb.append("克制英雄:\n");
        for(String hero:restrainHeros){
            sb.append("\t"+hero+"\n");
        }
        sb.append("关系链:\n");
        Set<String> keys = relationship.keySet();
        for (String key:keys){
            sb.append("\t"+key+": "+relationship.get(key)+"\n");
        }
        return sb.toString();
    }
}

在applicationContext.xml中给关系链使用<map/>进行注入值。

XML 复制代码
  <!--关系网-->
  <property name="relationship">
      <map>
          <entry key="师傅" value="金蝉"></entry>
          <entry key="师弟" value="猪八戒"></entry>
          <entry key="cp" value="露娜"></entry>
          <entry key="大哥" value="牛魔"></entry>
     </map>
  </property>

测试代码不变,运行效果如下:

3.4 注入properties

首先给Hero类添加本局队友属性,并修改toString方法如下:

java 复制代码
package com.moxuan.spring01.day02;

import lombok.Data;

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

@Data
public class Hero {
    private String name; // 名称
    private String job;  // 职业
    private String sex;  // 性别
    private Weapon weapon;  //武器
    private List<String> skills; // 技能列表
    private Set<String> restrainHeros;// 克制英雄集合
    private Map<String,String> relationship; // 关系链
    private Properties team; // 团队成员

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("英雄名称:"+name+"\n");
        sb.append("英雄职业:"+job+"\n");
        sb.append("英雄性别:"+sex+"\n");
        sb.append("英雄武器:"+weapon.getName()+"\n");
        sb.append("英雄技能:\n");
        for (String skill :skills){
            sb.append("\t"+skill+"\n");
        }
        sb.append("克制英雄:\n");
        for(String hero:restrainHeros){
            sb.append("\t"+hero+"\n");
        }
        sb.append("关系链:\n");
        Set<String> keys = relationship.keySet();
        for (String key:keys){
            sb.append("\t"+key+": "+relationship.get(key)+"\n");
        }
        sb.append("本局队友:\n");
        Set<Object> friends = team.keySet();
        for (Object fr:friends){
            String frStr = (String)fr;
            sb.append("\t"+frStr+": "+team.getProperty(frStr));
        }
        return sb.toString();
    }
}

在applicationContext.xml使用<props> 为英雄Bean对象注入team属性值,具体如下:

XML 复制代码
 <!--本局队友-->
<property name="team">
    <props>
        <prop key="上路" >项羽</prop>
        <prop key="中路" >安其拉</prop>
        <prop key="下路" >后羿</prop>
        <prop key="辅助" >明世隐</prop>
    </props>
</property>

测试类不变,运行效果如下:

3.5 引用方式注入集合

注入集合的时候除了可以采用上面在Bean内部注入方式以外,也可以使用下面这种使用外部引用方式注入,修改applicationContext.xml如下:

XML 复制代码
<util:list id="skill_list">
  <value>1技能:护身法咒</value>
  <value>2技能:斗战冲锋</value>
  <value>3技能:如意金箍</value>
  <value>被动技能:大圣神威</value>
</util:list>

<util:set id="restrain_heros">
  <value>鲁班七号</value>
  <value>黄忠</value>
  <value>伽罗</value>
</util:set>

<util:map id="relationship_map">
  <entry key="师傅" value="金蝉"></entry>
  <entry key="师弟" value="猪八戒"></entry>
  <entry key="cp" value="露娜"></entry>
  <entry key="大哥" value="牛魔"></entry>
</util:map>

<util:properties id="team_props">
  <prop key="上路" >项羽</prop>
  <prop key="中路" >安其拉</prop>
  <prop key="下路" >后羿</prop>
  <prop key="辅助" >明世隐</prop>
</util:properties>

<bean id="ref_hero" class="com.moxuan.spring01.day02.Hero">
  <property name="name" value="孙悟空"></property>
  <property name="job" value="打野"></property>
  <property name="sex" value="男"></property>
  <!--ref引用外部Bean对象,通过外部Bean对象的id或者name属性值引用-->
  <property name="weapon" ref="myWeapon"></property>
  <!--通过外部list的id引入外部的list集合-->
  <property name="skills" ref="skill_list"></property>
  <!--通过外部set的id引入外部的set集合-->
  <property name="restrainHeros" ref="restrain_heros"></property>
  <!--通过外部map的id引入外部的map集合-->
  <property name="relationship" ref="relationship_map"></property>
  <!--通过外部properties的id引入外部的properties-->
  <property name="team" ref="team_props"></property>
</bean>

修改测试程序,使用id为ref_hero的bean创建对象,代码如下:

java 复制代码
@Test
public void test02(){
  AbstractApplicationContext context =
    new ClassPathXmlApplicationContext("applicationContext.xml");
  Hero hero = context.getBean("ref_hero",Hero.class);
  System.out.println(hero);

}

运行效果如图所示:

4. 注入Spring表达式

Spring引入了一种表达式语言,这和统一的EL在语法上很相似,这种表达式语言可以用于定义基于XML和注解配置的Bean,注入一个properties文件信息。

首先我们在项目的resources目录中新建一个weapon.properties文件,内容如下:

name="红莲斗篷"
price=1830
description="唯一被动-献祭:每秒对身边300范围的敌人造成(自身最大生命值2%)的法术伤害,对小兵额外造成(自身最大生命值2%)的法术伤害"

修改Weapon类如下,新增price和description两个属性,具体如下:

java 复制代码
package com.moxuan.spring01.day02;

import lombok.Data;

/**
 * 武器类
 */
@Data
public class Weapon {
    private String name;
    private int price;
    private String description;


    public Weapon(){
        this.name = "赤手空拳";
    }
}

修改applicationContext.xml文件,添加weapon的Bean,为属性分别注入值(使用Spring表达式)。具体如下:

XML 复制代码
<util:properties id="weapon_props" location="classpath:weapon.properties"></util:properties>
<bean id="weapon01" class="com.moxuan.spring01.day02.Weapon">
  <property name="name" value="#{weapon_props.name}"></property>
  <property name="price" value="#{weapon_props.price}"></property>
  <property name="description" value="#{weapon_props.description}"></property>
</bean>

添加测试方法,代码如下:

java 复制代码
@Test
public void test03(){
    AbstractApplicationContext context =
      new ClassPathXmlApplicationContext("applicationContext.xml");
    Weapon weapon = context.getBean("weapon01",Weapon.class);
    System.out.println(weapon);
}

运行效果如下所示:

5. 注入null或空字符串

Spring将属性的空参数当作空String,首先给Weapon添加一个专精英雄masteryHero属性,具体如下:

java 复制代码
package com.moxuan.spring01.day02;

import lombok.Data;

/**
 * 武器类
 */
@Data
public class Weapon {
    private String name;
    private int price;
    private String description;
    private String masteryHero;// 专精英雄


    public Weapon(){
        this.name = "赤手空拳";
    }
}

以下applicationContext.xml中给masteryHero设置了空String值:

XML 复制代码
<util:properties id="weapon_props" location="classpath:weapon.properties"></util:properties>
<bean id="weapon01" class="com.moxuan.spring01.day02.Weapon">
  <property name="name" value="#{weapon_props.name}"></property>
  <property name="price" value="#{weapon_props.price}"></property>
  <property name="description" value="#{weapon_props.description}"></property>
  <property name="masteryHero" value=""></property>
</bean>

运行效果如下图:

如果需要注入null值,可以使用<null/>元素,具体如下:

XML 复制代码
<util:properties id="weapon_props" location="classpath:weapon.properties"></util:properties>
<bean id="weapon01" class="com.moxuan.spring01.day02.Weapon">
  <property name="name" value="#{weapon_props.name}"></property>
  <property name="price" value="#{weapon_props.price}"></property>
  <property name="description" value="#{weapon_props.description}"></property>
  <property name="masteryHero" >
    <null/>
  </property>
</bean>

运行效果,如下图所示:

相关推荐
Rverdoser17 分钟前
RabbitMQ的基本概念和入门
开发语言·后端·ruby
dj244294570721 分钟前
JAVA中的Lamda表达式
java·开发语言
工业3D_大熊34 分钟前
3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理
java·c++·3d·docker·c#·制造·数据可视化
szc176738 分钟前
docker 相关命令
java·docker·jenkins
程序媛-徐师姐1 小时前
Java 基于SpringBoot+vue框架的老年医疗保健网站
java·vue.js·spring boot·老年医疗保健·老年 医疗保健
yngsqq1 小时前
c#使用高版本8.0步骤
java·前端·c#
尘浮生1 小时前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
小白不太白9501 小时前
设计模式之 模板方法模式
java·设计模式·模板方法模式
Tech Synapse1 小时前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
.生产的驴1 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构