精品专题:
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 核心教程》课程详细笔记
================================
|| 持续分享系列教程,关注一下不迷路 ||
|| 视频教程:小破站:墨轩大楼 ||
================================
在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>
运行效果,如下图所示: