简介
Spring是一颗开源框架,为了解决企业应用程序开发复杂性而创建,主要优势是分层架构,简化J2EE开发;
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
核心模块
Spring框架由七个定义明确的模块组成
-
核心容器(Core)
Spring最核心的部分,提供了依赖注入(DependencyInjection)特征来实现容器对Bean管理,最基本的概念是BeanFactory,是任何Spring应用的核心,BeanFactory是工厂模式的一个实现,它使用IoC将应用配置和依赖说明从实际的应用代码中分离出来。该模块包含Core、Beans、Context 和 Expesssion Language模块
Core 和 Beans是框架的基础部分 -
应用上下文模块(Context)
该模块构建于Core 和 Beans 之上,Context继承了Beans的特性,提供了一种类似于JNDI注册器的框架式的对象访问方法,为Spring核心提供了大量的扩展;ApplicationContext只是Context的一个接口 -
AOP模块
AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现,让你可以定义方法拦截器和切面,从而将逻辑代码分开,降低耦合度 -
JDBC抽象和DAO模块
JDBC模块提供了一个JDBC抽象层,它可以消除冗长的JDBC编码和解析数据库厂商特有的错误代码,包含了Spring对JDBC数据封装的所有类 -
对象/关系映射集成模块(ORM)
对象-关系映射API,如JPA,JDO,Hobernate,iBatis等提供一个交互层,利用ORM封装包,可以混合使用所有Spring提供的特性进行O/R映射 -
Spring的Web模块
提供一个基础的面向Web的集成特性,例如,多文件上传、使用servlet listeners初始化IOC容器以及一个面向Web的应用上下文,还包含Spring远程支持中的Web相关部分 -
Spring的MVC框架
使得模型范围内的代码和web forms之间的代码能够清晰的分离,并与Spring框架的其他特性集成在一起 -
Test
支持使用JUnit和TestNG对Spring组件进行测试
Spring用到的设计模式(https://www.cnblogs.com/AndyAo/p/8666385.html)
- 简单工厂(又叫静态工厂模式)
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。
spring中的BeanFactory就是简单工厂模式的体现,根据传入的唯一标识来创建bean对象;单是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定 - 工厂方法(Factory Method)
工厂方法就是将对象的创建和使用分离,讲对象的创建及初始化职责交给工厂对象
一般情况下,应用程序有自己的工厂创建bean,如果将应用程序自己的工厂对象交给spring管理,那么spring管理的就不是普通的bean,而是工厂Bean
例如:
import java.util.Random;
public class StaticFactoryBean {
public static Integer createRandom() {
return new Integer(new Random().nextInt());
}
}
建一个config.xm配置文件,将其纳入Spring容器来管理,需要通过factory-method指定静态方法名称
xml
<bean id="random"
class="example.chapter3.StaticFactoryBean" factory-method="createRandom" //createRandom方法必须是static的,才能找到 scope="prototype"
/>
测试:
java
public static void main(String[] args) {
//调用getBean()时,返回随机数.如果没有指定factory-method,会返回StaticFactoryBean的实例,即返回工厂Bean的实例 XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml")); System.out.println("我是IT学习者创建的实例:"+factory.getBean("random").toString());
}
```
3. 单例
保证一个类只有一个实例,并提供一个访问他的全局访问点
Spring单例模式值提供了一个全局访问点BeanFactory,但是没有从构造器级别去控制单例,这是因为Spring管理的是任意的对象
提示:Spring下默认的bean均为singleton,可以通过singleton=“true|false” 或者 scope=“?”来指定
- 适配器(Adapter)
在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)对类进行方法级别的切面增强,即,生成被代理类的代理类, 并在代理类的方法前,设置拦截器,通过执行拦截器重的内容增强了代理方法的功能,实现的面向切面编程。
Adapter类接口:Target
public interface AdvisorAdapter {
boolean supportsAdvice(Advice advice);
MethodInterceptor getInterceptor(Advisor advisor);
}
/// MethodBeforeAdviceAdapter类,Adapter
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
public boolean supportsAdvice(Advice advice) {
return (advice instanceof MethodBeforeAdvice);
}
public MethodInterceptor getInterceptor(Advisor advisor) {
MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
return new MethodBeforeAdviceInterceptor(advice);
}
}
5. 包装器(Decorator)
spring的applicationContext中配置所有的dataSource,实现数据源的动态切换
如果项目连接多个数据库,根据不同客户或者不同请求去请求不同的数据库,但是每个数据库的数据源(dataSource)不同,根据需要要在DAO访问sessionFactory的时候动态切换数据源,可以根据不同客户或者不同请求设置dataSource,达到切换数据源目的
6. 代理模式(Proxy)
Spring的Proxy模式在aop中有体现,比如 JdkDynamicAopProxy 和 Cglib2AopProxy。
7. 观察者(Observer)
定义对象间存在的一对多关系,一个对象修改时会通知其他对象。观察者属于行为模式;Spring中的监听
8. 策略模式(Strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。满足客户日益增长的业务(贪婪)需求
Spring 的 SimpleInstantiationStrategy 使用了策略模式
9. 模板方法(Template Method)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
以下是一个具体的例子:
JdbcTemplate中的execute方法