Spring入门核心理解(心法篇)用你听得懂的方式告诉你Spring是什么

学习思维:

学新东西!我喜欢从三个方向去处理这个知识:

1.这个东西是用来干什么的?

2.这个东西怎么用?

3.使用前,使用后有什么区别?

善用百度:

首先我们去百度百科看看这个是什么?

百度百科

spring框架

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。(不用纠结其中专业的名词)

思考:

用我们已经学到的东西,当我们开发一个软件时,你是否觉得太慢?那么我们就该多人合作!

可是,有一个问题:我们如何用一个方法保证我们代码互相看懂,且如何分工?

所以我们现在就学习Spring 来规范我们开发时候的问题

Spring

我们没学过Spring之前肯定听说过:

Spring是一个轻量级的控制反转(IoC)面向切面(AOP)的容器框架。

轻量级代表什么?  IOC是什么?   AOP又是什么?

轻量级:spring给用户提供的服务完全有用户自己决定,spring想用什么服务自己开启使用。但是重量级的都是只要你用就把所有的服务都给你,不能自己定制。

哦!原来是指它提供的服务是否能自己决定!

控制反转(IOC)

IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。

一个给初学者的tip,不要看它的名字,我们只管干什么的、有什么用!

于是法外狂徒张三直接上图!

                                       图一

 ​​​​​​​

                                      图二

 如上图:如果按图一:

你可以理解这就是正向控制,程序员控制整个过程,你需要写许许多多冗余的代码。

用户调用add方法时,程序员需要new对象,还要把接收的name数据设置进去,多么繁琐,而且一旦方法复杂起来,非常不好管理。每次都修改controller里的源代码,维护成本高

如图二:

现在我使用一个叫IOC容器的东西(先不管怎么实现),它能自动创建对象,设置属性,并放到controller需要的位置。我们仅仅只需要给IOC提供class模板。代码少写很多,并且当我想多传一个属性(id)给student时,也只需要改动模板,不会改动controller。

控制反转 ,就是程序员不在管理对象的创建,赋值等....都由这个第三方IOC容器自己搞。

Spring Bean容器 和 DI依赖注入:

bean是什么? 

Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象。

我说到底,其实也刚刚入门,我以一个小白的角度看:一切我们写的class(student,studentDAO,studentMapper)都是bean(若以后成为大牛一定回来更正)

我们执行所用到的class,都以一个个bean存入缓存中,这样才能调用

 Bean容器:就是Spring把一些可能会用到的bean先实例化,方便用户需要时,Spring调用。

当一个Bean长这样,Grilfriend 这个属性也是一个Bean,是不是也该实例化呢?

实例化这个属性Bean(Grilfriend)就是依赖注入DI,Spring会造一个女朋友给你,并且在这里注入进去

整个bean创建到注入的过程被称作自动装配

public class Student {
    String name;
    Grilfriend grilfriend;
}

那么Spring怎么Bean实例化依赖注入DI的呢? 还记得反射吗?哈哈哈哈,Spring通过反射,把对象给搞出来然后放到容器里!!(这里不着重讲解反射,不懂的小伙伴自行学习)

理解IOC和DI:

其实IOC和DI都只是为了解决同一个问题的不同角度。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。(这句话如果不理解,那你一定还没写过Spring的代码

AOP面向切面编程:

AOP我认为是Spring的一个难点,但剖析对比,就很简单了

AOP:当程序运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。敲小黑板:AOP是编程思想。 )

public class controller {
    
    @Resource
    Service service;

    public void selectService(){
        service.select();
    }
}
===================================分界线===========================================
public class controller {
    public void selectService(){
        log();
        service.select();
    }
}
===================================分界线===========================================
public class controller {
    public void selectService(){
        log();
        service.select();
        selectCorret();
    }
}

老板:帮我做一个查询                                                      张三:好了

一个月后----------

老板:查询上加个日志功能                                             张三:哦(早不告诉我)

六个月后--------

老板:再加一个筛选功能                                              张三:那么久了,代码都忘了,加个锤子!

代码需要重复迭代,如果没有一个很好的机制来规范,每次加功能我们都要改已经写好的代码。

AOP切面就是解决这个问题!  再来看这段话

AOP:当程序运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。敲小黑板:AOP是编程思想。 )

现在我们大概知道AOP是用来对代码进行加强更新的,但是好像不是用改源代码的方法!

我现在写一个这样的配置:(下面是自己模拟的AOP配置只为简单明确)

 试试看一下,log 和selectCorrect我们写成一个类,注入到容器中

用aop:config 配置切入点是哪个方法,切入在前还是在后 把二者关系绑定起来,让Spring调用,并且你把log和selectCorrect删了,也不会报错影响到selectService,对原有代码毫无入侵性。真正的AOP配置很灵活,可以配置  筛选多个方法切入,需要的条件等....(就是把你原来写的几十行代码,用这样简简单单一句话实现)

再来看这句话:

AOP:当程序运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。

什么是动态地?

还是以上面controller为例:

public class controller {
    
    @Resource
    Service service;
    public void selectService(){
        service.select();
    }
}

现在我已经设置好了AOP, 当用户调用controller时,这时才开始生成Service动态代理对象;

大概长这个样子

public class ServiceProxy implement service {
      //反射
    Service serviceImpl;

    void select(){
       log();  
       serviceImpl.select();
       selectCorrect();       
}
}

controller中的service其实是ServiceProxy实例出来的,由于Spring不知道用户会调用什么方法,所以动态生成这样的代理对象来实现不同需求的方法。

这个过程就被称作:运行时织入

Spring 事务管理:

Spring 也利用AOP思想,提供事务功能,让你少些代码

(学过mybatis的都知道,事务的开启,提交都需要你自己设置,写入)

Spring为了实现事务,也编写了一个通知类,TransactionManager。利用动态代理创建代理对象时,Spring会把transactionManager织入代理对象,然后将代理对象注入到UserController。

代理对象方法 = 事务 + 目标对象方法

差不多到这里,你作为一个Spring小白,应该可以自行百度学习更深层次的底层原理和更多Spring

IOC AOP的知识,本篇文章只为给对Spring懵懵懂懂的小白一个入门的启迪。

因为当初作为小白的博主,也是对Spring很头疼,一心只想快速入门,三天学习完SSH,SpringBoot 就写项目......  还是希望大家学习循序渐进,毕竟学习编程永无止境,光一篇小小文章是不够的。 很多东西都值得我们去深究~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值