spring专题笔记(四):依赖注入--set注入专题--注入的方法总结,注意事提醒以及代码演示(简单类型、外部bean和内部bean、级联属性、数据集合列表、特殊字符串以及空字符串的注入)

目录

1、外部bean和内部bean注入

1.1 外部bean注入配置文件演示

1.2 内部bean注入配置文件演示

2、简单注入类型

3、bean注入中有哪些类型是属于简单属性?

4、级联属性注入

5、数组的注入

5.1 简单类型数组注入

5.2 复杂类型数组注入

6、list集合和Set集合注入

7、map集合注入

8、properties注入

9、null和空字符串注入

10、特殊符号注入


本篇文章主要详细介绍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方法注入的理解啦,希望能帮到大家,有问题的地方欢迎大家一起讨论!

后续会不断更新作品,欢迎大家一起讨论学习。❤❤❤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值