Spring之DI(依赖注入)

以你之姓@ 2024-03-17 11:23 143阅读 0赞

依赖注入(DI)是一个过程,在这个过程中,对象仅通过构造函数参数、工厂方法的参数或在对象被实例化后通过属性设置来定义它们的依赖项(即与该对象一起工作的其他对象)。然后,容器在创建 bean 时注入这些依赖项。这个过程基本上是与对象直接通过构造类或等机制来控制其依赖项的实例化或位置是相反的,因此得名控制反转。// 对象不直接创建自己,而是通过 Spring 容器创建,那么 Spring 容器是如何创建对象的?

使用 DI 原则,代码会更简洁,当对象具有依赖关系时,也能更有效的解耦。对象不检索它的依赖项,也不知道依赖项的具体类或者位置。因此,你的类将变得更容易测试,特别是当依赖关系建立在接口或者抽象基类上时,他们的子类或者模拟实现将允许在单元测试中被使用。// 依赖注入最大的好处,就是代码可以解耦合变得更加简洁

DI 主要有两种变体:基于构造函数的依赖注入和基于 Setter 方法的依赖注入

基础环境

1.创建Module

在这里插入图片描述

2.引入依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>spring</artifactId>
  7. <groupId>com.biem</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>DI</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework</groupId>
  19. <artifactId>spring-context</artifactId>
  20. <version>5.3.3</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>junit</groupId>
  24. <artifactId>junit</artifactId>
  25. <version>4.12</version>
  26. <scope>test</scope>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.projectlombok</groupId>
  30. <artifactId>lombok</artifactId>
  31. <version>1.18.12</version>
  32. </dependency>
  33. </dependencies>
  34. </project>

3. 创建实体类com.biem.spring.pojo.User.java

  1. package com.biem.spring.pojo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. /**
  6. * ClassName: User
  7. * Package: com.biem.spring.pojo
  8. * Description:
  9. *
  10. * @Create 2023/5/25 18:07
  11. * @Version 1.0
  12. */
  13. @Data
  14. @NoArgsConstructor
  15. @AllArgsConstructor
  16. public class User {
  17. private int id;
  18. private String name;
  19. private String password;
  20. }

4. 创建applicationContext.xml配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. </beans>

4. 测试com.biem.spring.test.UserTest.java文件

  1. package com.biem.spring.test;
  2. import com.biem.spring.pojo.User;
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6. /**
  7. * ClassName: UserTest
  8. * Package: com.biem.spring.test
  9. * Description:
  10. *
  11. * @Create 2023/5/25 18:13
  12. * @Version 1.0
  13. */
  14. public class UserTest {
  15. }

基于构造函数的依赖注入

元素用于构造方法的注入,且定义时不分顺序,只需要通过name属性指定值即可。还提供了type属性用于指定参数类型,以避免字符串和基本类型的混淆。

实例

1.applicationContext.xml添加

  1. <bean id="user1" class="com.biem.spring.pojo.User">
  2. <constructor-arg name="id" value="1"></constructor-arg>
  3. <constructor-arg name="name" value="张三"></constructor-arg>
  4. <constructor-arg name="password" value="123456"></constructor-arg>
  5. </bean>

2. com.biem.spring.test.UserTest.java添加

  1. @Test
  2. public void testConstructorDI(){
  3. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  4. User user = context.getBean("user1", User.class);
  5. System.out.println("user = " + user);
  6. }

3.输出结果

在这里插入图片描述

基于 Setter 方法的依赖注入

setter方法注入是通过元素,元素过name属性指定值。

实例

1.applicationContext.xml添加

  1. <bean id="user2" class="com.biem.spring.pojo.User">
  2. <property name="id" value="2"></property>
  3. <property name="name" value="李四"></property>
  4. </bean>

2. com.biem.spring.test.UserTest.java添加

  1. @Test
  2. public void testSetterDI(){
  3. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  4. User user = context.getBean("user2", User.class);
  5. System.out.println("user = " + user);
  6. }

3.输出结果

在这里插入图片描述

