通过上篇博客我们创建了第一个Spring示例,发现使用Spring开发和使用传统方式(直接new 一个实例)开发并没有什么不同,反而感觉还变复杂了。其实根本原因是我们那个Hello World示例太简单,完全没有体现出Spring的价值。俗话说,磨刀不误砍柴工,先把基础打牢了,结实了,后面真正参与到大型项目开发中,才能游刃有余。
本篇博客将给出Spring的简介,包括:Spring是什么,Spring能做什么,Spring框架方面的一些基本知识。
1、Spring是什么
Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级的Java开源框架,其目的主要是用于简化企业级应用程序开发。
(1)分层的:
Spring 框架是一个分层架构,由 六个模块组成:核心容器,Spring上下文,Spring AOP,Spring DAO,Spring ORM,Spring Web 模块(包括Spring MVC 框架),允许开发者随意选择其中某一或多个模块使用;
(2)一站式的:
Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring是企业应用开发的“一站式”选择,并贯穿表现层、业务层及持久层。
(3)轻量级的:
Spring框架在系统初始化的时候不需要加载所有的服务,为系统节约了资源,当然轻量级和重量级也是相对的。
(4)开源框架:
Spring的源代码是开放的,可以私人定制。
此外,Spring不是封闭的,还可以和其他一些框架对接使用,比如常见的“三剑客”Spring,Struts,Hibernate。
2、Spring能做什么(为什么使用Spring)
首先看一下传统应用程序是如何开发的,比如在service层需要使用Dao层的对象,通过new一个对象,如下:
package com.spring.model;
public class User {
private String userName;
private String userAge;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserAge() {
return userAge;
}
public void setUserAge(String userAge) {
this.userAge = userAge;
}
}
package com.spring.Dao;
import com.spring.model.User;
public class UserDao {
public void insert(User user){
System.out.println("insert the record into databases!");
}
}
package com.spring.service;
import com.spring.Dao.UserDao;
import com.spring.model.User;
public class UserService {
public void insert(User user){
UserDao userDao = new UserDao();
userDao.insert(user);
}
}
显然上述代码存在问题:在UserService中要想使用UserDao的实例,需要先new一个UserDao一个对象,因而UserService 和UserDao是紧耦合的,层与层之间存在严重的依赖关系。
如果使用了Spring以后,代码可以修改为松耦合的,修改UserService 如下:
package com.spring.service;
import com.spring.Dao.UserDao;
import com.spring.model.User;
public class UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void insert(User user){
userDao.insert(user);
}
}
编写spring-application.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<bean id="userDao" class="com.spring.Dao.UserDao">
</bean>
<bean id="userService" class="com.spring.service.UserService">
<property name="userDao" ref="userDao" > </property>
</bean>
</beans>
可以看到在UserService没有直接创建 UserDao实例,而是在XML中配置,由Spring框架去创建。
除了上述的Spring能够将组件及其协作的其他组件之间解耦,还能够提供如下功能:
(1)Spring能帮我们根据配置文件(注解方式可以转换为配置文件形式)创建及组装对象之间的依赖关系(IOC);
(2)Spring的面向切面编程(AOP)支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用;
(3)Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并对底层数据库的处理提供了很好的封装,比如JdbcTemplate,JPA等;
(4)编写一些业务类的代码的时候不需要继承Spring特定的类,通过配置完成依赖注入后就可以使用,因而Spring是非侵入式的。
(5)Spring默认对象的创建为单例的,我们不需要再使用单例的设计模式来开发单体类。
Spring给我们开发提供如此强大的支持,使得我们无须过多关注非业务相关代码的开发,学习Spring是有很大意义的。
3、Spring框架基本知识
介绍Spring基本知识之前,首先研究一下Spring的分层架构:
(1)核心容器(IOC)
Spring框架的核心部分,它提供了依赖注入(Dependency Injection)特征来实现IOC容器对Bean的管理。IOC(控制反转)容器的核心组件是BeanFactory,其是工厂模式的一个实现。BeanFactory使用IOC机制将应用配置和依赖说明从实际的应用代码中分离出来。
(2)Spring AOP
在AOP模块中,Spring提供了对面向切面编程功能。该模块提供了比如日志记录、性能统计,安全控制等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中。
(3)Spring DAO
我们知道在使用JDBC时经常需要编写大量的重复代码代码,比如获得数据库连接、创建SQL语句、处理结果集,关闭数据库连接。Spring的DAO模块提取这些重复的代码,封装成一个统一的接口,使得开发过程中无须关注上述问题,不仅能够提高开发的速度,还能保证代码的质量。此外,还提供了Spring的事务管理服务。
(4)Spring上下文
程序的上下文就是程序运行的环境,在Spring中主要指Spring的配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
(5)Spring ORM
Spring的ORM模块为几种流行的ORM框架提供了集成方案,包括Hibernate、JDO和iBATIS SQL映射
(6)Spring WEB
Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。
(7)Spring MVC
Spring MVC是构建在Spring理念之上的一个WEB框架,其基于模型-视图-控制器(Model-View-Controller)模式实现的,能够帮助我们构建像Spring框架那样灵活和松耦合的Web应用程序。
Spring是一个功能强大的开源框架,要想将其学好,要有持之以恒的毅力。