spring学习笔记(一)
spring学习笔记(一)
在学习任何东西之前,我们首先应该搞清楚我们为什么要学习这项技术以及这项技术学习之后将如何便于我们有效的工作,所以学习之前向自己多问几个为什么是很有必要的。
我们为什么使用spring?
说白了,spring就是一个管理业务对象的容器,其中,它的最主要的两个特性和功能就是DI和AOP:
- DI(Dependency Injection,依赖注入):依赖注入和控制反转是同一个概念,当某个角色需要另一个角色的协助时,在传统程序设计过程中,通常由调用者来创建被调用的实例,但在spring中,创建被调用者的工作不再由调用者来完成,因此我们称之为控制反转,创建被调用者实例的工作由spring容器来完成,然后将被调用者实例注入调用者中,因此称为依赖注入。
- AOP(Aspect Oriented Programming,面向切面编程):AOP是一个抽象的程序设计思想,其主要的目的就是解耦、代码的重复利用和便于装卸。
Java Bean
- 每一个类实现了Bean的规范才可以由spring来接管,Java Bean规范应遵从一下几点:
- 必须是一个public类
- 必须有一个无参构造器
- 有成员属性的getter、setter方法
实现以上三点的类,被称为一个Java Bean,也是一个可重用的组件。
所以综上所述,在没使用spring这样的框架之前,大量的各个业务或者逻辑类里面互相耦合,程序非常混乱,很难有效的进行管理,有了spring框架来帮我们进行所有对象的创建与管理,当我们需要八个对象的时候,利用依赖注入很简单的得到目标对象,很大程度实现了解耦。是不是感觉很爽?
下面我们来具体学习一下,spring里面究竟和Java Bean都有哪些不轨勾当。
spring是如何来管理Bean的呢?又是如何实现对象注入的呢?步骤如下:
- spring对bean进行实例化
- spring将值和bean的引用注入到bean对应的属性中
- 如果bean实现了BeanNameAware接口,spring将bean的id传给setBean-Name()方法
- 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
- 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization()方法
- 如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法
- 此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁
- 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用

以上的流程比较套路,不太理解的不用死磕,知道spring帮我们干哪些事就行了,这过程初学的时候结果比过程重要,个人愚见,之后再对过程原理慢慢进行深入了解。
Bean的作用域
Spring定义了多种Bean作用域,可以基于这些作用域创建bean,包括:
- 单例(Singleton):在整个应用中,只创建bean的一个实例。
- 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
- 会话(Session):在Web应用中,为每个会话创建一个bean实例。
- 请求(Rquest):在Web应用中,为每个请求创建一个bean实例。
在默认情况下,Spring应用上下文中所有bean都是作为以单例(singleton)的形式创建的。也就是说,不管给定的一个bean被注入到其他bean多少次,每次所注入的都是同一个实例。在大多数情况下,单例bean是很理想的方案。初始化和垃圾回收对象实例所带来的成本只留给一些小规模任务,在这些任务中,让对象保持无状态并且在应用中反复重用这些对象可能并不合理。有时候,可能会发现,你所使用的类是易变的(mutable),它们会保持一些状态,因此重用是不安全的。在这种情况下,将class声明为单例的bean就不是什么好主意了,因为对象会被污染,稍后重用的时候会出现意想不到的问题。

浙公网安备 33010602011771号