当前位置: 首页 > article >正文

spring(三):如何通过配置文件实现依赖注入(DI)?set方法注入和构造器方法注入两种方式代码演示,两种注入方式的注意事项以及本质区别。

目录

1、代码总体演

2、set注入代码演示

3、构造方法注入

方法一:根据index索引来指定构造器参数下标

方法二:根据构造器的参数名字来配置传入的参数

方法三:不指定下标以及参数名

4、set注入和构造注入本质区别


本文章主要讲解Spring如何通过配置文件实现依赖注入(DI),通过代码演示详细介绍了set方法注入和构造器方法注入两种方式,两种注入方式的注意事项以及本质区别。

1、代码总体演示

我们定义了3个接口,对应3个实现类。其中UserServiceImpl类同时调用了StudentDao接口、UserDao接口里面被实现的方法,代码如下:

UserService接口以及实现类UserServiceImpl

public interface UserService {
    String deleteMan(String name);
}
public class UserServiceImpl implements UserService {
    private UserDao userDao;

    private StudentDao studentDao;

    public UserServiceImpl(UserDao myParamUser,StudentDao myParamStudent) {
        this.userDao = myParamUser;
        this.studentDao = myParamStudent;
    }


    @Override
    public String deleteMan(String name) {
        System.out.println("准备调用删除的dao层");
        userDao.delete();
        studentDao.deleleStudent();
        return name + "用户被删除了!";
    }
}

UserDao接口以及实现类UserDaoImpl

public interface UserDao {

    void delete();
}
public class UserDaoImpl implements UserDao {


    @Override
    public void delete() {
        System.out.println( "正在删除用户数据");
    }
}

StudentDao接口以及实现类StudentDaoImpl

public interface StudentDao {

    void deleleStudent();
}
public class StudentDaoImpl implements StudentDao {

    @Override
    public void deleleStudent() {
        System.out.println("学生信息被删除了");
    }
}

2、set注入代码演示

set方法注入,那一定要写set方法

set注入方法中,我们的set方法是可以自定义命名的,配置的时候要把自定义set方法的方法名和配置的name对应上。

配置文件中的name命名规范:自定义的set方法名去掉set,剩下的单词首字母小写。

<?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 id="userDaoImplBean" class="com.linctSpring6.dao.impl.UserDaoImpl"></bean>
    <bean id="StudentDaoBean" class="com.linctSpring6.dao.impl.StudentDaoImpl"></bean>

    <bean id="userServieImplDao" class="com.linctSpring6.Service.impl.UserServiceImpl">
        <property name="userDao" ref="userDaoImplBean"/>
        <property name="studentDao" ref="StudentDaoBean"/>
    </bean>

</beans>

在哪个bean中注入,写到哪个bean标签中。

配置property标签

ref指定需要注入的bean的id

name指set方法的方法名,例如本案例是setUserDao(去掉set这三个字母,剩下的单词首字母小写)

 我们写一个测试方法来测试set方法注入bean

  @Test
    public void testDISet(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springConfig.xml");
        UserServiceImpl userServieImplDao = applicationContext.getBean("userServieImplDao", UserServiceImpl.class);
        userServieImplDao.deleteMan("qq");
    }

可以看到我们控制台的打印,能完美实现set方法注入

注意:set方法注入一定必须要写无参构造方法

3、构造方法注入

构造方法注入那一定就要先写一个构造方法

方法一:根据index索引来指定构造器参数下标

根据索引下标指定构造器参数的传入

<?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 id="userDaoImplBean" class="com.linctSpring6.dao.impl.UserDaoImpl"></bean>
    <bean id="StudentDaoBean" class="com.linctSpring6.dao.impl.StudentDaoImpl"></bean>

    <bean id="userServieImplBean" class="com.linctSpring6.Service.impl.UserServiceImpl">
        <!--使用构造器的方法实现bean注入-->
        <!--根据索引下标指定构造器参数的传入-->
        <constructor-arg index="0" ref="userDaoImplBean"></constructor-arg>
        <constructor-arg index="1" ref="StudentDaoBean"></constructor-arg>
    </bean>



    <bean id="nowTime" class="java.util.Date"></bean>

</beans>

方法二:根据构造器的参数名字来配置传入的参数

根据构造器的参数名字来配置传入的参数,参数名字自己定义

