从历史开始谈

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引擎)
image.png
b. 代码移植性差:weblogic/websphere实现了EJB容器,但是两者的代码不可移植

weblogic是oracle公司开发的包含tomcat相关功能并实现了EJB容器,并且收费 websphere是IBM公司开发的包含tomcat相关功能并实现了EJB容器,并且收费 两者各种实现的代码不可移植

image.pngimage.png
结论:EJB是一个重量级的框架
image.png

什么是spring

Spring是一个轻量级的JavaEE解决方案,整合了众多优秀的设计模式,具有一下特性:

  • 轻量级

a. 对于运行坏境没有特殊要求,可以运行在tomcat/jetty上也可以运行在weblogic/websphere上
b. 代码移植性高:不需要实现额外的接口

  • JavaEE的解决方案:可以解决JavaEE分层开发中每一层次的问题

a. SpringMVC解决控制器controller的问题
b. Spring通过AOP技术解决service中事务控制/日志处理等问题
c. 集成jdbc/mybatis解决DAO持久化问题
image.png

  • 整合设计模式:Spring不是一种新技术,只是对原有设计模式高度的封装和整合

a. 工厂设置模式:对象创建的解耦合

在controller创建service对象:

  1. 直接调用构造方法:UserService userService = new UserServiceImpl(); // 多个controller存在代码耦合
  2. 通过反射进行创建:

Class clazz = Class.forName(“com.spring.service.UserServiceImpl”); // 可以通过配置文件进行解耦合 UserService userService = (UserService)clazz.newInstance();

  1. 通用的工厂模式:UserService userService = (UserService) BeanFactory.getBean(“userService”);
  1. // 创建一切想要的对象
  2. public class BeanFactory {
  3. public static Object getBean(String key) {
  4. Object bean = null;
  5. try {
  6. Class clazz = Class.forName(env.getProperty(key)); // 可以通过key从配置文件中获取到bean的具体全限定名
  7. bean = clazz.newInstance();
  8. } catch (Exception e){}
  9. return bean;
  10. }
  11. }

b. 代理设计模式
c. 模版设计模式
d. 策略设计模式
总结:Spring是一个完整体系的JavaEE解决方案。