• Spring框架学习 -- 核心思想


    目录

    (1) Spring是什么?

    (2) 什么是IOC容器?

    (3) 从传统开发认识spring

    (4) 这种传统开发的缺陷

    (5)解决传统开发中的缺陷

    (6) 对比总结规律

    (7) 理解IOC 


    创作不易多多支持


    (1) Spring是什么?

            我们常说的Spring的全称是: Spring Framework(Spring框架), 它是一个开源的框架, 有着活跃而且庞大的社区, 这就是它之所以能长久不衰的原因, Spring 支持广泛的应用场景, 他可以让java企业级的应用程序开发变得非常简单

            用一句话概括就是, Spring是包含了众多工具方法的IOC容器

    (2) 什么是IOC容器?

            想到容器我们就可以和java的集合体系来做对比, 集合体系里面, 就拿list类来讲, list里面设置泛型之后就可以存放对应的数据, 相同的包括我们曾经使用的tomcat也是如此, tomcat是一个web应用程序的容器, 它负责将webApp发布到网络.

    (3) 从传统开发认识spring

             假如我们要构建一辆车的程序, 我们可以思考一下, 一辆车需要以下这几个部件:

    • 车身(Framework)
    • 底盘(Bottom)
    • ......(中间还可以有很多部件,这里只列举几个即可)
    • 轮胎(Tire)

            上面的三个部件(车身, 底盘, 轮胎) 构成一辆车, 形成了下面的流程图:  

             从上图可以看出构建一辆车需要依赖于车身, 构建车身又要依赖于底盘, 相同的, 构建底盘也要依赖于轮胎, 这样层层依赖, 最终我们可以类比此过程来 简单用代码实现这个过程:

    1. public class NewCarExample {
    2. public static void main(String[] args) {
    3. Car car = new Car();
    4. car.init();
    5. }
    6. /**
    7. * 汽⻋对象
    8. */
    9. static class Car {
    10. public void init() {
    11. // 依赖⻋身
    12. Framework framework = new Framework();
    13. framework.init();
    14. }
    15. }
    16. /**
    17. * ⻋身类
    18. */
    19. static class Framework {
    20. public void init() {
    21. // 依赖底盘
    22. Bottom bottom = new Bottom();
    23. bottom.init();
    24. }
    25. }
    26. /**
    27. * 底盘类
    28. */
    29. static class Bottom {
    30. public void init() {
    31. // 依赖轮胎
    32. Tire tire = new Tire();
    33. tire.init();
    34. }
    35. }
    36. /**
    37. * 轮胎类
    38. */
    39. static class Tire {
    40. // 尺⼨
    41. private int size = 30;
    42. public void init() {
    43. System.out.println("轮胎尺⼨:" + size);
    44. }
    45. }
    46. }

    (4) 这种传统开发的缺陷

             以上过程的轮胎尺寸是固定的, 然而随着对车的需求量的增大, 不同需求的轮胎尺寸孕育而生, 为了满足日益增长的个性化需求, 就需要加工多种不同的轮胎尺寸, 这个时候针对不同的尺寸就需要对上面的代码进行修改了:

    1. public class NewCarUpdateExample {
    2. public static void main(String[] args) {
    3. Car car = new Car(20);
    4. car.run();
    5. }
    6. /**
    7. * 汽⻋对象
    8. */
    9. static class Car {
    10. private Framework framework;
    11. public Car(int size) {
    12. framework = new Framework(size);
    13. }
    14. public void run() {
    15. // 依赖⻋身
    16. framework.init();
    17. }
    18. }
    19. /**
    20. * ⻋身类
    21. */
    22. static class Framework {
    23. private Bottom bottom;
    24. public Framework(int size) {
    25. bottom = new Bottom(size);
    26. }
    27. public void init() {
    28. // 依赖底盘
    29. bottom.init();
    30. }
    31. }
    32. /**
    33. * 底盘类
    34. */
    35. static class Bottom {
    36. private Tire tire;
    37. public Bottom(int size) {
    38. tire = new Tire(size);
    39. }
    40. public void init() {
    41. // 依赖轮胎
    42. tire.init();
    43. }
    44. }
    45. /**
    46. * 轮胎类
    47. */
    48. static class Tire {
    49. // 尺⼨
    50. private int size;
    51. public Tire(int size) {
    52. this.size = size;
    53. }
    54. public void init() {
    55. System.out.println("轮胎尺⼨:" + size);
    56. }
    57. }
    58. }

            从(3)到(4) 的代码变换过程中可以看出: 当底层的业务逻辑改变之后, 相应的调用链上的代码全部都得修改. 

    (5)解决传统开发中的缺陷

            如何解决上面的问题?  我们可以尝试不在每个l类中创建下级类, 如果创建下级类, 就会出现, 下级类发生改变操作的时候, 自己也要跟着修改.

            此时, 我们只需要将原来由自己创建的下级类, 改为传递的方式, 因为我们不需要在当前类中创建下级类了, 此时即使下级类发生改变(增加或者减少函数的参数), 当前类本身也无序修改任何代码, 这样就完成了程序的解耦.

            关于解耦:  耦合也就是各个模块之间的关联程度, 关联程度越高, 其耦合就越大, 他们之间相互的影响就越大, 解耦就是指解决代码的耦合性, 好的代码的耦合性是很低的, 也就是代码之间简单地实现了解耦.  

            解耦就好比我们要打造一辆完整的汽车, 如果所有的配件都是自己造的, 那么当客户需求发生改变的时候, 比如轮胎的尺寸不是原来自己造出来的尺寸了, 就需要重新修改尺寸, 如果我们把轮胎外包出去, 那么即使是轮胎尺寸发生改变, 我们只需要向代理厂商下订单就可以了, 我们自身不需要花费力气去修改轮胎尺寸.

            基于上面的思想我们修改代码如下:

    1. public class IocCarExample {
    2. public static void main(String[] args) {
    3. Tire tire = new Tire(20);
    4. Bottom bottom = new Bottom(tire);
    5. Framework framework = new Framework(bottom);
    6. Car car = new Car(framework);
    7. car.run();
    8. }
    9. static class Car {
    10. private Framework framework;
    11. public Car(Framework framework) {
    12. this.framework = framework;
    13. }
    14. public void run() {
    15. framework.init();
    16. }
    17. }
    18. static class Framework {
    19. private Bottom bottom;
    20. public Framework(Bottom bottom) {
    21. this.bottom = bottom;
    22. }
    23. public void init() {
    24. bottom.init();
    25. }
    26. }
    27. static class Bottom {
    28. private Tire tire;
    29. public Bottom(Tire tire) {
    30. this.tire = tire;
    31. }
    32. public void init() {
    33. tire.init();
    34. }
    35. }
    36. static class Tire {
    37. private int size;
    38. public Tire(int size) {
    39. this.size = size;
    40. }
    41. public void init() {
    42. System.out.println("轮胎:" + size);
    43. }
    44. }
    45. }
            代码经过以上调整,⽆论底层类如何变化,整个调⽤链是不⽤做任何改变的,这样就完成了代码之间的解耦,从⽽实现了更加灵活、通⽤的程序设计了.

    (6) 对比总结规律

    • 在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire
    • 改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car
            我们发现了⼀个规:通⽤程序的实现代码,类的创建顺序是反的,传统代码是 Car 控制并创建了Framework,Framework 创建并创建了 Bottom,依次往下,⽽改进之后的控制权发⽣的反转,不再是上级对象创建并控制下级对象了,⽽是下级对象把注⼊将当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想.

    (7) 理解IOC 

            回到我们的spring中, 我们刚开始就说过, Spring是包含了多个工具方法的IOC容器 , 这就是对spring的核心总结, 集成了多个工具方法的例子将会在后面的章节进行讲解, 那么我们下面来看看如何理解Spring是ioc容器这句话?

            既然spring是一个ioc容器, 那么我们的重点应该还放在容器二字上面, 也就是他具备两个功能:

    1. 将对象存入到容器
    2. 从容器中取出对象

            也就是说spring最核心的功能就是学习如何将一个对象存入到spring中去, 再从spring容器中取出的过程.

            我们可以类比生产工具的时候, 将对象存储在ioc容器也就相当于将以后所有可能用到的工具全部制作好放到仓库中, 用的时候直接取就行了, 用完再把他放回仓库, 而new对象的操作就相当于每次使用的时候现做, 用完就扔了也不会保存, 下次用的时候还得重新去做, 这就是ioc容器和普通程序开发的区别. 

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



  • 相关阅读:
    02-风控风险分类
    vue3.0 01 项目的创建与setup组合式写法的基本使用 watch与watchEffect基本用法
    【机器学习】037_暂退法
    开发阶段部署
    Visual Studio Code(VSCode)软件相关(安装、用法、工具等)
    索尼 toio™ 应用创意开发征文互动小企鹅
    2022UUCTF--WEB
    Java多态调用成员的特点
    [SpringBoot]基于jasypt-spring-boot-starter对配置加解密
    CSDN 成为开放原子开源基金会黄金捐赠人,共建中国十万亿技术大生态
  • 原文地址:https://blog.csdn.net/niceffking/article/details/134518919