Spring学习(一)初识Spring

 文章更新时间:2020/09/27

 一、什么是Spring

定义:Spring 是一个轻量级的 DI / IoC 和 AOP 容器的开源框架,目的为了简化java开发。

  • DI注入
  • IOC控制反转
  • AOP面向切面编程

原理:利用了java的反射机制

二、常用术语

框架

定义:项目的整体架构模型,可以协助我们更快更方便地进行开发。

非侵入式设计

定义:从框架的角度看即无需继承框架提供的任何类,当更换框架时,大部分的功能代码无需改变。

轻量级和重量级

轻量级:非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等特点。

重量级:与轻量级相反,一般迁移、更换起来会比较麻烦。

 

对象序列化

  定义:对象的序列化过程就是将对象状态转换成字节流从字节流恢复对象。将对象状态转换成字节流之后,可以用 java.io 包中的各种字节流类将其保存到文件中,或者通过网络连接将对象数据发送到另一个主机。

 

EJB

  定义:又被称为企业Java Beans,是基于分布式事务处理的企业级应用程序的组件,更多时候成为一种规范

  概念:把你编写的软件中那些需要执行制定的任务的类,不放到客户端软件上了,而是给他打成包放到一个服务器上了。

  PS:EJB要依赖于客户端【C/S形式调用】

  相关的知识点:

  • EJB实现原理 : 就是把原来放到客户端实现的代码放到服务器端,并依靠RMI进行通信。
  • RMI实现原理 :就是通过Java对象可序列化机制实现分布计算,实现远程对象调用
  • 服务器集群 : 就是通过RMI的通信,连接不同功能模块的服务器,以实现一个完整的功能。

详见这里~

JavaBean

  定义:一种java类,一个可重复使用的软件组件,通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简称bean。 

  作用:主要是针对于容器来声明的,几乎任何一个类都可以根据需求来作为Bean给容器使用。

  PS:与POJO的区别是JavaBean的范围更广泛,可以有自己定义的方法,实现一些除了getter/setter方法之外的功能

POJO

  定义:简单的Java对象,具有getter/setter方法,常见的VO(value -object)和DTO(Data Transform Object)就是一种POJO,没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。(即不包含业务逻辑或持久逻辑等。)

  作用:作为数据存储的载体,而不具有业务逻辑处理的能力

  特点:

  • 这个类必须有一公共的缺省构造函数
  • 这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范。
  • 这个类应是可序列化的。 

容器

定义:从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期

三、Spring优势

  • 低侵入 / 低耦合 (降低组件之间的耦合度,实现软件各层之间的解耦)
  • 声明式事务管理(基于切面和惯例)
  • 方便集成其他框架(如MyBatis、Hibernate)
  • 降低 Java 开发难度
  • Spring 框架中包括了 J2EE 三层的每一层的解决方案(一站式)

四、Spring的功能

① Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系。

② Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。

③ Spring 能非常简单的帮我们管理数据库事务。

④ Spring 还提供了与第三方数据访问框架(如Hibernate、JPA)无缝集成,而且自己也提供了一套JDBC访问模板来方便数据库访问。

⑤ Spring 还提供与第三方Web(如Struts1/2、JSF)框架无缝集成,而且自己也提供了一套Spring MVC框架,来方便web层搭建。

⑥ Spring 能方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。

五、Spring框架

 

Data Access/Integration层包含有JDBC、ORM、OXM、JMS和Transaction模块。

Web层包含了Web、Web-Servlet、WebSocket、Web-Porlet模块。

AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现。

Core Container(核心容器):包含有Beans、Core、Context和SpEL模块。

Test模块支持使用JUnit和TestNG对Spring组件进行测试。

六、Spring容器中Bean的生命周期

简单文字归纳一下:

1-2  创建实例

  现在假设spring就是个容器,而配置文件中配置的bean属性才是我们真正需要的东西。创建实例就是说,我把配置文件中的bean信息取出来化作一个真正的bean并放到容器中。

3-4  注入依赖关系

  第3步是创建实例之后对实例作了一些处理,第4步是把xml中配置的bean属性值赋予给容器中的实例化之后的bean。

5  bean初始化之前的处理

  应用开发者需要把容器中实例化的bean拿出来用,这个拿出来的过程就是初始化,第五步就是在初始化之前,对已经实例化的bean再作一定的处理。

6-7  初始化

  如果bean实现了InitializingBean,那么将调用InitializingBean的afterPropertiesSet()方法做一些初始化处理。如果没有实现InitializingBean,而是在配置文件中定义了init-method属性值,那么系统会找到init-method对应的方法并执行之,程序猿哥哥一般在这个方法里写一些初始化操作;

8  bean初始化之后的处理

  初始化之后在这个方法中再对bean进行修饰装点。

9-10  交给应用开发人员处理

  如果在<bean>中指定Bean的作用范围是scopt="prototype",那么系统将bean返回给调用者,spring就不管了(如果两个实例调用的话,每一次调用都要重新初始化,一个实例的修改不会影响另一个实例的值。如果指定Bean的作用范围是scope="singleton",则把bean放到缓冲池中,并将bean的引用返回给调用者。这个时候,如果两个实例调用的话,因为它们用的是同一个引用,任何一方的修改都会影响到另一方。)

11  bean用完之后

  对于scope="singleton"的bean,使用完之后spring容器会做一些处理,比如编写释放资源、记录日志等操作。

12  销毁

  调用配置文件中的销毁方法销毁实例。  

 

 

参考资料:

 

posted @ 2019-09-09 10:38  有梦想的肥宅  阅读(1081)  评论(0编辑  收藏  举报