一,为什么要用Spring?
1, 方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给 Spring 管理。
应用程序可以专注于业务实现,公共逻辑可以抽象为切面。
将对象的实例化交给框架,通过依赖注入从容器中获取对象。
2,方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持。
通过配置文件引入开源优秀框架。
3,降低 Java EE API 的使用难度
Spring 对 Java EE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等)都提供了封装,使这些 API 应用的难
度大大降低。
4,方便程序的测试
Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序。
5,AOP 编程的支持
Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。
6,声明式事务的支持
二,Spring三大组件
三大组件:Beans/Core/Context
三,三大基础概念
1,IOC
IOC即控制反转,所谓的控制反转就是开发者将对象创建、初始化的工作交给spring。
2,DI
依赖注入,对象属性的自动注入。
3,AOP
面向切面编程。
// 目标对象方法
public void insert() {
insertToDatabase();
}
// 代理对象方法
public void insert() {
log();
authority();
beginTransation();
insert()
log();
commit();
}
四,三次分享计划
1,IOC
手写简易IOC、DI框架,源码探索
2,AOP
jdk动态代理原理、cglib动态代理原理、源码探索
3,声明式事务
五,Spring的配置方式
1,纯XML配置
2,xml和注解
3,纯注解
六,IOC
1,手写IOC框架思路
①编写Spring格式的xml文件,定义bean;
②解析xml文件,加载bean配置到BeanDefinition缓存集合中;
③创建Bean对象,分为三步:
第一,实例化对象,相当于new一个对象;
第二,初始化对象,设置属性值;
第三,将对象存入缓存中。
2,三级缓存
/** Cache of singleton objects: bean name --> bean instance */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
/** Cache of singleton factories: bean name --> ObjectFactory */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);
/** Cache of early singleton objects: bean name --> bean instance */
private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);
DI的不可逾越的山:循环依赖。
3,设计模式
简单工厂
策略设计模式
ClassPathXmlApplicationContext.ClassPathXmlApplicationContext
单例模式
装饰器模式
七,我的实践
1,IOC
2,策略设计模式
3,泛型
4,注解
5,单例模式
public SingleTonLazy getSingleTon() {
if(null == singleTon) {
singleTon = new SingleTonLazy();
}
return singleTon;
}