目录
本篇文章主要详细介绍spring注入中基于set方法注入的形式,例如简单类型注入,外部bean和内部bea注入、级联属性注入、数据集合列表注入、特殊字符串注入以及空字符串注入等。
注意:以下所有的注入都是基于set方法注入,set注入必须提供set方法和无参构造器,否则会注入失败。
1、外部bean和内部bean注入
先准备2个类,在UserService中注入UserDao。


1.1 外部bean注入配置文件演示
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--定义一个外部bean,就是被注入的bean-->
<bean id="UserDaoBean" class="com.linctSpring6.dao.UserDao"></bean>
<!--哪个类需要引用其他bean,就在哪个类进行注入-->
<bean id="UserServiceBean" class="com.linctSpring6.service.UserService">
<!--set注入写法-->
<property name="userDao" ref="UserDaoBean"></property>
</bean>
</beans>
1.2 内部bean注入配置文件演示
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--哪个类需要引用其他bean,就在哪个类进行注入-->
<bean id="UserServiceBean" class="com.linctSpring6.service.UserService">
<!--set注入写法,注意:内部bean写法中,被注入的bean不需要写id-->
<property name="userDao">
<bean class="com.linctSpring6.dao.UserDao"></bean>
</property>
</bean>
</beans>
总结:内部bean的注入方式较为常用,请务必在需要引入其他bean的类上写set方法。set的方法名和property标签里面的name要对应(name的命名规范:set方法名去掉set其余的字母首字母小写)
2、简单注入类型
我们先自定义一个数据源类,现在我们要用配置文件的方式给这个数据源类注入数据。
(题外话:所有的数据源都要实现java规范,javax.sql.DataSource。
能够给你提供Connection对象的,都是数据源。
自定义数据源必须实现DataSource接口。)

配置属性写法
<!--哪个类需要引用其他bean,就在哪个类进行注入-->
<bean id="MyDataSourceBean" class="com.linctSpring6.config.MyDataSource">
<!--set注入写法,property标签是必须要写的。注入简单类型用value来定义-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/spring6"></property>
<property name="userName" value="root"></property>
<property name="password" value="123"></property>
</bean>
3、bean注入中有哪些类型是属于简单属性?
我们搜索BeanUtils这个类看源码,看看哪些是属于简单类型


