IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 史上最全的spring笔记 -> 正文阅读

[Java知识库]史上最全的spring笔记

spring

Spring:

Spring是一个开源框架,它由[Rod Johnson](https://baike.baidu.com/item/Rod Johnson)创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

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

轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。

框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

在这里插入图片描述

   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>

导一个spring-webmvc相当于导了
前面4个jar依赖
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ioc的推导

例如:
    没有用ioc之前
      privateUserdao userdao=new UserDaoImpl();
		public void save(){
            userdao.save();
        }
        调用业务层调用控制层的方法
        在业务层中应该写	Userdao userdao=new UserDaoImpl();
        假如我有另一个类的也实现了Userdao接口,而我想用另一个方法时,就要改new 的实现类,因为需求而频繁的改代码
        如此循环下去。。。。。,修改代码的成本台昂贵了
        相当于没有用ioc之前,控制权在程序员手中
        
   	用了ioc之后
        private Userdao userdao;
		public setUserdao(Userdao userdao){
            this.userdao=userdao;
        }
		//di(依赖注入),将控制权交给了用户
    没有用ioc/di之前
        
    测试类1public static void main(String[] args){
        Uservice uservice=new userviceimpl();
        uservice.save();
        //思考:假如我现在要调用mysqlimpl的save的方法时,应该怎么办?
        1.修改业务层中的new的实现类
    }
    用了ioc/di之后
        
    测试类1public static void main(String[] args){
        Uservice uservice=new userviceimpl();
        //因为用了ioc/di之后,Uservice层中有  private Userdao userdao;属性,所以可以设置其属性,从而改变对应的实现类
        ( Uservice)uservice.setUserdao(new mysqldaoimpl);
        //上面这行代码相当于: Userdao userdao=new mysqldaoimpl();
        本质的区别:用了ioc/di之后,我们就可以随时改变实现类,完成不同的需求,但不需要改代码
            
    }
        
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716232131681.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716232143547.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021071623344358.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716232212922.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)


## 实例化构造方法

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716232236910.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716232322533.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716232322171.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
## 整合所有的xml配置文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716232322533.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021071623232281.png#pic_center)
## bean 的作用域
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716232728789.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)


## scope范围

1.singleton单例模式(默认)

2.prototype非单例模式

- [博客园](https://www.cnblogs.com/)
- [首页](https://www.cnblogs.com/wk-missQ1/)
- [新随笔](https://i.cnblogs.com/EditPosts.aspx?opt=1)
- [联系](https://msg.cnblogs.com/send/WK_BlogYard)
- [订阅](javascript:void(0))
- [管理](https://i.cnblogs.com/)

# [谈谈你对Spring IOC和DI的理解,以及它们的区别](https://www.cnblogs.com/wk-missQ1/p/12547397.html)

### 谈谈你对Spring IOC 和 DI的理解,以及它们有什么区别?

  **IOC是什么?**

    IOC--Inversion of Control,**控制反转**,不是什么技术,而是一种设计思想.IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.

  **IOC的优势是什么?**

    IOC是一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合,更优良的程序,传统的应用程序都是由我们在类的内部主动创建依赖对象,从而导致类与类之间的高耦合,有了IOC容器之后,把创建和查找依赖对象的控制权交给了IOC容器,由容器进行注入组合对象,所以**对象和对象之间是松耦合**.

  **DI是什么?**

    DI--Dependency Injection,**依赖注入**,组件之间依赖关系由容器在运行期决定,即由容器动态的将某个依赖关系注入到组件当中,依赖注入的目的并非为软件系统带来更多的功能,而是为了提升组件重复使用的频率,并为系统搭建一个灵活可扩展的平台,通过依赖注入我们只需要使用简单的配置,而不需要任何代码就可以指定目标需要的资源,完成业务逻辑,而不需要关心具体的资源来自何处,由谁实现的.

  **IOC--控制反转的通俗解释:**

    所谓的IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西给你,同时也把你交给其他需要你的东西,所有的类的创建,销毁都是由spring来控制,也就是说控制对象的生命周期不再是引用它的对象,而是spring,对于某个具体的对象而言,以前是它控制其他对象**,而现在所有的对象都由spring控制,所以这就叫控制反转**.

  **DI--依赖注入的通俗理解:**

    如果程序中A需要依赖B才能正常进行,而这时候B不是自己创建的而是**由spring容器注入给A**,spring会在适当的时候创建B,然后像打针一样注入给A,所以依赖注入的名字就是这么来的.那么**DI是如何实现的呢?**Java 1.3之后一个重要的特征就是**反射(reflection)**,它允许程序在运行的时候动态的生成对象,执行对象的方法,改变对象的属性,spring就是通过反射来注入的.

  **谁依赖了谁?**当然是应用程序依赖于IOC容器;

  **为什么需要依赖?**应用程序需要IOC容器来提供对象需要的外部资源;

  **谁注入谁?**IOC容器注入应用程序某个对象,应用程序依赖的对象;

  **注入了什么?**注入某个对象所需要的外部资源(包括对象,资源,常亮数据);

  **IOC和DI有什么关系?**

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FrpHO2wF-1626448544716)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210714191311151.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QAimy7EH-1626448544718)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210714193506499.png)]

DI依赖注入:3种方式

1.构造器注入

2.set注入

3.自定义如c标签或者p标签

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233028882.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233047856.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233047759.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233047608.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233047344.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233047193.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233047168.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021071623304754.png#pic_center)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233155760.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233155675.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233155608.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233155522.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233155489.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233155312.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfemhvbmdfcm9uZw==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021071623315583.png#pic_center)


  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 11:46:11  更:2021-07-17 11:48:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 16:37:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码