首页 > 其他分享 >Spring自学日志01-IOC(控制翻转)

Spring自学日志01-IOC(控制翻转)

时间:2022-10-03 12:44:15浏览次数:73  
标签:装配 容器 01 1.2 Spring Bean IOC

目录

一、IOC的基本概念和底层原理

1.1、什么是IOC?

(1)控制翻转,把对象的创建和对象之间相互调用的的过程交给Spring IOC容器来管理

(2)降低代码之间的耦合

1.1.1、Spring IOC容器

Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。
Bean缓存池:HashMap实现


图1

Spring 通过一个配置文件描述 Bean 及 Bean 之间的依赖关系,利用 Java 语言的反射功能实例化 Bean 并建立 Bean 之间的依赖关系。 Spring 的 IoC 容器在完成这些底层工作的基础上,还提供了 Bean 实例缓存、生命周期管理、 Bean 实例代理、事件发布、资源装载等高级服务。

1.2、IOC底层原理

1.2.1、IOC容器

Spring 的IOC容器长什么样呢?其实Spring 作者设计了两个接口用以表示容器。分别是BeanFactoryApplicationContext

  • BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身是整个IOC最底层的接口。也是ApplicationContext接口继承的源头;
  • ApplicationContext 面向使用Spring框架的开发者几乎所有的应用场合我们都直接使ApplicationContext 而非底层的 BeanFactory

1.2.2、IOC容器装配Bean的方式

IOC有两种装配Bean的方式: 依赖查找(DL)依赖注入(DI)

  1. 依赖注入(DI)是Spring 最主要的使用方式。主要使用两种方式setter()方法注入构造函数注入
  2. 依赖查找(DL)Spring也支持但是不推荐使用(主要是博主也不会) ,因为他需要用户自己去是使用 API 进行查找资源和组装对象。具有侵入性

1.2.3、IOC容器装配Bean的操作

SpringIOC容器装配Bean有4种方式:

  • XML配置
  • 注解
  • JavaConfig
  • 基于Groovy DSL配置(工作中很少使用)

总的来说:Spring在日常工作中主要使用XML注解,其中注解这种方式占大头!

1.2.3.1、基于XML

假设有类User.java

package com.User;

/**
 * @description:
 * @author: 陈声铭
 * @time: 2022/9/18 16:21
 */
public class User {
    private String name;

    public User(String name) {
        System.out.println("有参构造");
        this.name = name;
    }

    public User() {
        System.out.println("无参构造");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("Set函数");
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}

假设有配置文件beans.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 http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--无参构造创对象
    类型 变量名 = new 类型();
    Hello hello =new Hello();
    id = 变量名
    class = new 的对象
    property相当于给对象中的属性设值!
    -->
    <bean id="user" class="com.User.User">
        <property name="name" value="陈声铭"/>
    </bean>


</beans>

我们就可以借助Xml装配Bean

import com.User.User;
import com.util.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


/**
 * @description:
 * @author: 陈声铭
 * @time: 2022/9/18 16:27
 */
public class MyTest {

    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/beans.xml");
        System.out.println(applicationContext.getBean("user"));

    }
}

可以看到

  1. User对象的创建是通过构造函数注入
  2. Name属性的添加是通过setter()方法注入

这就是Spring-IOC通过依赖注入(DI)装配Bean的方式

1.2.3.2、基于注解

注解分两类装配注解注入注解

装配注解:@Component 、@Service、@Controller、@Repository

注入注解:@Autowired(根据类型注入)、@Qualifier(根据id注入)

1.2.4、IOC容器装配Bean的作用域

IOC容器装配Bean的作用域

  1. 默认是singleton,即单例模式,是Spring装配Bean默认的模式。容器在启动时,自动实例化所有singleton的Bean并缓存与容器中。这样做有一个好处,当程序运行时使用到bean时从直接缓存中读取,提高了运行效率。装配流程参考 图1
  2. prototype,Spring容器启动时不会实例化prototype的bean。每次从容器调用bean时都会创建一个新的对象。
  3. request,每次http请求都会创建一个对象(工作中极少使用)
  4. session,同一个session共享一个对象(工作中极少使用)
  5. global-session(工作中极少使用)

标签:装配,容器,01,1.2,Spring,Bean,IOC
From: https://www.cnblogs.com/csmCode/p/16732690.html

相关文章

  • Shiro-01-简单实例
    文章目录​​1.Shiro介绍​​​​2.Shiro与SpringSecurity的对比​​​​3.基本功能​​​​4.Shiro原理​​​​5.Shiro的shiro.ini​​​​6.简单实例​​​​7.身......
  • SpringSecurity异常处理器
    原理在SpringSecurity中,在认证或者授权的过程中出现的异常会被ExceptionTranslationFilter捕获到,在ExceptionTranslationFilter中会去判断这异常是认证失败还是授权失败产......
  • 第一季:10简单的谈一下SpringMVC的工作流程【Java面试题】
    第一季:10简单的谈一下SpringMVC的工作流程【Java面试题】​​前言​​​​推荐​​​​第一季:10简单的谈一下SpringMVC的工作流程​​​​题目​​​​分析​​​​最后​​......
  • 01 入门 | 数据结构与算法
    1.数据数据:数据是指对客观事物进行记录并且可以可以鉴别的抽象符号数据元素:数据的基本单位,在计算机当中作为一个整体考虑数据对象:具有相同性质的数据元素的集合数据......
  • Spring基础(十四):Spring的事务回顾
    文章目录​​Spring的事务回顾​​​​一、事务的概念​​​​二、事务的特性​​​​1、原子性​​​​2、一致性​​​​3、隔离性​​​​4、持久性​​​​三、事务的并......
  • 01背包&完全背包二维写法的对比,进而理解一维优化后的正逆序
    01背包题解完全背包题解二维写法时两种背包问题核心代码的区别:可以看出,01背包用的是上一层的数据,完全背包用的是当前层的数据所以优化为一维时,01背包需逆序for......
  • Spring Lombok 实体类死循环问题
    在SpringJPA1对多查询的时候出现死循环的问题。如下图所示:  所有的配置都是正确的的,就是没有办法获得数据,并且出现死循环问题和解决因为使用lombak的 @Data......
  • spring boot 自定义线程池与使用
    一、进行线程池创建importcn.hutool.core.thread.ThreadFactoryBuilder;importlombok.extern.slf4j.Slf4j;importorg.springframework.aop.interceptor.AsyncUncaug......
  • SpringBoot--解决子线程无法获得HttpServletRequest的attribute的问题
    ​简介    本文介绍解决SpringBoot子线程无法获得HttpServletRequest的attribute的问题。    在SpringBoot请求中,如果创建了子线程获取request的attribute,......
  • SpringBoot--手动校验@NotBlank、@NotNull等的工具类
    ​简介说明        本文介绍手动校验@NotBlank、@NotNull等的工具类。    使用场景:controller接口的入参很多,需要他人提供,但他人提供的类的字段很多,字段都......