1. Spring简介
Spring是一个开源框架,最早由Rod Johnson创建,是针对JavaBean生命周期进行管理的轻量级容器,而其最根本的使命:简化Java开发。
Spring采取了以下4种关键策略:
- 基于POJO(Plain Old Java Object)的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和惯例进行声明式编程;
- 通过切面和模板减少样板式代码。
2. Spring特性简介
2.1 IoC(Inversion of Control)
IoC(控制反转),或者说DI(依赖注入),Spring的核心之一。
在Spring中,对象无需自己查找或创建与其所关联的其他对象;而是通过容器把需要相互协作的对象引用赋予各个对象。
这种创建应用对象之间协作关系的行为通常称为装配(wiring),这也是DI(依赖注入)的本质。
写一段代码:
public class Driver{
private Truck truck;
public Driver(){
//与Truck紧耦合
this.truck = new Truck();
}
public void drive(){
System.out.println("Driver is driving"+truck.getBrand());
}
}
上面这个代码,Driver只能驾驶Truck ,极大的限制了Driver的能力,如果我想让这个Driver开其他种类的车,那么这个Driver就爱莫能助了。这个代码的缺点直观可见,而下面这个代码就更加灵活。
public class Driver{
private Car car;
//Car被注入进来
public Driver(Car car){
this.car = car;
}
public void drive(){
System.out.println("Driver is driving"+car.getBrand());
}
}
Car是个抽象类,Driver类没有和特定的Car实现产生耦合,这是依赖倒置原则。而Driver类并没有自行创建Car,而是在构造的时候把Car作为构造器参数传入。这是依赖注入的方式之一,即构造器注入(constructor Injection)。
2.2 AOP(Aspect-Oriented Programming)
DI能够让相互协作的软件组件保持松散耦合,而面向切面编程(AOP)把遍布应用各处的功能分离出来形成可重用的组件。
再写一段代码:
public class Driver{
private Car car;
public Driver(Car car){
this.car = car;
}
public void beforeDrive(){
System.out.println("Before drive...");
}
public void drive(){
System.out.println("Driver is driving"+car.getBrand());
}
public void afterDrive(){
System.out.println("After drive...");
}
}
这个代码很明显有问题,before()和after()方法直接写死在代码中,比如我们要计算每个方法的执行时间,那岂不是每个方法我们都要针对它写一个before和after;写个JDBC程序,每个方法都要开头连接数据库和结尾关闭数据库连接。而AOP可以把这些公共的代码提出来,让这个类、这个方法专心干好自己的本职工作,这也是符合设计模式的单一职责模式。
3. Spring容器(container)简介
容器是Spring框架的核心。Spring容器使用DI管理构造应用的组件,它会创建相互协作的组件之间的关联。
在基于Spring的应用中,你的应用对象生存于Spring容器中。
Spring容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期。
Spring容器自带多个容器实现,可以归为两种不同的类型:
- bean工厂(由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持
- 应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory创建,并提供应用框架级别的服务。
应用上下文比bean工厂更常用。
常用的应用上下文:
- AnnotationConfigApplicationContext:从一个或多个Java注解加载Spring应用上下文。
- AnnotationConfigWebApplicationContext:从一个或多个Java注解加载Spring Web应用上下文。
- ClassPathXMLApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
- FileSystemXmlApplicationContext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
- XmlWebApplicationContext:从Web应用下一个或多个XML配置文件中加载上下文定义。