Spring框架在SSH中属于重量级框架,用于业务逻辑类的注入,虽是用来开发服务端,但是Spring也不局限于服务端的开发。ITOO中接触了Spring,利用类名的注解来获得类的实例,在Java中也是一样的效果。
Spring是一个开源的,轻量级的Java开发框架,它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是分层架构,分层架构允许使用者选择使用组件。Spring使用基本的JavaBean来完成以前只可能有EJB完成的事情。Spring的核心是控制反转(IoC)和面向切面(AOP)。
Spring框架由七个模块组成,每个模块都可以单独存在,或者与其他一个或多个模块联合实现。
Spring Core
Spring Core是Spring框架的核心容器,提供了Spring框架的基本功能。它的主要组建是BeanFactory,是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring Context
Spring上下文是一个配置文件,向Spring框架提供上下文信息。
Spring AOP
SpringAOP通过配置管理特性,直接将面向界面的编程功能集成到了Spring框架中。Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。
Spring DAO
JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。
Spring ORM
Spring框架嵌入了多个ORM框架,从而提供了ORM的对象关系工具,其中就包括Hibernate。
Spring Web
Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。
Spring MVC
MVC框架时一个全功能的构建Web应用程序的MVC实现,通过策略接口,MVC框架编程为高度可配置的。
Ioc控制反转模式
控制反转模式类似于设计模式中的依赖倒转原则,当我们调用一个方法或者类时,不是由我们主动创建这个类的对象,而是将这个控制权交给别人。类似于RSS订阅,以前找资源是自己在网上逛,主动去寻找。现在有了RSS订阅,我们就可以等待资源推荐,被动的接受。
在代码中的应用是在类的注入,不是用Spring时,我们的Service调用Dao需要先new一个Dao的实例,然后进行调用,是我们主动进行的。
public class OrderService { //保存订单的业务层代码 public void save(Order order) { OrderDao orderDao = new OrderDao(); orderDao.save(order); } } public class OrderDao extends HibernateDaoSupport{ //Dao层的保存订单的方法 public void save(Order order) { this.getHibernateTemplate().save(order); } }
使用了Spring后,Service类中不用实例化Dao的类,只需要在配置文件中将Dao注入到Service中即可,至于对象是如何创建,则是由Spring框架来实现。
public class OrderService { private OrderDao orderDao; public void setOrderDao(OrderDao orderDao) { this.orderDao = orderDao; } //保存订单的业务层代码 public void save(Order order) { orderDao.save(order); } } public class OrderDao extends HibernateDaoSupport{ //Dao层的保存订单的方法 public void save(Order order) { this.getHibernateTemplate().save(order); } }
面向切面(AOP)
我们平常用的OOP开发方式,是将数据和对数据的操作紧密结合,作为一个整体对象。AOP的经典例子是日志服务的添加,例如,我们用OOP的方式来实现信息查询,但是我们还想记录谁来进行过查询,这样就需要在OOP中的每个实现类添加日志记录的服务,也就是日志记录的服务和每个实现类紧密耦合,这也违背了面向对象开发的本义。所以就有了AOP,它将日志记录的服务拿出来,只对每个对象拦截,进行日志记录,这样实现类就不需要知道日志记录服务的存在了。
1、引入Jar包
Spring3.2 开发最基本jar包
spring-beans-3.2.0.RELEASE.jar
spring-context-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.log4j-1.2.15.jar
AOP开发
spring-aop-3.2.0.RELEASE.jar
spring-aspects-3.2.0.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
Spring Jdbc开发
spring-jdbc-3.2.0.RELEASE.jar
spring-tx-3.2.0.RELEASE.jar
Spring事务管理
spring-tx-3.2.0.RELEASE.jar
Spring整合其他ORM框架
spring-orm-3.2.0.RELEASE.jar
Spring在web中使用
spring-web-3.2.0.RELEASE.jar
Spring整合Junit测试
spring-test-3.2.0.RELEASE.jar
2、配置文件配置
在Web.Xml中配置Spring核心监听器,用来监听对于一个Java对象的方法调用或属性改变。
<!-- 配置Spring的核心监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file mylog.log ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=c:/mylog.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=info, stdout
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- Action的配置 ===========================--> <!-- 首页访问的Action --> <bean id="indexAction" class="cn.itcast.shop.index.action.IndexAction" scope="prototype"> <property name="categoryService" ref="categoryService"/> <property name="productService" ref="productService"/> </bean> <!-- Service的配置 ===========================--> <!--后台登录的Service--> <bean id="adminUserService" class="cn.itcast.shop.adminuser.service.AdminUserService"> <property name="adminUserDao" ref="adminUserDao"/> </bean> <!-- Dao的配置 ===========================--> <!--后台登录的Dao--> <bean id="adminUserDao" class="cn.itcast.shop.adminuser.dao.AdminUserDao"> <property name="sessionFactory" ref="sessionFactory"/> </bean> </beans>
进入Java学习的第一个项目,对于什么东西的了解都还很浅,很浅,只能停留在表面上,没有办法深入。对这些技术的理解也仅限于在原理上,还是需要在实践中用。在做这个 项目的过程中,查了很多东西,发现自己不是懂得太少,而是知道的太少。就像别人用了很长时间的技术,知道的越早,越是有利。