从历史开始谈
2002年,Rod Johnson编写了《J2EE设计与开发》,书中概括了当时Java企业应用程序的开发现状以及指出了JavaEE规范中EJB框架的缺陷。书中基于普通Java类和设计模式提出了更为简单的解决方案(interface21),之后进一步扩展了interface21的代码,衍生了一个轻量级的J2EE开发解决方案——Spring。直到现在已经发布SpringFramework5.x。
EJB: 企业级JavaBean(Enterprise JavaBean), 是一个用来构建企业级应用的服务端可被管理组件。EJB以一个标准方式自动处理了如数据持久化、事务集成、安全对策等不同应用共有的问题。
- EJB框架存在的问题
a. 运行坏境苛刻:需要运行在EJB容器中,而不能直接运行在tomcat这种常用的容器中(tomcat核心就是servlet引擎)

b. 代码移植性差:weblogic/websphere实现了EJB容器,但是两者的代码不可移植
weblogic是oracle公司开发的包含tomcat相关功能并实现了EJB容器,并且收费 websphere是IBM公司开发的包含tomcat相关功能并实现了EJB容器,并且收费 两者各种实现的代码不可移植
什么是spring
Spring是一个轻量级的JavaEE解决方案,整合了众多优秀的设计模式,具有一下特性:
- 轻量级
a. 对于运行坏境没有特殊要求,可以运行在tomcat/jetty上也可以运行在weblogic/websphere上
b. 代码移植性高:不需要实现额外的接口
- JavaEE的解决方案:可以解决JavaEE分层开发中每一层次的问题
a. SpringMVC解决控制器controller的问题
b. Spring通过AOP技术解决service中事务控制/日志处理等问题
c. 集成jdbc/mybatis解决DAO持久化问题
- 整合设计模式:Spring不是一种新技术,只是对原有设计模式高度的封装和整合
a. 工厂设置模式:对象创建的解耦合
在controller创建service对象:
- 直接调用构造方法:UserService userService = new UserServiceImpl(); // 多个controller存在代码耦合
- 通过反射进行创建:
Class clazz = Class.forName(“com.spring.service.UserServiceImpl”); // 可以通过配置文件进行解耦合 UserService userService = (UserService)clazz.newInstance();
- 通用的工厂模式:UserService userService = (UserService) BeanFactory.getBean(“userService”);
// 创建一切想要的对象public class BeanFactory {public static Object getBean(String key) {Object bean = null;try {Class clazz = Class.forName(env.getProperty(key)); // 可以通过key从配置文件中获取到bean的具体全限定名bean = clazz.newInstance();} catch (Exception e){}return bean;}}
b. 代理设计模式
c. 模版设计模式
d. 策略设计模式
总结:Spring是一个完整体系的JavaEE解决方案。


