EJB的学习成本很高,开发效率却不高,需要编写很多重复的代码,这些问题阻止了EJB的继续发展。就在EJB技术止步不前的时候,Spring框架在合适的时机出现了,Spring框架和EJB不同,Spring框架的学习成本非常低,它是一个轻量级的开发框架,更多强调面向对象的设计,而不是让现有的技术变得更复杂,它使用JavaBean替代了复杂的EJB,并且为JavaBean提供了简单易用的应用配置框架。
一个JavaBean就是一个公共类,它可以被其它JavaBean类作为组件来使用,并且JavaBea之间的组配不需要在代码级实现,完全可以在配置层和注解层实现,Spring会自动选择相适配的JavaBean来组配运行。这种自动适配机制避免了JavaBean与使用类之间的代码耦合,提高了程序的可扩展性和维护性。
例如类A要使用类B,类B是类A的属性,如果直接在类A中创建类B,当类B因业务需要修改时,也需要修改类A的代码,这种写法就是代码耦合,也可以说类A和类B属于代码耦合。
假如我们把类B的创建交给Spring,Spring通过配置文件或者通过Java注解来创建类B,然后再由Spring把创建的类B实例和类A的实例组配起来,这样就避免了类A与类B的代码耦合。这种机制就是Spring框架的控制反转思想,相当于类A把创建类B权利交给了Spring,由Spring来控制类B的创建。
Spring框架还有一个比较重要的功能,那就是AOP机制。Spring框架的AOP机制可以把系统中的一些通用功能抽取出来,作为JavaBean来使用,与此同时在系统的业务流程代码中设置调用这些JavaBean功能的切入点,当系统业务流程执行到切入点时,Spring会自动把需要调用的JavaBean横向切入到业务流程指定的位置,AOP的这种技术也称为“横切”技术。
例如,在一个业务系统中,当用户要进入需要操作权限的页面时,系统会先进入登录页,要求用户登录系统后再进入该页面。这样的操作权限页面会有多个,如果为每个页面都写登录业务逻辑处理代码,显然是会造成代码冗余,维护起来也非常麻烦。比较好的做法是把用户登录业务处理作为一个独立的JavaBean,这个JavaBean也称为AOP的“切面”。然后在需要用户操作权限的业务流程页面设置“切入点”,并通过注解或配置文件将“切面”和“切入点”连接起来。当业务流程执行到“切入点”时,Spring框架会自动把与切入点关联的“切面”切入到业务流程“切入点”所在的位置,开始执行“切面”代码,直至切面代码执行完毕,然后根据“切面”返回的结果确定是否执行后面的流程。下图是用户登录功能切入到业务流程的示意图。
Spring框架还有一个最大的特征就是和现有的开发框架不是竞争关系,而是采用融合的方式将其它框架集成进来,充分利用其它框架的技术,为系统实现提供最优解决方案。SSM就是Spring框架融合了MVC框架技术和MyBatis数据库框架技术。