• Spring(Spring的理解+DI+Spring的创建)


    目录

    1. Spring 是什么

    2. DI

    3. 面试题: IoC 和 DI 有什么区别?

    4. Spring 的创建

    5. 将 Bean (对象) 存储到 Spring (容器) 中

    6. 将 Bean (对象) 从 Spring (容器) 中取出来 

    7. 面试题: ApplicationContext 和 BeanFactory的区别

    8. getBean 更多用法


    1. Spring 是什么

    通常所说的 Spring 是 Spring Framework (Spring 框架), 

    用一句话来解释 Spring: Spring 是包含了众多工具方法的 IoC 容器

    那么什么是 IoC 容器? 

    先来理解看一下什么是容器: 容器是用来容纳某种物品的 (基本) 装置

    对比到前面的知识点,   目前接触到的容器有

    • List / Map -->  数据存储容器
    • Tomcat  -->  Web 容器

    Spring 也是一个容器, Spring 是一个 IoC 容器

    下面再看一下什么是 IoC ?

    IoC = Inversion of Control 翻译过来就是 "控制反转" 的意思, 也就是

    Spring 是一个 "控制反转" 的容器,

    ("控制反转":之前的控制权是在我身上,现在反转了,也就是我把控制权交出去了,交给框架了,下次我再要用X的时候,直接告诉框架,我要用X,而现在的X的生命周期和我没啥关系)

    IoC 优点: 实现代码的解耦; 对象 (Bean) 生命周期交给 IoC 框架来维护,作为程序员无需再关注了

    Spring IoC 容器最核心的功能:

    1. 将 Bean (对象) 储到 Spring (容器) 中
    2. 将 Bean (对象) 从 Spring (容器) 中出来 

    Spring 是一个 IoC 容器, 说的是对象的创建和销毁的权利都交给 Spring 来管理了, 它本身又具备了存储对象和获取对象的能力. 


    2. DI

    说到IoC 就要提到 "DI", DI 是 Dependency Injection 的缩写,翻译过来就是 "依赖注入" 的意思

    依赖:比如说A类中,需要用到B类,那就说A依赖B

    注入:将一个东西拿过来用就叫做注入

    合起来"依赖注入"的意思就是: 有 IoC 容器在运行期间,动态的将某种依赖关系注入到对象中.

    依赖注入的角度就是,通过引用 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦,所以DI 是一种实现


    3. 面试题: IoC 和 DI 有什么区别?

    IoC 是一种思想: 控制反转

    DI 是一种实现: 依赖注入 


    4. Spring 的创建

    (1) 创建一个 maven 项目

    输入项目名就可以了

    (2) 添加 spring 框架支持(spring-context/spring-beans)

    先配置镜像国内源

    1. <mirror>
    2. <id>alimaven</id>
    3. <name>aliyun maven</name>
    4. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    5. <mirrorOf>central</mirrorOf>
    6. </mirror>

    然后再添加Spring框架支持 

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframeworkgroupId>
    4. <artifactId>spring-contextartifactId>
    5. <version>5.2.3.RELEASEversion>
    6. dependency>
    7. <dependency>
    8. <groupId>org.springframeworkgroupId>
    9. <artifactId>spring-beansartifactId>
    10. <version>5.2.3.RELEASEversion>
    11. dependency>
    12. dependencies>

    (3) 创建一个启动类并添加 main


    5. 将 Bean (对象) 存储到 Spring (容器) 中

    存储 Bean 对象三步(两步)走

    1. 如果是第一次添加, 先在 spring 项目中添加配置文件
    2. 先创建一个 Bean 对象
    3. 在配置文件中将需要保存到 spring 中的 Bean 对象进行注册

    (1) 在 spring 项目中添加配置文件

    1. "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>

     (2) 创建一个 Bean 对象

    (3) 在配置文件中将需要保存到 spring 中的 Bean 对象进行注册

    id可以不等于 class 里面的类名,但是要尽量符合规范

    类名使用大驼峰, bean id 通常使用小驼峰. 

    假设类名是 UserInfo, 那么通常情况下 id 它应该是 userInfo 


    6. 将 Bean (对象) 从 Spring (容器) 中出来 

    获取并使用 Bean 对象,分为以下 3 步:
    1. 先得到 spring 上下文对象(ApplicationContext / BeanFactory)
    2. 再通过上下文对象提供的方法,获取需要使用的 bean 对象
    3. 可以使用 bean 对象
    1. import com.beans.UserBean;
    2. import org.springframework.context.ApplicationContext;
    3. import org.springframework.context.support.ClassPathXmlApplicationContext;
    4. public class app {
    5. public static void main(String[] args) {
    6. // 1. 得到 spring 上下文对象
    7. ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    8. // 2. 根据上下文对象提供的方法,获取需要使用的 bean 对象
    9. UserBean userBean = (UserBean) context.getBean("user");
    10. // 3. 可以使用 bean 对象
    11. userBean.sayHi("张三");
    12. }
    13. }
    1. import com.beans.UserBean;
    2. import org.springframework.beans.factory.BeanFactory;
    3. import org.springframework.beans.factory.xml.XmlBeanFactory;
    4. import org.springframework.context.ApplicationContext;
    5. import org.springframework.context.support.ClassPathXmlApplicationContext;
    6. import org.springframework.core.io.ClassPathResource;
    7. public class app {
    8. public static void main(String[] args) {
    9. // 1. 得到 spring 上下文对象
    10. BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
    11. // 2. 根据上下文对象提供的方法,获取需要使用的 bean 对象
    12. UserBean userBean = (UserBean) beanFactory.getBean("user");
    13. // 3. 可以使用 bean 对象
    14. userBean.sayHi("张三");
    15. }
    16. }
    1. package com.beans;
    2. //普通的 bean 对象
    3. public class UserBean {
    4. public void sayHi(String name) {
    5. System.out.println("你好:" + name);
    6. }
    7. }
    1. "1.0" encoding="UTF-8"?>
    2. "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. "user" class="com.beans.UserBean">

    7. 面试题: ApplicationContext 和 BeanFactory的区别

    相同点: ApplicationContext 和 BeanFactory 效果是⼀样的, 都可以实现从容器中获取 bean,都提供了 getBean 的方法.

    不同点:

    从继承关系和功能方面来看: BeanFactory 提供了基础的访问容器的能力,

    而 Application 属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能外,它还拥有独特的特性,还添加了对国际化支持,资源访问支持,以及事件传播等方面的支持.

    从性能方面来看: Application 是一次加载并初始化所有的 Bean 对象(饿汉方式),

    而 BeanFactory 是需要哪个才去加载哪个,所以更加的轻量(懒汉方式)


    8. getBean 更多用法

    (1) 使用 bean name 获取 bean

     (2) 根据 bean type 获取 bean

    (3) 根据 bean name 和类型获取 bean (推荐使用)

  • 相关阅读:
    Win10 update version 22H2
    TDD、BDD、ATDD都是什么、有什么区别?(下)
    学习笔记9--智能驾驶的功能安全设计之功能安全设计
    大数据Doris(十九):数据导入(Load)
    Java Map.put()有什么功能呢?(添加集合)
    AMD 显卡Radeon Super Resolution(Radeon显卡超分辨率) 功能,你开启了么?
    sql优化实操
    Spark SQL操作数据源
    Nginx
    apache和IIS区别?内网本地服务器项目怎么让外网访问?
  • 原文地址:https://blog.csdn.net/m0_58761900/article/details/128047547