【Spring5】IOC容器与解耦合(中)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 文章目录1 IOC的概念与刨析1.1 IOC简介1.2 IOC底层原理1.3 IOC容器1.3.1 何为容器?1.3.2 IOC容器的理解2 IOC操作Bean管理2.1 Bean管理2.2 Bean管理xml形式2.2.1 创建对象与注入过程2.2.2 注入空值和特殊符号2.2.3 注入属性2.2.3.1 外部bean与内部bean2.2.3.2 注入集合2.3 工厂Bean2.4 Bean的作用域2.5 Bean的生命周期2.6 xml自动装配(偷懒的技巧)

2.在spring配置文件配置对象创建与属性注入。

<?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="book" class="com.hxh.Book">
        <!--set属性注入-->
        <!--使用property完成属性注入-->
        <property name="bname" value="Java程序设计"></property>
        <property name="bauthor" value="Spring5开发实践"></property>
    </bean>
</beans>

3.测试

  @Test
    public void testBook(){
        //1.加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        //2.获取配置创建的对象
        Book book = context.getBean("book", Book.class);
        //3.输出相关信息
        book.testDemo();
    }


演示使用有参构造注入属性


1.首先,创建一个类,在类中提供相应的有参构造方法。以Srudent类为例!

public class Student {
    private String sname;
    //有参构造
    public Student(String sname) {
        this.sname = sname;
    }
    //方便测试
    public void testDemo(){
        System.out.println("sname = " + sname);
    }
}

2.在spring配置文件配置对象创建与属性注入。

<?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="student" class="com.hxh.Student">
        <constructor-arg name="sname" value="黄小黄"></constructor-arg>
    </bean>
</beans>

3.测试。(其实和set注入大同小异,往后xml配置文件就不再赘述了)

    @Test
    public void testStudent(){
        //1.加载Spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
        //2.获取配置的对象
        Student student = context.getBean("student", Student.class);
        //3.输出相关信息
        student.testDemo();
    }


2.2.2 注入空值和特殊符号

以2.2.1演示的book类为例,演示代码如下:

    <!--配置对象创建-->
    <bean id="book" class="com.hxh.Book">
        <!--注入空值-->
        <property name="bname">
            <null/>
        </property>
        <!--注入特殊符号-->
        <property name="bauthor">
            <value>
                <![CDATA[<><><><><>....具体值]]>
            </value>
        </property>
    </bean>

注入特殊符号除了以上的方式,还可以使用转移符号。


2.2.3 注入属性

2.2.3.1 外部bean与内部bean

创建两个类,一个接口UserDao,对应的实现关系及内部方法如下图所示:


此时如果想在UserService里调用UserDaoImpl中的方法该怎么做?


传统方式如下图:


在Spring中可以通过配置实现:

1.在UserServie中创建UserDao类型的属性,并生成对应的set方法,方便注入(2.2.1演示过,这里不再赘述)。

2.在配置文件中进行配置。注意ref属性需要与被注入的bean id保持一致(参照的bean)!

    <!--service和dao对象创建-->
    <bean id="userService" class="com.ithxh.spring5.service.UserService">
        <!--注入userDao对象
            name属性值:类里面属性名称
            ref属性:创建userDao对象bean标签的id值
        -->
        <property name="userDao" ref="userDao"></property>
    </bean>
    <bean id="userDao" class="com.ithxh.spring5.dao.UserDaoImpl"></bean>
相关文章
|
8天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
23 2
|
8天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
16 1
|
1月前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
20天前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
22天前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
44 0
|
2月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
35 0
|
2月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
36 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
76 0
|
2月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
51 0