Spring框架的使用

前言

 

    Spring框架在SSH中属于重量级框架,用于业务逻辑类的注入,虽是用来开发服务端,但是Spring也不局限于服务端的开发。ITOO中接触了Spring,利用类名的注解来获得类的实例,在Java中也是一样的效果。

 

什么是Spring

 

    Spring是一个开源的,轻量级的Java开发框架,它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是分层架构,分层架构允许使用者选择使用组件。Spring使用基本的JavaBean来完成以前只可能有EJB完成的事情。Spring的核心是控制反转(IoC)和面向切面(AOP)。

 

Spring的组成模块

 

    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框架编程为高度可配置的。

 

Spring框架的核心

 

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,它将日志记录的服务拿出来,只对每个对象拦截,进行日志记录,这样实现类就不需要知道日志记录服务的存在了。

                                                                                 

 

Spring使用

 

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>

 

 

配置log4j.properties,主要是做日志记录,就像ITOO中引用的log4net.dll

 

### 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

 

 

applicationContext.Xml中配置Spring的注解

 

<?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学习的第一个项目,对于什么东西的了解都还很浅,很浅,只能停留在表面上,没有办法深入。对这些技术的理解也仅限于在原理上,还是需要在实践中用。在做这个 项目的过程中,查了很多东西,发现自己不是懂得太少,而是知道的太少。就像别人用了很长时间的技术,知道的越早,越是有利。

 

 

 

 

 

 

 

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值