DI依赖注入

本文详细介绍了Spring框架中的DI(Dependency Injection)依赖注入,包括概念、set注入(主流)、构造器注入以及集合注入。重点讲解了set注入的步骤和应用场景,并提及了p命名空间、springEL表达式、外部properties文件、import导入配置文件等内容。

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

5、DI依赖注入

1、概念

IOC:控制反转,从容器的角度考虑,spring容器控制资源,并给到别的应用程序资源。

DI:依赖注入,从应用程序的角度考虑,它是被IOC容器注入资源的,这也就叫依赖注入。

  • 依赖:bean对象的创建依赖于容器
  • 注入:bean对象中的所有属性,由容器来注入

请添加图片描述

2、依赖注入的两种方式

  • set注入
  • 构造器注入
1、set注入–属性注入(主流)请添加图片描述

主要是注入引用数据类型

1、将要注入的到别的地方的类注册到spring容器当中

2、将要被注入的类注册到spring容器当中,并且这个类中要有成员变量,然后又set方法

3、在要被注入的类的bean中注册property属性,然后name=set的名字开头小写,id就是这个要注册到别的地方的这个类的id

应用场景:业务层需要使用dao层的方法,传统的做法就是创建对象,在spring中就不一样了,是把这两个类都注册到spring中,然后给一个成员变量和set,接着把这个类的id和成员的name写进去。

UserDao

package com.zhu.dao;

public interface UserDao {

    public void add();

}

UserDaoImpl

package com.zhu.dao;

public class UserDaoImpl implements UserDao{
    private String name;


    public void add() {
        System.out.println("这个添加方法运行了...");
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

UserService

package com.zhu.service;

public interface UserService {

    public void add();

}

UserServiceImpl

package com.zhu.service;

import com.zhu.dao.UserDao;

public class UserServiceImpl implements UserService{
    //这里业务层要调用dao层的类,以前是直接创建对象使用,这里使用spring容器的set注入
    private UserDao userDao;
    private int num;

    @Override
    public void add() {
        System.out.println("service 跑起来了");
        userDao.add();
        System.out.println(num);
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

applicationContext.xml

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--1、将方法这个类配置到spring容器当中,目的:让spring帮我们创建java对象
       id:配置一个唯一标识
       class:设置类的全类名,spring会利用反射技术调用类的无参构造创建对象
-->
    <bean id="userDaoImpl" class="com.zhu.dao.UserDaoImpl">
<!--        设置属性值-->
        <property name="name" value="你妈买菜必涨价"></property>
    </bean>

<!--    我们要往这个类中注入别的类,所以我们的类中要有成员变量,然后往这个成员变量中set这个类
    ref:引用数据类型,也就是要注入的这个类的bean的id
-->
    <bean id="userService" class="com.zhu.service.UserServiceImpl">
        <property name="userDao" ref="userDaoImpl"></property>
        <property name="num" value="333"></property>
    </bean>
</beans>

Test

package com.zhu.test;

import com.zhu.dao.UserDaoImpl;
import com.zhu.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

    public static void main(String[] args) {

        //2、加载spring容器
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        //3、从spring容器中获取bean资源,获取到的也就是这个类的对象
        UserServiceImpl userService = (UserServiceImpl) context.getBean("userService");
        userService.add();

    }

}

2、构造器注入(了解)

构造器注入和set注入类似

name:适用于任何时候(最好用)

type:适用于类型不一样的时候(几乎用不到)

index:根据下标给属性设置值(鸡肋)如果定义好了之后,再往构造方法里面加值,整个坐标就会被打乱,所以说这个属性很垃圾,别用!!!!

请添加图片描述

  <constructor-arg ref="conversionService"></constructor-arg>
 <constructor-arg name="num" value="11"></constructor-arg>
        <constructor-arg name="name" value="hell0"></constructor-arg>

请添加图片描述

3、集合注入

简单,就像注入属性一样。

请添加图片描述

<bean id="student" class="com.zhu.Student">
        <property name="a" value="1"></property>
        <property name="b" value="22"></property>
        <property name="c" value="1.1"></property>
        <property name="d" value="奥利给"></property>
        <property name="arrayList">
           <list>
               <value>name</value>
               <value>age</value>
           </list>
        </property>
<!--        数组拷贝list的格式也能用-->
        <property name="arr">
            <array>
                <value>1111</value>
                <value>2</value>
            </array>
        </property>
            <property name="properties">
            <props>
                <prop key="username">root</prop>
                <prop key="password">123456</prop>
            </props>
        </property>
    </bean>

6、p命名空间(了解)

请添加图片描述

7、springEL表达式(了解)

使用EL表达式:ref就可以改成value了

value="#{userDao}"

了解即可,没啥用请添加图片描述

8、外部properties文件

jdbc的外部文件

请添加图片描述

命名空间这里需要修改很多

<!--  1、  加载命名空间的支持:xmlns:context="http://www.springframework.org/schema/context"-->

<!--    2、加载配置文件-->
    <context:property-placeholder location="classpath*:jdbc.properties"/>

    <bean id="student" class="com.zhu.Student" >

        <property name="password" value="${username}"></property>
        <property name="userName" value="${pwd}"></property>

9、import导入配置文件

原因:好几个人同时维护一个spring容器,会出现很多问题

解决:使用主和副配置文件解决,一个文件是主文件,后面的副文件都挂在主文件上面

<!--导入别的spring容器-->
    <import resource="applicationContext-user.xml"/>

请添加图片描述

  • spring容器也可以加载多个配置文件(了解,不会写)

请添加图片描述

请添加图片描述

10、ClassPathXmlApplicationContext对象

了解即可

11、第三方bean的配置方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值