<?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 id="userDaoImplBean" class="com.linctSpring6.dao.impl.UserDaoImpl"></bean>
    <bean id="StudentDaoBean" class="com.linctSpring6.dao.impl.StudentDaoImpl"></bean>

    <bean id="userServieImplBean" class="com.linctSpring6.Service.impl.UserServiceImpl">
        <!--使用构造器的方法实现bean注入-->
        <!--根据构造器的参数名字来配置传入的参数,参数名字自己定义-->
        <constructor-arg name="myParamUser" ref="userDaoImplBean"></constructor-arg>
        <constructor-arg name="myParamStudent" ref="StudentDaoBean"></constructor-arg>
    </bean>



    <bean id="nowTime" class="java.util.Date"></bean>

</beans>

方法三:不指定下标以及参数名

让spring自己根据类型匹配判断是构造器的第几个参数

spring会自动根据类型来判断把ref注入给哪个参数

<?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 id="userDaoImplBean" class="com.linctSpring6.dao.impl.UserDaoImpl"></bean>
    <bean id="StudentDaoBean" class="com.linctSpring6.dao.impl.StudentDaoImpl"></bean>


    <bean id="userServieImplBean" class="com.linctSpring6.Service.impl.UserServiceImpl">
        <!--不指定下标以及参数名,让spring自己根据类型匹配判断是构造器的第几个参数-->
        <!--spring会自动根据类型来判断把ref注入给哪个参数-->
        <constructor-arg ref="StudentDaoBean"></constructor-arg>
        <constructor-arg ref="userDaoImplBean"></constructor-arg>

    </bean>



    <bean id="nowTime" class="java.util.Date"></bean>

</beans>

我们写一个测试方法来测试以上三种bean的注入配置


    @Test
    public void testDIByConstruct(){
        //这行代码只要一执行,相当于启动了spring容器,解析springConfig.xml文件,并且实例化所有的bean对象,放到spring容器当中。
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springConfig.xml");
        UserService userServieImplBean = applicationContext.getBean("userServieImplBean", UserService.class);
        userServieImplBean.deleteMan("小林");

    }

可以看到我们控制台的打印,能完美实现构造器的注入
 

注意:构造方法注入可以不写无参构造方法

4、set注入和构造注入本质区别

set注入是在创建完对象之后,再调用set方法才注入的(所以需要无参构造方法,因为创建对象默认就是通过反射调用无参构造方法创建的)

构造注入是在创建对象的同时注入的,因为创建对象的本质就是调用构造方法(所以构造注入在创建对象时调用的是有参构造方法并且同时注入配置的bean,也能得出为什么构造注入不需要无参构造方法)

以上就是我对spring实现依赖注入的2种方法(set注入、构造器注入)的理解啦,希望能帮到大家,有问题的地方欢迎大家一起讨论!

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


http://www.kler.cn/a/445562.html

相关文章:

  • RFdiffusion Sampler类 sample_step 方法解读
  • 楚慧杯-Web
  • 简单工厂模式和策略模式的异同
  • 计算机工作流程
  • 【STM32 Modbus编程】-作为主设备写入多个线圈和寄存器
  • 电气设计 | 低压接地系统:TN-C 、TN-S、TN-C-S、TT适用哪些场所?
  • 用 Python 实现井字棋游戏
  • Visual Studio Code 快捷键
  • 12.6深度学习_经典神经网络_LeNets5
  • java 选择排序,涵盖工作原理、算法分析、实现细节、优缺点以及一些实际应用场景
  • 如何将多张图片合并为一个pdf?多张图片合并成一个PDF文件的方法
  • 海思芯片 交叉编译curl
  • mysql面试核心概念
  • 网络攻防章节测验
  • 解决QT制作的软件,全屏显示后最小化,点击任务栏图标打开时不是全屏而是窗口状态的问题
  • 【C#】预处理指令
  • 【JAVA】JAVA泛型的<T>一时在前面一时在很后面怎么理解
  • 基于海思soc的智能产品开发(巧用mcu芯片)
  • Mybatis映射关系
  • 【C++】sophus : rxso3.hpp 实现了 3D 空间中的旋转和缩放操作的 RxSO3 类 (二十一)
  • 利用PHP和phpSpider进行图片爬取及下载
  • SpringBoot+Vue3实现阿里云视频点播 实现教育网站 在上面上传对应的视频,用户开会员以后才能查看视频
  • 【信息系统项目管理师】高分论文:论信息系统项目的进度管理(人力资源管理系统)
  • 基于Python3编写的Golang程序多平台交叉编译自动化脚本
  • AlipayHK支付宝HK接入-商户收款(PHP)
  • Java-29 深入浅出 Spring - IoC 基础 启动IoC容器的方式 Java方式与Web(XML、配置)方式