spring学习整理笔记(一)
什么是spring
spring是一个轻量级java开发框架。最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。他是一个分层的javaSE/javaEE full-stack(一站式)轻量级开源框架,为开发java应用程序提供了全面的基础框架支持。Spring负责基础架构,因此java开发者可以专注于应用程序的开发。
总结一句:解决企业级应用开发的复杂性,简化Java开发。
spring能做什么
Spring可以做的事情很多,核心功能也就是依赖注入(dependency injection,DI)和面向切面编程(aspect-oriented programming,AOP)。
spring的优缺点
1.方便解耦,简化开发。所有对象的创建和依赖关系的维护都交给spring管理
2.AOP编程支持。可以方便的实现对程序进行权限拦截,运行监控等功能。
3.声明式事务支持。只需要通过配置就能完成对事务的管理,无需手动编程。
4.方便程序测试。Spring对Junit4的支持,可以通过注解方便测试Spring程序。
5.方便集成各种优秀的框架。例如MyBatis。
6.降低javaEE API的使用难度。Spring对一些非常难用的API进行了封装,例如(JDBC,JavaMail,远程调用等)。
- 缺点
1.Spring是一个轻量级框架,却给人一种大而全的感觉,过于臃肿。
2.Spring依赖反射,反射影响性能。
3.使用门槛高,入门Spring需要较长学习时间。
spring的组成模块
Spring分大致分六个模块:
- 核心容器(Core Container)
spring core 提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)和依赖注入(DI)功能。
spring bean提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称之为Bean。
spring context构建于core封装包基础之上的context封装包,提供了一种框架式的对象访问方法。
- AOP(Aspect Oriented Programming)和设备支持(Instrumentation)
spring aop提供了面向切面的编程实现,让spring的使用者可以自定义拦截器,切点等。
- 数据访问与集成(Data Access/Integeration)
spring jdbc提供了一个JDBC的抽象层,消除了繁琐的JDBC编码和数据库厂商特有的错误代码解析,用于简化JDBC。
- Web
spring web提供了针对web开发的集成特性,例如文件上传,利用servlet listener进行ioc容器初始化和针对web的applicationContext。 - 消息(Messaging)
- Test
spring test主要是为测试提供支持的。
Spring中用到的设计模式
- 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例。
- 单例模式:Bean默认是单例模式。
- 代理模式:Spring的AOP功能用到了JDK动态代理和CGLIB字节码生成技术。
- 模板方法:用来解决代码重复的问题,比如RestTemplate。
- 观察者模式:定义对象间一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于他的对象都会得到通知被制动更新。
Spring的控制反转(IOC)
什么是ioc
ioc即 Inversion Of Control ,它把传统上由程序代码直接操控的对象的调用权交给spring容器,通过容器来实现对象组件的装配和管理。所谓的控制反转的概念就是对组件对象的控制权的转移,从程序代码本身转移到外部容器。
spring ioc负责对象的创建,管理对象(DI,装配对象,配置对象,并管理这些对象的生命周期)。
IOC的作用和优点
- 管理对象的创建和依赖关系的维护。当对象关系比较复杂的时候,人工手动维护依赖关系是很累的。
- 解耦,有容器去维护具体的对象
- 托管了类的生产过程,应用程序无需去关注类是如何创建的。
- ioc或di把应用的代码量降到了最低。
- 容易测试,单元测试不再需要单例和JNDI查找机制。
- ioc容器支持加载服务时是饿汉式初始化和懒加载。
IOC的实现机制
Spring中IOC的实现机制就是工厂模式加反射机制。
public class Spring_IOC_demo {
//定义person接口,定义teacher实现该接口,
//将person实例的创建权限叫给工厂,工厂通过反射创建实例。
interface person{
public void speak();
}
static class Factory{
public static person getInstance(String ClassName){
person p=null;
try {
p = (person) Class.forName(ClassName).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return p;