Spring学习
Spring笔记
初识
介绍
Spring 框架 是 Java 应用最广的框架 ,它的成功 来源于 理念 ,而不是 技术 本身 ,它的理念包括 IoC 和 AOP 。
IoC: Inversion of Control,控制反转。
AOP: Aspect Oriented Programming,面向切面编程。
什么是Spring?
Spring:是一个轻量级的 DI / IoC 和 AOP 容器的开源框架,来源于 Rod Johnson 在其著作《Expert one on one J2EE design and development》中阐述的部分理念和原型衍生而来。
Spring提倡:以“最少侵入”的方式来管理应用中的代码,这意味着我们可以随时安装或者卸载 Spring。
适用范围:任何 Java 应用。
Spring的根本使命:简化 Java 开发。
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 Core、Spring AOP、Spring ORM、Spring DAO、Spring Context、 Spring Web、Spring Web MVC。
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、任务调度)整合,与更多技术整合(比如缓存框架)。
常用术语
框架 :是指能完成一定功能的半成品。 框架能帮助我们完成的是:项目的整体框架、一些基础功能、规定了类和对象如何创建,如何协作等,当我们开发一个项目时,框架帮助我们完成了一部分功能,我们自己再完成一部分,那这个项目就完成了。
从框架的角度可以理解为:无需继承框架提供的任何类。这样我们在更换框架时,之前写过的代码几乎可以继续使用。
轻量级 是相对于重量级而言的,轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反。容器 :在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期。
JavaBean :即符合 JavaBean 规范的 Java 类。
POJO :即 Plain Old Java Objects,简单老式 Java 对象。它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其它Java框架的类或接口。
注意:bean 的各种名称——虽然 Spring 用 bean 或者 JavaBean 来表示应用组件,但并不意味着 Spring 组件必须遵循 JavaBean 规范,一个 Spring 组件可以是任意形式的 POJO。
流程理解
Spring源码中的基本原理其实就是通过反射解析类及其类的各种信息,包括构造器、方法及其参数,属性。然后将其封装成bean定义信息类、constructor信息类、method信息类、property信息类,最终放在一个map里,也就是所谓的container,池等等,其实就是个map……
当你写好配置文件,启动项目后,框架会先按照你的配置文件找到那个要scan的包,然后解析包里面的所有类,找到所有含有@bean,@service等注解的类,利用反射解析它们,包括解析构造器,方法,属性等等,然后封装成各种信息类放到一个map里。每当你需要一个bean的时候,框架就会从container找是不是有这个类的定义啊?如果找到则通过构造器new出来(这就是控制反转,不用你new,框架帮你new),再在这个类找是不是有要注入的属性或者方法,比如标有@autowired的属性,如果有则还是到container找对应的解析类,new出对象,并通过之前解析出来的信息类找到setter方法,然后用该方法注入对象(这就是依赖注入)。
如果其中有一个类container里没找到,则抛出异常,比如常见的spring无法找到该类定义,无法wire的异常。还有就是嵌套bean则用了一下递归,container会放到servletcontext里面,每次request从servletcontext找这个container即可,不用多次解析类定义。如果bean的scope是singleton,则会重用这个bean不再重新创建,将这个bean放到一个map里,每次用都先从这个map里面找。如果scope是session,则该bean会放到session里面。
—转自 @王奕然 -知乎。
Bean的生命周期
① Spring 启动,查找并加载需要被Spring管理的bean,进行Bean的实例化 。
② Bean 实例化后对将Bean的引入和值注入到Bean的属性中 。
③ 如果Bean 实现了BeanNameAware接口的话,Spring将Bean的Id传递 给setBeanName()方法
④ 如果Bean 实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入 。
⑤ 如果Bean 实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入 进来。
⑥ 如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
⑦ 如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化 方法,该方法也会被调用
⑧ 如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
⑨ 此时,Bean已经准备就绪 ,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
⑩ 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁 方法,该方法也会被调用。
IoC
思考
谁控制谁? IoC容器管理对象的生命周期! 控制什么? 控制对象! 为何要反转? 方便管理,降低耦合度! 哪些方面反转了? 原来是资源的使用者,现在是IoC容器!作用
- ① 资源集中管理,方便易于管理。
- ② 降低了双方依赖资源的依赖程度,也就是降低耦合度。
重点
控制反转是目的,依赖注入(和依赖查找)是手段。
底层原理
IoC底层原理:XML解析,工厂模式,反射。
正反转对比
正控:若要使用某个对象,需要自己去负责对象的创建。
反控:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架。
1 | Boy boy=new Boy(); |
1 | // 孙笑川童鞋 @带带大师兄 |
其他
控制反转: 把对象创建和对象之间的调用过程,交给spring管理。方便管理,降低耦合度。
IoC的操作bean管理:1.创建对象 2.注入属性。
AOP
含义
AOP :面向切面编程。不修改源码,可以增加某些逻辑,降低逻辑间的耦合度。实现方式
方式 :- 有接口用jdk动态代理,实现类实现。
- 没接口用cglib动态代理。子类继承实现。