[置顶] 【SSH进阶之路】Spring简介,搭建Spring环境――轻量级容器框架(一)
来源:程序员人生 发布时间:2015-01-12 08:59:32 阅读次数:3563次
经过对Struts和Hibernate的学习,我们酷寒的冬季(Hibernate),终究迎来了阳光灿烂的春季(Spring)。在系列博客开篇【SSH进阶之路】Struts
+ Spring + Hibernate 进阶开端(1),我们介绍了Spring的基本概念,和比较重要的两大核心IoC和AOP,基本上介绍的比较简单,1句话带过。从这篇博客开始,我们开始重新介绍Spring框架的基本理论,并搭建1个简单的Spring开发环境。
Spring是甚么?
Spring是1个集成了许多第3方框架的大杂烩,其核心技术是IOC(控制反转,也称依赖注入)和AOP(面向切面编程),所以spring既是1个IoC容器,也是1个AOP框架。知道了甚么是Spring是学习的开端,下面说1下为何使用Spring。
为何使用Spring?
我们知道没有Spring,Struts和Hibernate可以很好的工作,在开篇中我把没有Spring的架构称为“独木桥”,有Spring的架构称为“阳光大道”。说白了,Spring解决了企业利用开发的复杂性,用基本的javaBean来完成EJB的事情,从大小和开消方向说,Spring都是轻量级的。Spring具有很多的优点:
1、使我们的分层更好。
SSH框架系统从职责上分为4层:表示层、业务逻辑层、数据持久层和域模块层(实体层)。
从上图我们可以看到Spring处于业务逻辑层,担负连接Struts和Hibernate桥梁的角色。系统的全部层次关系可以1目了然。
2、对象管理更好。
从上图,我们看到Spring将Transactions、Session和业务层服务都放到了业务逻辑层来管理。系统的条理变得更加清晰,不但使持久化层的职责更加单1,而且提高了系统的灵活性。
3、AOP
面向切面编程,AOP让开发人员创建非行动性的关注点,并将它们插入到利用代码红。公共服务(比如日志、持久性、事务等)就能够就能够分解成方面并利用到域对象上,同时不会增加域对象的对象模型的复杂性。
4、IoC
IoC,用白话来说,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由利用代码中转到了外部容器,控制权的转移,是所谓反转。
用处
对Spring的用处很多,但是Spring的核心和经典我们可以简化为3部份:
1、IoC容器可以将对象之间的依赖关系交由Spring管理,进行控制。
2、AOP方便进行面向切面编程,是oop的扩大,想加甚么功能直接加。
3、能够集成各种优秀的框架,struts、Hibernate等等,还有很多,不再逐一罗列。
架构图
相信你能看出来这是Spring的架构图,Spring包括了许多的特性,其实都包括在6个模块中:Core、AOP、DAO、ORM、JEE和Web,其实我们对它们其实不陌生,当你学习或使用Spring时,最少已使用了3部份的内容:DAO、ORM(对象关系映照)、Web。下面我们逐一看1下:
1、DAO
DAO框架封装了所有的数据库访问的操作,Spring提供了对DAO的支持,还有模版jdbc,进1步封装了jdbc。不论是Spring jdbc还是各种ORM框架(Hibernate、iBatis、MyBatis),它们都对JDBC做了进1步的封装,使数据访问层的操作更加灵活、易用。固然,它们也各有各的优缺点,在项目技术选型时非常重要的1项。同时,Spring还可以集成第3方的框架。
2、ORM
Spring提供了对ORM框架的支持,能够集成大多主流的ORM框架。JPA是1个java持久化注解的规范,Hibernate是1种对JPA的实现。TopLink是Oracle的1个ORM框架;JDO是sun公司的1个规范。OJB是appach的。IBatis不是严格意义上的ORM,ORM1般是对云数据的映照,描写类和属性,它是基于SQL的映照器。由于ORM框架层见叠出,种类繁多,大家可以自行查1下它们是哪一个公司的产品,和各自优缺点等等。
3、Web
Spring不但具有自己的表示层SpringMVC,同上面1样,它还也能够支持第3方的表示层框架struts,webwork,和1些第3方的工具。
这篇博文,我们剩下Spring最核心的3部份,后面的博文我会逐一详细介绍。下面我们搭建1个Spring的添加用户的开发环境:
搭建Spring开发环境
1、下载SpringFramework,并解紧缩到指定目录。我使用的是Spring3.2.9,使用哪一个版本无所谓只要将jar加入到项目便可。
2、在IDE中新建1个java项目,并将Spring所需jar加入到项目中,我所用IDE为MyEclipse。
3、Spring采取Apache common_logging,并结合Apache log4j作为日志输出组件。为了在调试进程中能视察到Spring的日志输出,在CLASSPATH中新建log4j.properties配置文件,内容以下:
<span style="font-size:12px;">log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n</span>
4、提供Spring配置文件applicationContext.xml。
5、编写代码
配置完成以后,目录结构以下图所示:
UserDao接口
public interface UserDao {
public void addUser(String userName,String password);
}
UserDao的实现
UserDao4MysqlImpl
public class UserDao4
MySqlImpl implements UserDao {
public void addUser(String userName,String password){
System.out.println("UserDao4
MySqlImpl.addUser()");
System.out.println("userName="+userName);
System.out.println("password="+password);
}
}
UserDao4Oracelmpl
<span style="font-size:12px;">public class UserDao4
OracleImpl implements UserDao {
public void addUser(String userName,String password){
System.out.println("UserDao4
OracleImpl.addUser()");
System.out.println("userName="+userName);
System.out.println("password="+password);
}
}</span>
UserManager接口
public interface UserManager {
public void addUser(String userName,String password);
}
UserManager的实现
import com.liang.spring.dao.UserDao;
public class UserManagerImpl implements UserManager {
//定义1个成员变量,使用构造方式赋值
private UserDao userDao;
public UserManagerImpl(UserDao userDao) {
this.userDao = userDao;
}
/**
* set注入
* @param userDao
*/
// public void setUserDao(UserDao userDao) {
// this.userDao = userDao;
// }
@Override
public void addUser(String userName, String password) {
userDao.addUser(userName, password);
}
}
客户端
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.liang.spring.manager.UserManager;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
//由我们的利用程序负责服务(对象)定位
//这是1个组装进程,userManager用userDao,这类关系是用程序描写的,现在用配置文件描写
//UserManager userManager = new UserManagerImpl(new UserDao4
MySqlImpl());
//userManager.addUser("张3", "123");
//BeanFactory是1个接口,有不同的实现,ClassPathXmlApplicationContext是对beanFactory的实现
//把applicationContext.xml读进来
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
//ApplicationContext都实现了beanFactory的接口
//ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
//getBean加产品标识,相当与userManager的实现,再转化为userManager的接口
UserManager userManager =(UserManager)factory.getBean("userManager");
userManager.addUser("jiuqiyuliang", "123456");
}
}
Spirng的配置文件:applicationContext.xml
<?xml version="1.0" encoding="UTF⑻"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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⑵.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop⑵.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx⑵.0.xsd">
<!-- id是唯1性标识,不能重-->
<!-- 相当于工厂1样-->
<bean id="userDao4Mysql" class="com.liang.spring.dao.UserDao4
MySqlImpl"></bean>
<bean id="userDao4
Oracle" class="com.liang.spring.dao.UserDao4
OracleImpl"></bean>
<!-- userManager使用userDao接口,userDao使用构造函数将依赖关系给userManager-->
<!-- userManager依赖哪写dao,IoC容器不但是1个工厂,它提供了管理依赖的能力。
-->
<bean id="userManager" class="com.liang.spring.manager.UserManagerImpl">
<!-- 使用的构造函数,描写了1个种依赖关系。userManager依赖于Mysql的实现
容器提供了查找能力,找到以后new好,以后会给userManager,放到userManager的进程
为DI,依赖注入。(主动注入)-->
<constructor-arg ref="userDao4Mysql"></constructor-arg>
<!--或
<constructor-arg ref="userDao4
Oracle"></constructor-arg>
-->
</bean>
</beans>
在上面的配置文件中可以自由的切换各种数据库的实现,DAO层的灵活性可想而知。
项目的测试结构:
大家对不明白的地方看代码中的注释便可,我给大家提供两个版本的源码:
Spring2与源码
Spring3.2.9与源码
总结
最后,今天先介绍这么多,我们对Spring的认识才刚刚开始,仅是冰山1角。对Spring,我更喜欢用下面的8个字形容:海纳百川,有容乃大。
下篇博文介绍IoC的几种注入方式,谢谢关注。
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