Spring DI 属性注入

本文深入解析Spring框架中的依赖注入(DI)概念,包括set方法注入、构造方法注入及自动装配机制。通过实例演示如何配置不同类型的属性注入,如基本类型、集合类型及引用类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将IOC创建的对象,交于Spring管理,在创建对象的过程中Spring可以依据配置对对象的属性进行设置,这个过程称之为依赖注入,也即DI。

set方法注入:

通常的javabean属性都会私有化。而对外暴露setXxx()getXxx()方法,此时spring可以通过这样的setXxx()方法将属性进行注入对象。

a.Spring内置的可直接注入类型的注入:

以每个类型的注入方式举例:

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

   24

   25

   26

   27

   28

   29

   30

   31

   32

   33

   34

   35

   36

   37

   38

   39

   40

 

public class Hero {

        private int id;

        private String name;

        private List<String> jobs;

        private Set<String> set;

        private Map<String,String> map;

        private Properties prop;

        

        public void setId(int id) {

                this.id = id;

        }

 

        public void setName(String name) {

                this.name = name;

        }

 

        public void setJobs(List<String> jobs) {

                this.jobs = jobs;

        }

 

        public void setSet(Set<String> set) {

                this.set = set;

        }

 

        public void setMap(Map<String, String> map) {

                this.map = map;

        }

 

        public void setProp(Properties prop) {

                this.prop = prop;

        }

 

        @Override

        public String toString() {

                return "Hero [id=" + id + ", name=" + name + ", jobs=" + jobs

                                + ", set=" + set + ", map=" + map + ", prop=" + prop + "]";

        }

}

 <bean id="hero" class="cn.tedu.beans.Hero">

                <property name="id" value="123"></property>

                <property name="name" value="亚瑟 "></property>

                <property name="jobs">

                        <list>

                                <value>上单</value>

                                <value>打野</value>

                                <value>辅助</value>

                                <value>中单</value>

                        </list>

                </property>

                <property name="set">

                        <set>

                                <value>aaa</value>

                                <value>bbb</value>

                                <value>ccc</value>

                                <value>aaa</value>

                        </set>

                </property>

                <property name="map">

                        <map>

                                 <entry key="addr" value="王者荣耀"></entry>

                                 <entry key="addr" value="英雄联盟"></entry>

                                 <entry key="skill" value="风火轮"></entry>

                                 <entry key="age" value="19"></entry>

                        </map>

                </property>

                <property name="prop">

                        <props>

                                <prop key="k1">v1</prop>

                                <prop key="k2">v2</prop>

                                <prop key="k3">v3</prop>

                                <prop key="k4">v4</prop>

                        </props>

                </property>

        </bean>

也可以通过ref关键字进行外配置bean外设置好的bean。

 

基于构造方法的注入:

对象属性设置的另一种方式是在对象创建的过程中通过构造方法的传入并设置对象的属性。

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

package cn.tedu.beans;

 

public class Student {

        private int id;

        private String name;

        private Dog dog;

        

        public Student(int id, String name, Dog dog) {

                this.id = id;

                this.name = name;

                this.dog = dog;

        }

 

        @Override

        public String toString() {

                return "Student [id=" + id + ", name=" + name + ", dog=" + dog + "]";

        }

}

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

 <bean id="student" class="cn.tedu.beans.Student">

                <!--

                        index:为构造方法的第几个参数 进行配置

                        name:为构造方法的哪个名字的参数进行配置

                             **index 和 name 可以配置任何一个或同时配置 但要求一旦配置必须正确

                             **推荐优先使用index方式配置 防止没有源码造成name无法匹配到对应参数

                        type:该构造方法参数的类型

                        value:该构造方法参数的值 ,用来指定基本值

                        ref:该构造方法参数的值,用来指定引用其他bean的值

                 -->

                <constructor-arg index="0" name="id" value="999"/>

                <constructor-arg index="1" type="java.lang.String" value="张无忌"/>

                <constructor-arg name="dog" ref="dog"/>

        </bean>

        

        <bean id="dog" class="cn.tedu.beans.Dog"></bean>

        

</beans>

自动装配:

在Spring的set方式实现注入的过程中,支持自动装配机制,所谓自动装配机制,会根据要设置的javabean属性的名字 或 类型到spring中自动寻找对应的id或类型的<bean>进行设置,从而省去依次配置的过程,简化了配置。

自动装配关键字:

autowire:

属性:

byName根据javabean中需要注入的属性的名字,在Spring容器中找对应的id<bean>将该<bean>的对象赋值给当前属性

byType根据javaBean中需要注入的属性的类型,在Spring容器中找到对应class类型的<bean>将该<bean>赋值给当前属性。

**注:byType是根据class进行匹配,可能匹配到多个bean,抛出异常,建议使用byName

 <bean id="teacher" class="cn.tedu.beans.Teacher" autowire="byName"></bean>

        <bean id="dog" class="cn.tedu.beans.Dog"></bean>

        <bean id="cat" class="cn.tedu.beans.Cat"></bean>

开启全局自动装配:

default-autowire="byName" 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值