背景
J2EE开发企业软件时经常遇到以下两个问题
问题一:对象太多如何进行管理
问题二:相同逻辑与业务逻辑总是纠缠在一起,耦合性特别高
出现
Spring是一个轻量级、非侵入式的Java开源框架,为了简化企业开发。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE 应用程序开发提供集成的框架。Spring的核心是控制反转(IoC)和面向切面(AOP)。
未使用Spring
使用Spring
注:
IOC的实质是管理对象。传统开发使用new方式来创建对象,但在企业应用开发过程中,大量的对象创建都在程序中维护容易造成资源的浪费,不利于程序的扩展。
非侵入:框架的代码不会侵入到开发者自己的代码中,框架代码与开发者代码是分离的,仅通过配置文件来关联,解耦和;
侵入:框架的代码会掺和进开发者自己写的代码中。
核心
1、IOC:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。在典型的 IOC场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。
实例:
User类想调用Work类的方法AddWorkInfo()方法
以前:必须在在User类中这样写:
User user=new User(); user.AddWorkInfo()
现在: 配置文件ApplicationContext会对A和B间的调用关系进行管理
<bean id="workManager" class="com.bjpowernode.spring.manager.Work">
<bean id="userManager" class="com.bjpowernode.spring.dao.User"/>
<property name="userDao" ref="workManager"/>
</bean>
客户端:
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager userManager = (UserManager)factory.getBean("userManager");
userManager.addWork();
2、AOP:面向方面的编程,它允许程序员对横切关注点的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。
AOP 和 IOC是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。优势就是 Java类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应用程序代码是松散耦合的。
优点:
1.DI机制降低了业务对象替换的复杂性,使组件间解耦
2.AOP支持将通用任务如事务、日志等进行模块管理,提供了更好的复用
3.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
4.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
5.独立于各种应用服务器,基于Spring框架的应用,真正实现"一次编译,到处运行";
EJB VS Spring
EJB最初的设计思想是为分布式应用服务的,但现在大多数应用不需要采用分布式解决方案,因此EJB显得太臃肿。Spring的出现正好解决了这个问题。
相同点:
共同的核心设计理念:它们的目标是为松耦合的POJO类提供中间件服务。框架通过在运行时截取执行环境,或将服务对象注射给POJO类的方式,将应用服务和POJO类“连接”起来。POJO类本身并不关注如何“连接”,而且也很少依赖于框架。开发者可以将注意力集中在业务逻辑上,并且由于POJO类不需要继承框架的类或实现框架提供的接口,开发者可以在更加灵活性的基础上构建继承体系,和搭建应用。
不同点:
EJB规范一直由国际组织JCP来制定,一经通过,即作为官方标准,全球通用。你可以轻松的架构间进行切换。Spring来自开源社区,由众多的开源软件开发者参与,逐步形成有的一种流行的标准体系。最终的选择在设计之初一旦确定,要想更换便不那么容易,移植性差。
EJB 必须运行在 Java EE 应用服务器的 EJB 容器中,而 Spring 不必。
EJB 适合组件化的分布式应用,而 Spring 不适合这些。
Spring的编程接口主要基于XML配置文件,而EJB3.0则大量的使用了JAVA注解。XML文件可以表达复杂的关系,但是它们更加冗长而且不健壮。注解的方式很简单明了,但是很难去表达复杂的或者继承性的结构。
小结:
无论是Spring,还是EJB理解的还比较浅显,还不能说出孰优孰劣,随着以后的总结慢慢去深入和提升,然后根据实际情况决定使用哪一个。以后会在实践中再去反复总结和深入。