• Spring


    目录

    Spring

    Spring是一个IoC容器

    DI

    Spring使用


    Spring

    广义的 Spring:Spring 技术栈

    广义上的 Spring 泛指以 Spring Framework 为核心的 Spring 技术栈。

    经过十多年的发展,Spring 已经不再是一个单纯的应用框架,而是逐渐发展成为一个由多个不同子项目(模块)组成的成熟技术,例如 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等,其中 Spring Framework 是其他子项目的基础。

    狭义的 Spring:Spring Framework

    狭义的 Spring 特指 Spring Framework,通常我们将它称为 Spring 框架。

    Spring是一个IoC容器

    什么是IoC:(Inversion of Control,IoC),表示“控制反转”,指把创建对象过程交给 Spring 进行管理。

    我们创建一台车:

    1. public class demo {
    2. class car {
    3. //创建一辆车 依赖于车身
    4. public void init() {
    5. Carbody carbody = new Carbody();
    6. carbody.init();
    7. }
    8. }
    9. class Carbody {
    10. //构建车身 依赖于底座
    11. public void init() {
    12. Buttom buttom = new Buttom();
    13. buttom.init();
    14. }
    15. }
    16. class Buttom {
    17. public void init() {
    18. Tire tire = new Tire();//构建底座,依赖于车胎
    19. tire.init();
    20. }
    21. }
    22. class Tire {
    23. private int size = 30;
    24. public void init() {
    25. System.out.println(size);
    26. }
    27. }
    28. public static void main(String[] args) {
    29. demo.car car = new demo().new car();
    30. car.init();
    31. }
    32. }

    按照这种方式写,程序的耦合性是很高的,我们现在增加一个需求:客人要自己传入轮胎的大小,要求在主函数中传入参数,就导致所有类的init()方法都要修改,程序的耦合性过高

    我们对这个程序,解耦合

    1. public class demo {
    2. class car {
    3. //创建一辆车 依赖于车身
    4. private Carbody carbody;
    5. public car(Carbody carbody) {
    6. this.carbody = carbody;
    7. }
    8. public void init() {
    9. carbody.init();
    10. }
    11. }
    12. class Carbody {
    13. //构建车身 依赖于底座
    14. private Buttom buttom;
    15. public Carbody(Buttom buttom) {
    16. this.buttom = buttom;
    17. }
    18. public void init() {
    19. buttom.init();
    20. }
    21. }
    22. class Buttom {
    23. private Tire tire;
    24. public Buttom(Tire tire) {
    25. this.tire = tire;
    26. }
    27. public void init() {
    28. tire.init();
    29. }
    30. }
    31. class Tire {
    32. private int size;
    33. public Tire(int size) {
    34. this.size = size;
    35. }
    36. public void init() {
    37. System.out.println(size);
    38. }
    39. }
    40. public static void main(String[] args) {
    41. demo demo = new demo();
    42. demo.Tire tire = demo.new Tire(3);
    43. demo.Buttom buttom = demo.new Buttom(tire);
    44. demo.Carbody carbody = demo.new Carbody(buttom);
    45. demo.car car = new demo().new car(carbody);
    46. car.init();
    47. }
    48. }

    对比发现:传统代码中是:car类调用carbody类,carbody类调用buttom类,buttom类调用tire类

    改后的代码是:Tire类作为参数传入buttom类,buttom类作为参数传入carbody类,carbody类作为参数传入car类,控制权发生了反转,下级的生命周期不再由上级控制,下级类做出改变之后,对上级的影响不是太大,这就是控制反转

    IoC:将对象(Bean)的控制权交给IoC容器,对象的生命周期由IoC容器管理

    Spring是一个IoC容器,对象的销毁与创建交给Spring管理,创建好的对象存入Spring,随用随取,用完了放回Spring

    DI

    DI(Dependency Injections),意为"依赖注入",说的是IoC容器在运行期间,动态的将依赖关系注入到对象之中,也就是说,DI和IoC是在不同层次上描述的同一个事件,IoC容器,通过依赖注入的方式,实现程序解耦

    IoC可以说是思想,DI是具体实现

    Spring使用

    1、创建maven,在pom.xml引入Spring框架的依赖

    1. <dependencies>
    2. <dependency>
    3. <!--上下文-->
    4. <groupId>org.springframework</groupId>
    5. <artifactId>spring-context</artifactId>
    6. <version>5.2.3.RELEASE</version>
    7. </dependency>
    8. <!--管理对象-->
    9. <dependency>
    10. <groupId>org.springframework</groupId>
    11. <artifactId>spring-beans</artifactId>
    12. <version>5.2.3.RELEASE</version>
    13. </dependency>
    14. </dependencies>

    2、创建java类(创建Bean对象)

    1. public class Demo {
    2. public void print(String name){
    3. System.out.println(name);
    4. }
    5. }

    3、在resoures下创建Spring的配置文件

    resoures下创建文件spring-config.xml:文件内容

    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>

    将bean对象交给Spring框架

    根据键值对的形式,id是键值对的key,class是键值对的value

    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. <bean id="demo" class="Demo"></bean>
    6. </beans>

    4、获取并使用Bean对象

    1、得到Spring上下文对象

    2、根据上下文对象 获取类对象

    3、使用类对象

    1. public class Use {
    2. public static void main(String[] args) {
    3. //1、获取上下文对象 传入配置文件的名称
    4. ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    5. //2、获取bean对象
    6. Demo demo = (Demo) context.getBean("demo");//传入配置文件的id
    7. //3、使用对象
    8. demo.print("zs");
    9. }
    10. }

    在第二步,我们不是new对象的,new对象,对象的生命周期取决于代码,使用Spring,对象的生命周期取决于Spring;实现了控制权反转,并且实现了解耦。

    1、通过上下文对象获取Bean对象时,可以有三种格式

    1. Demo demo = (Demo) context.getBean("demo");//传入配置文件的id
    2. Demo demo = context.getBean(Demo.class);
    3. Demo demo=context.getBean("demo",Demo.class);
    • 第一种,根据id获取,要进行强制类型转化
    • 第二种,根据类获取,但是如果这个类被在配置文件中注册了多次,这样就不知道要拿到哪一个注册信息,会报错
    • 第三种,根据id和类获取,确保了唯一性,也不用强转

    2、我们在获取上下文对象时,可以使用两种方法:

    ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    

    还有一种是使用BeanFactory。

    BeanFactory是一个接口,Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离。常用的BeanFactory 实现有DefaultListableBeanFactory 、 XmlBeanFactory 、 ApplicationContext等。XmlBeanFactory已经被弃用了

    1. public class Use {
    2. public static void main(String[] args) {
    3. //1、获取上下文对象 传入配置文件的名称
    4. BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
    5. //2、获取bean对象
    6. Demo demo = factory.getBean("demo", Demo.class);
    7. //3、使用对象
    8. demo.print("ww");
    9. }
    10. }

    那么:BeanFactory和ApplicationContext的区别是啥

    1、两个都可以从容器中获取对象

    2、ApplicationContext是BeanFactory的子类,不仅拥有父类的方法,还有一些额外的扩展

    3、BeanFactory是按需加载,也就是懒汉模式,ApplicationContext是全部加载,也就是饿汉模式

    1. public class Demo {
    2. public Demo() {
    3. System.out.println("Demo");
    4. }
    5. public void print(String name){
    6. System.out.println(name);
    7. }
    8. }
    1. public class Text {
    2. public Text() {
    3. System.out.println("Text");
    4. }
    5. }

     

     在获取上下文对象时,加载对象,一个是按需加载,一个是全部加载

  • 相关阅读:
    操作系统OS/存储管理/内存管理/内存管理的主要功能_基本原理_要求
    linux中 ~ / . ..分别表示什么
    基于Echarts实现可视化数据大屏高速综合管控大数据
    浅谈pytorch中的nn.Sequential(*net[3: 5])是啥意思
    maven使用时候出现,jdk1.5的情况的解决办法
    我眼中的大数据(三)——MapReduce
    每日一题 494目标和(0-1背包)(灵神笔记)
    牛逼啊!使用 Redis 实现一个轻量级的搜索引擎
    怎么裁剪视频时长?手把手教你裁剪
    android studio提示HAXM device is not found或者could not start avd
  • 原文地址:https://blog.csdn.net/m0_58342797/article/details/126814333