【Spring】 核心概念:DI 依赖注入的几种方式

新博客:https://blog.bigdataboy.cn/article/443.html

setter 注入

setter 注入方式,就是 Spring 利用对象的set 方法,结合书写配置的规则进行注入

对象的格式

添加 set 方法

public class NameServiceImpl implements NameService {

    private NameDao nameDao;
    public String name;

    // 简单类型注入
    public void setName(String name) {
        this.name = name;
    }

    // 引用类型注入
    public void setNameDao(NameDao nameDao) {
        this.nameDao = nameDao;
    }

    public void save() {
        System.out.println(this.name + " service save ...");
        nameDao.getName();
    }
}

配置文件

<!--  管理对象  -->
<bean id="nameDao" class="cn.bigdataboy.dao.impl.NameDaoImpl"/>
<bean id="nameService" class="cn.bigdataboy.service.impl.NameServiceImpl">
    <!-- 引用类型写法 -->
    <property name="nameDao" ref="nameDao"/>
    <!-- 简单类型写法 -->
    <property name="name" value="bigdataboy"/>
</bean>

mark

例子代码:https://pan.bigdataboy.cn/s/n8RFW

构造器 注入

构造器的输入,不外乎需要注意参数是怎么注入的

对象格式

public class NameServiceImpl implements NameService {

    public NameDao nameDao;
    public String name;

    // 常规写法
    public NameServiceImpl(NameDao nameDao, String name) { 
        this.nameDao = nameDao;
        this.name = name;
    }

    public void save() {
        System.out.println(this.name + " service save ...");
        nameDao.getName();
    }
}

配置文件

构造器的注入,因为 解耦,所以有几种写法

    <!--  管理对象  -->
    <bean id="nameDao" class="cn.bigdataboy.dao.impl.NameDaoImpl"/>
    <bean id="nameService" class="cn.bigdataboy.service.impl.NameServiceImpl">
        <!--  这里的 name 是参数名称,这样还是耦合,所以还有其他写法  -->
        <constructor-arg name="nameDao" ref="nameDao"/>
        <constructor-arg name="name" value="bigdataboy"/>

        <!-- 通过类型匹配 -->
<!--        <constructor-arg type="cn.bigdataboy.dao.NameDao" ref="nameDao"/>-->
<!--        <constructor-arg type="java.lang.String" value="bigdataboy"/>-->

        <!-- 通过索引(参数位置) -->
<!--        <constructor-arg index="0" ref="nameDao"/>-->
<!--        <constructor-arg index="1" value="bigdataboy"/>-->
    </bean>

mark

例子代码:https://pan.bigdataboy.cn/s/XmVTK

依赖自动装配

要实现自动,那肯定是需要写法规范,不然框架也不知道你要怎么装

  • 自动装配是利用 set 方法实现的。
  • 自动装配只能引用类型进行装配不能简单类型进行装配
  • 自动和手动配置能搭配使用自动装配的优先级小于手动

五种自动装配模式

mark

byName

对象里的 set 方法的名字,需要与配置文件的 Bean id 相对应,不然会找不到。

mark

byType

这个模式就不需要 id 和 set 对应了

mark

例子代码:https://pan.bigdataboy.cn/s/254HZ

集合类型注入

集合类型的注入只是在配置文件的写法有区别,会有多个原素

对象的格式

public class NameServiceImpl implements NameService {

    private int[] array;

    private List<String> list;

    private Set<String> set;

    private Map<String, String> map;

    private Properties properties;

    public void setArray(int[] array) {
        this.array = array;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Override
    public void save() {
        System.out.println("array: " + Arrays.toString(this.array));
        System.out.println("list: " + this.list);
        System.out.println("set: " + this.set);
        System.out.println("map: " + this.map);
        System.out.println("properties: " + this.properties);
    }
}

配置文件

格式还是简单

 <bean id="nameService" class="cn.bigdataboy.service.impl.NameServiceImpl">
    <property name="array">
       <array>
           <value>100</value>
           <value>200</value>
       </array>
    </property>
    <property name="list">
        <list>
            <value>100</value>
            <value>200</value>
        </list>
    </property>
    <property name="set">
        <set>
            <value>100</value>
            <value>200</value>
        </set>
    </property>
    <property name="map">
        <map>
            <entry key="name" value="bigdataboy"></entry>
        </map>
    </property>
    <property name="properties">
        <props>
            <!-- 这个有点特殊 -->
            <prop key="name">bigdataboy</prop>
        </props>
    </property>
</bean>

mark

例子代码:https://pan.bigdataboy.cn/s/Y4jSb

发表评论 / Comment

用心评论~