Struts:Action
Hibernate:DAO(一个接口,一个实现类)
Spring:Bean的管理-->Spring容器(IOC、AOP)
Struts2:优势:(最主要的是前两点)
基于MVC思想,将模型返回的数据与显示逻辑分离。
提供内存式的数据中心,所有可供访问的数据都集中在内存中,所以调用中不需要将数据库传来传去,只需要在这个内存数据中心访问即可;
强大的标签;
良好的Ajax支持。
Hibernate优势:业务逻辑层不需要考虑数据库具体操作内容,只需要调用DAO接口中的相应方法(把相应对象传入、传出),就可以实现底层数据库的操作。
对于Hibernate,不用知道他们怎么实现的,我只需要去声明UserDAO接口,用UserDAOImpl对象实例化它,之后调用UserDAO接口中的方法,就可以实现与数据库的交互!(一般是在Action类对象中,进行操作)
Spring专注于基础设施,这使得开发者可以更好地致力于应用开发而不用关心底层的架构。
其核心功能适用于任何Java应用。对于Web程序来说,一般用在服务端。
Spring优势:业务层框架
能有效地组织中间层对象。例如:Struts2与Hibernate框架
面向接口编程,可实现组件之间的高度解耦,而面向接口编程是一种良好的编程习惯。
提高了代码的可重用性。
为数据存储提供了一个一致的框架,简化了底层数据库的访问方式。
IOC:依赖注入(控制反转)
传统:由调用者创建被调用者的实例;Spring框架中,调用者不负责被调用者的实例创建工作,转由Spring容器来控制,创建后再注入调用者。(降低了Java实例对象之间耦合性)
AOP:面向切面编程
是面向对象编程(OOP)的补充和完善。
当需要为多个分散对象加入一些公共行为时,OOP就显得力不从心了,换句话说,OOP定义的是从上到下的关系,但是并不适合定义从左到右的关系。
切面将那些与业务无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。
Spring框架模块
·核心容器:Core Container
Beans和Core模块实现了Spring框架最基本的功能,规定了创建、配置和管理Bean的方式,提供了IOC的特性。
·数据访问/集成模块:
由JDBC、ORM、OXM、JMS和Transaction这几个模块组成。
其中ORM模块为主流的对象关系映射API提供了集成层(包括Hibernate、IBatis等)
·Web模块
包括Web、Servlet、Struts、Portlet等几个模块,提供了额Spring的Web应用MVC实现。
·AOP和Instrumentation模块
面向切面编程的实现
·Test模块
支持使用JUnit和TestNG对Spring组件进行测试。
IOC好处:
解耦对象之间的依赖关系:当调用者需要被调用者时,调用者不需要知道被调用者的具体实现细节,只需要从容器中拿出一个对象使用就可以了。
例如:一个人需要一辆车,需要自己“创造”。
但是!当车辆属性等有变化时,就需要先改变车辆类,之后在人的操作方法中改变相应的内容。(可能有多处生成车辆,需要多处变化)。使用注入可以解决此类问题,只需要在Spring容器中改变相应内容即可,在使用的地方只改变使用新功能的部分。
这样的话,其是很类似于工厂模式的。
但是!在Spring中,其又进一步省略了寻找工厂的过程:当需要一个汽车对象时,Spring容器会自动将汽车对象注入到调用者对象中。
(核心是只需更改配置文件,少量动项目文件即可。)
实际开发过程:
先定义dao接口,其次实现dao接口(数据库连接等),再定义同类型的service接口(类似于action,由web层调用),再实现service接口。
Service层完成纯粹的业务逻辑,数据操作是通过注入dao接口来实现的。
3种依赖注入的实现方式:
·设值注入
Service中定义一个dao接口实例,但是由注入的方式设值。如下所示:
<bean id=”u” class=”com.UserDAOImpl”/>
<bean id=”userService” class=”com.UserServiceImpl”>
<property name=”userDAO”> //这个实在定义UserService时,类中定义的属性
<ref bean=”u”/> //注入前面定义的UserDAOImpl实例。
</property>
</bean>