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架构图

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 CoreSpring AOPSpring ORMSpring DAOSpring ContextSpring WebSpring 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的生命周期

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
2
3
4
5
6
7
8
9
Boy boy=new Boy();

BeautfulGirl beatuifulGirl=new BeautifulGirl();
beautifulGirl.setAttributes("性格好,身材好.");

if(true==boy.getHouseAndCar()){
boy.setGirlFriend(beautifulGirl);
boy.doSomething();
}
反转代码示例:
1
2
3
4
5
6
7
8
// 孙笑川童鞋  @带带大师兄
Boy sunXiaoChuan=new Boy();

ApplicationContet context = new ClassPathXmlApplicationContext("beans.xml");
BeautfulGirl beautifulGirl = (BeautfulGirl)context.getBean("beautifulGay");

sunXiaoChuan.setGirlFriend(beautifulGirl);
sunXiaoChuan.doSomething();

其他

控制反转: 把对象创建和对象之间的调用过程,交给spring管理。方便管理,降低耦合度。
IoC的操作bean管理:1.创建对象 2.注入属性。

AOP

含义

AOP :面向切面编程。不修改源码,可以增加某些逻辑,降低逻辑间的耦合度。

实现方式

方式 :
  • 有接口用jdk动态代理,实现类实现。
  • 没接口用cglib动态代理。子类继承实现。

底层原理

原理 :使用动态代理。

关键词

连接点

连接点 :类中可以加强的方法,称为连接点。

切入点

切入点 :类中实际加强的方法,称为切入点。

切面

切面 :把通知应用到切入点的过程。

通知范围

范围 :前置通知后置通知环绕通知异常通知最终通知