Null值处理

  1. <property name="name">
  2. <null />
  3. </property>

name的值是null

  1. <property name="name" value="null"></property>

name的值是字符串null

应用:简单登录系统

1.com.biem.spring.dao.UserDao.java

  1. package com.biem.spring.dao;
  2. /**
  3. * ClassName: UserDao
  4. * Package: com.biem.spring.dao
  5. * Description:
  6. *
  7. * @Create 2023/5/25 19:45
  8. * @Version 1.0
  9. */
  10. public interface UserDao {
  11. public boolean login(String name, String password);
  12. }

2.com.biem.spring.dao.impl.UserDaoImpl.java

  1. package com.biem.spring.dao.impl;
  2. import com.biem.spring.dao.UserDao;
  3. /**
  4. * ClassName: UserDaoImpl
  5. * Package: com.biem.spring.dao.imp
  6. * Description:
  7. *
  8. * @Create 2023/5/25 19:46
  9. * @Version 1.0
  10. */
  11. public class UserDaoImpl implements UserDao {
  12. @Override
  13. public boolean login(String name, String password) {
  14. if(name.equals("张三") && password.equals("123")){
  15. return true;
  16. }
  17. return false;
  18. }
  19. }

3.com.biem.spring.service.UserService.java

  1. package com.biem.spring.service;
  2. /**
  3. * ClassName: UserService
  4. * Package: com.biem.spring.service
  5. * Description:
  6. *
  7. * @Create 2023/5/25 21:29
  8. * @Version 1.0
  9. */
  10. public interface UserService {
  11. public boolean login(String username, String password);
  12. }

4.com.biem.spring.service.impl.UserServiceImpl.java

  1. package com.biem.spring.service.impl;
  2. import com.biem.spring.dao.UserDao;
  3. import com.biem.spring.service.UserService;
  4. /**
  5. * ClassName: UserServiceImpl
  6. * Package: com.biem.spring.service.impl
  7. * Description:
  8. *
  9. * @Create 2023/5/25 21:31
  10. * @Version 1.0
  11. */
  12. public class UserServiceImpl implements UserService {
  13. UserDao userDao;
  14. public void setUserDao(UserDao userDao){
  15. this.userDao = userDao;
  16. }
  17. @Override
  18. public boolean login(String username, String password) {
  19. return userDao.login(username, password);
  20. }
  21. }

5.编写applicationContext.xml配置文件

  1. <bean id="userDao" class="com.biem.spring.dao.impl.UserDaoImpl"></bean>
  2. <bean id="userService" class="com.biem.spring.service.impl.UserServiceImpl">
  3. <property name="userDao" ref="userDao"/>
  4. </bean>

6.编写测试方法

  1. @Test
  2. public void login(){
  3. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  4. UserService user = context.getBean("userService", UserService.class);
  5. boolean flag = user.login("张三","123");
  6. if(flag){
  7. System.out.println("登录成功");
  8. } else {
  9. System.out.println("登录失败");
  10. }
  11. }

在这里插入图片描述

  1. @Test
  2. public void login(){
  3. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  4. UserService user = context.getBean("userService", UserService.class);
  5. boolean flag = user.login("张三","1234");
  6. if(flag){
  7. System.out.println("登录成功");
  8. } else {
  9. System.out.println("登录失败");
  10. }
  11. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,143人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringDI(依赖注入)

    依赖注入(DI)是一个过程,在这个过程中,对象仅通过构造函数参数、工厂方法的参数或在对象被实例化后通过属性设置来定义它们的依赖项(即与该对象一起工作的其他对象)。然后,容器在创

    相关 Spring---DI依赖注入

    上一篇介绍了关于IOC的内容:IOC称为控制反转,简单来说就是讲对象的创建的权利以及对象的生命周期的管理过程交给Spring容器来管理,从此在开发的过程中不需要关注对象的创建以

    相关 Spring依赖注入DI

    开头语:本文是我整理网上各种资料后整合而成的一篇文章。文中涉及到了代码重构、面向接口编程、持久化和工厂设计模式的内容。 1. Spring是什么?