Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。
一、Spring优点
- 低侵入式设计,代码的污染极低
- 独立于各种应用服务器,基于spring框架的应用,真正实现一次写入,到处运行
- IOC容器降低了业务对象替换的复杂性,提高了组件之间的解耦
- AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,提高复用性
- ORM和DAO提供了与第三方持久层框架的良好整合,简化了底层的数据库访问
二、程序框架
Core Container 核心容器
spring-core:Spring中核心工具类包
spring-bean:Spring中定义bean的组件
spring-context:Spring的运行容器
spring-context-support:Spring容器的扩展支持
spring-expression:Spring的表达式语言支持
AOP 面向切面编程
spring-aop:基于代理的AOP支持
spring-aspect:继承Aspect的AOP支持
WEB(MVC)
spring-web:提供web的基础功能
spring-webmvc:提供springmvc的功能
spring-websocket:提供web socket支持
spring-webmvc-portlet:提供Portlet环境的支持
Data Access/Integration-数据访问/集成
spring-jdbc:提供对jdbc连接的封装功能
spring-tx:提供对事务的支持
spring-orm:提供对象-关系映射支持
spring-jms:提供消息队列的支持
spring-oxm:提供对象-XML映射支持
Test 测试
spring-test:提供对测试功能的支持
三、核心机制
1、管理Bean,ApplicationContext接口实现类
1)ClassPathXmlApplicationContext:从类加载路径下搜索配置文件,并根据配置文件创建spring容器
2)XmlWebApplicationContext:从Web的应用的XML文件中读取上下文
3)FileSystemXMLApplicationContext:从文件系统的相对路径活绝对路径下去搜索配置文件,并根据配置文件创建spring容器
4)Bean的作用域
①singleton单例模式
②prototype:每次通过容器的getBean方法获取prototype作用域的Bean时,都将产生一个新的Bean实例
③request:对于一次Http请求,request作用域的Bean将只生成一个实例,Web应用使用Spring时,该作用域才真正有效
④不指定Bean的作用域,Spring默认使用singleton作用域
public class BeanTest {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
Person p = ctx.getBean("person",Person.class);
p.getName();
}
}
5)BeanFactory和FactoryBean
①BeanFactory是IOC容器的核心接口,负责生产和管理bean,它为具体的IOC容器提供了最基本的规范
②FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String BeanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&BeanName),在BeanName之前加上&。
6)BeanFactory和ApplicationContext区别
①BeanFactory可以理解为含有bean集合的工厂类,包含了各种bean的定义,以便在接收到客户端请求时将对应的bean实例化,包含bean生命周期的控制,调用客户端的初始化方法和销毁方法
②BeanFactory的扩展,增加了1,提供支持国际化的文本消息,2,统一的资源文件读取方式3、已在监听器中注册的bean的事件
2、控制反转(IOC): 在编译阶段尚未知所需的功能来自哪个类的情况下,将其他对象所依赖的对象实例化的模式
1)原始做法:调用者主动创建被依赖对象,然后再调用被依赖对象的方法
2)简单工厂模式:调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被依赖对象,然后再调用被依赖对象的方法
3)使用Spring框架:调用者无需主动获取被依赖对象,调用者只要被动接受spring容器为调用者的成员变量赋值即可
有三种注入方式:①设值注入:setter方法注入;②构造注入:可以决定依赖关系的注入顺序;成员变量过多导致构造器笨重③ 接口注入
4)自动装配
no: spring框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义时用标签明确的设置依赖关系
byName:根据bean名称设置依赖关系
byType:根据bean类型设置依赖关系
constructor: 构造器的自动装配和byType类似,仅适用于与有构造器相同参数的bean
autodetect:自动探测适用构造器自动装配或byType自动装配
3、AOP:面向切面编程,常用通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等
切面(Aspect):用于组织多个Advice,Advice放在切面中定义
连接点(Jointpoint):程序执行过程中明确的点
增强处理(Advice):AOP框架在特定的切入点执行的增强处理有arround、before和after等类型
切入点(PointCut):可以插入增强处理的连接点
AOP代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用:
1)定义普通业务组件
2)定义切入点,一个切入点可能横切多个业务组件
3)定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作
四、动态代理
1、Jdk动态代理
<aop:aspectj-autoproxy />proxy-target-class属性默认false为jdk动态代理
实现InvocationHandler接口,重写invoke方法,使用Proxy类的newProxyInstance传入目标类加载器和实现接口完成代理对象的创建
2、Cglib动态代理
<aop:aspectj-autoproxy poxy-target-class="true"/>
实现MethodInterceptor,重写intercept方法,使用Enhancer对象对目标对象创建子类对象传入callback对象对目标增强完成动态代理
3、不过即使proxy-target-class设置为false,如果目标类没有声明接口,则spring将自动使用CGLib动态代理
五、使用到的设计模式
代理模式:在AOP和remoting中被用的比较多
单例模式:在spring配置文件中定义的bean默认为单例模式
模板方法:用来解决代码重复问题,比如restTemplate,JmsTemplate,JpaTemplate
前端控制器: 提供了DispatcherServlet对请求进行分发
视图帮助:JSP标签整合
工厂模式: BeanFactory用来创建对象的实例