我们把源码粘贴出来。以下这些类型在bean中都属于简单类型
return !isVoidType(type)
&& (isPrimitiveOrWrapper(type)
|| Enum.class.isAssignableFrom(type)
|| CharSequence.class.isAssignableFrom(type)
|| Number.class.isAssignableFrom(type)
|| Date.class.isAssignableFrom(type)
|| Temporal.class.isAssignableFrom(type)
|| ZoneId.class.isAssignableFrom(type)
|| TimeZone.class.isAssignableFrom(type)
|| File.class.isAssignableFrom(type)
|| Path.class.isAssignableFrom(type)
|| Charset.class.isAssignableFrom(type)
|| Currency.class.isAssignableFrom(type)
|| InetAddress.class.isAssignableFrom(type)
|| URI.class == type
|| URL.class == type
|| UUID.class == type
|| Locale.class == type
|| Pattern.class == type
|| Class.class == type);
注意:Date日期类型也是简单类型,但是注入的格式必须是按照规定的格式(如下图),否则会出问题
![]()
4、级联属性注入
我们写一个级联属性的样例:Student 和 ClassRoom ,看看学生是属于哪个班级
public class Student {
private String name;
public ClassRoom classRoom;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ClassRoom getClassRoom() {
return classRoom;
}
public void setClassRoom(ClassRoom classRoom) {
this.classRoom = classRoom;
}
}
public class ClassRoom {
private String classRoomName;
public String getClassRoomName() {
return classRoomName;
}
public void setClassRoomName(String classRoomName) {
this.classRoomName = classRoomName;
}
}
配置级联属性。注意 :配置的顺序不能颠倒,classRoom属性必须提供get方法
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
级联属性必须注意两点:
一:配置的顺序不能颠倒
二:classRoom属性必须提供getter方法
-->
<!--哪个类需要引用其他bean,就在哪个类进行注入-->
<bean id="StudentBean" class="com.linctSpring6.other.Student">
<!--set注入写法,name为简单属性,直接value注入-->
<property name="name" value="小林子"></property>
<!--classRoom为级联属性,需要先注入一个bean-->
<property name="classRoom" ref="classRoomBean"></property>
<!--"classRoom.classRoomName"调用的是Student类中的getClassRoomName-->
<!--所以在Student类中必须提供get方法-->
<property name="classRoom.classRoomName" value="高三一班"></property>
</bean>
<bean id="classRoomBean" class="com.linctSpring6.other.ClassRoom"></bean>
</beans>
5、数组的注入
5.1 简单类型数组注入
public class ArraySet {
private String[] name;
public String[] getName() {
return name;
}
public void setName(String[] name) {
this.name = name;
}
@Override
public String toString() {
return "ArraySet{" +
"name=" + Arrays.toString(name) +
'}';
}
}
配置文件
<bean id="ArraySetBean" class="com.linctSpring6.other.ArraySet">
<property name="name">
<array>
<value>name1</value>
<value>name2</value>
<value>name3</value>
</array>
</property>
</bean>
5.2 复杂类型数组注入
public class ArraySet {
private Student[] students;
public Student[] getStudents() {
return students;
}
public void setStudents(Student[] students) {
this.students = students;
}
}
配置文件
<bean id="ArraySetBean" class="com.linctSpring6.other.ArraySet">
<property name="students">
<array>
<ref bean="StudentBean1"></ref>
<ref bean="StudentBean2"></ref>
<ref bean="StudentBean3"></ref>
</array>
</property>
</bean>
<bean id="StudentBean1" class="com.linctSpring6.other.Student">
<property name="name" value="学生1"></property>
</bean>
<bean id="StudentBean2" class="com.linctSpring6.other.Student">
<property name="name" value="学生2"></property>
</bean>
<bean id="StudentBean3" class="com.linctSpring6.other.Student">
<property name="name" value="学生3"></property>
</bean>
6、list集合和Set集合注入
public class ListAndSet {
private List<String> list;
private Set<String> stringSet;
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Set<String> getStringSet() {
return stringSet;
}
public void setStringSet(Set<String> stringSet) {
this.stringSet = stringSet;
}
@Override
public String toString() {
return "ListAndSet{" +
"list=" + list +
", stringSet=" + stringSet +
'}';
}
}
配置文件
<bean id = "ListAndSetBean" class="com.linctSpring6.other.ListAndSet">
<property name="list">
<list>
<value>集合名1</value>
<value>集合名2</value>
<value>集合名3</value>
</list>
</property>
<property name="stringSet">
<set>
<value>set1</value>
<value>set2</value>
<value>set3</value>
</set>
</property>
</bean>
7、map集合注入
public class MapDemo {
private Map<String,String> map;
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "MapDemo{" +
"map=" + map +
'}';
}
}
配置文件
<bean id="MapDemoBean" class="com.linctSpring6.other.MapDemo">
<property name="map">
<map>
<!--如果key和value不是简单类型就用 <entry key-ref="" value-ref=""></entry> 这个配置-->
<!--如果key和value是简单类型就用 <entry key="" value=""></entry> 这个配置-->
<!--以下演示简单类型-->
<entry key="1" value="第一"></entry>
<entry key="2" value="第二"></entry>
<entry key="3" value="第三"></entry>
</map>
</property>
</bean>
8、properties注入
properties本质上也是一个Map集合
properties的父类Hashtable实现了Map接口
properties注入方式和Map有点像,但是properties的key和value只能是String类型
public class PropertiesDemo {
private Properties myProperties;
public Properties getMyProperties() {
return myProperties;
}
public void setMyProperties(Properties myProperties) {
this.myProperties = myProperties;
}
@Override
public String toString() {
return "PropertiesDemo{" +
"myProperties=" + myProperties +
'}';
}
}
配置文件
<bean id="PropertiesDemoBean" class="com.linctSpring6.other.PropertiesDemo">
<property name="myProperties">
<props>
<prop key="pro1">pro第一个</prop>
<prop key="pro2">pro第二个</prop>
<prop key="pro3">pro第三个</prop>
</props>
</property>
</bean>
9、null和空字符串注入
public class EmptyAndNullDemo {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "EmptyAndNullDemo{" +
"name='" + name + '\'' +
'}';
}
}
方式一:不给属性注入,即为null
<bean id="EmptyAndNullDemoBean" class="com.linctSpring6.other.EmptyAndNullDemo">
</bean>
方式二:注入空字符,得到的效果是name = "";
<bean id="EmptyAndNullDemoBean" class="com.linctSpring6.other.EmptyAndNullDemo">
<property name="name">
<value></value>
</property>
</bean>
方式三:手动注入null
<bean id="EmptyAndNullDemoBean" class="com.linctSpring6.other.EmptyAndNullDemo">
<property name="name">
<null></null>
</property>
</bean>
10、特殊符号注入
在xml配置当中,主要有5个特殊符号,分别是:< 、> 、' 、"、 &
方式一:使用转移字符代替特殊符号

方式二:将含有特有符号的字符串放到<![CDATA[]]>当中。因为方法到CDATA区中的数据不会被XML文件解析

以上就是我对spring根据set方法注入的理解啦,希望能帮到大家,有问题的地方欢迎大家一起讨论!
后续会不断更新作品,欢迎大家一起讨论学习。❤❤❤
:依赖注入--set注入专题--注入的方法总结,注意事提醒以及代码演示(简单类型、外部bean和内部bean、级联属性、数据集合列表、特殊字符串以及空字符串的注入)&spm=1001.2101.3001.5002&articleId=144446994&d=1&t=3&u=1abd70d647754efaa53d51f10c805b55)
5618

被折叠的 条评论
为什么被折叠?



