SSM框架实战系列之七_Spring框架
来源:互联网 发布:黑苹果mac os安装教程 编辑:程序博客网 时间:2024/05/18 00:46
SSM框架实战系列之七_Spring框架
从本节开始,我们将分别讲解Spring框架、SpringMVC框架、MyBatis框架。
由于之前在搭建Maven项目时,已经在pom.xml文件中指定了所有必需的软件依赖,所以后面就只讲解这些框架怎么应用。
一、什么是Spring框架?
Spring框架是一个轻量级的控制反转(IoC)和面向切面编程(AOP)的容器框架。
J2EE早先提供了企业级应用开发框架EJB,然而这个框架太重;学习EJB的高昂代价,和极低的开发效率,极高的资源消耗,都造成了EJB的使用困难;Spring出现的初衷就是为了解决类似的这些问题。
Spring的一个最大的目的就是使J2EE开发更加容易;Spring与Struts、Hibernate等单层框架不同的是,Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起,建立一个连贯的体系。
Spring框架的架构如下图所示:
从图中可以看到,Spring框架拆分得比较细,从下往上看,“Core Container(核心容器)”部分是Spring框架的内核,再上一层就是“AOP(面向切面编程)”部分,再上一层是Web部分和数据处理部分。
当前Spring框架版本为4。
二、Spring框架的主要特性
Spring框架有几个主要特性,分别是:控制反转(IoC)、依赖注入(DI)、面向切面编程(AOP)。
1、控制反转
假设有一家汉堡店的软件系统中,设计了汉堡类和三个子类(鸡腿堡、牛肉堡、鱼肉堡)。
以前我们创建对象通常这么写:Hamburger hamburger = new FishHamburger();
这种情况下,对象的创建由应用程序来完成,主要缺点是代码中硬编码了子类,代码的灵活性较差,例如要修改成吃另一种汉堡,就必须修改源代码。
在引入Spring框架后,对象的创建由Spring框架负责,应用程序不再负责对象的创建,这就叫控制反转,即控制权从应用程序转给了Spring框架。
在Spring配置文件中这么写:
<bean id="hamburger" class="FishHamburger" />
今后如果要换成另一种汉堡,修改Spring配置文件即可。
2、依赖注入
假设在上述汉堡店的软件系统中,汉堡的配料必须用到番茄酱,而番茄酱有三种:甜番茄酱、酸番茄酱、辣番茄酱。
以前我们是这么写的:
public class Hamburger {
private Ketchup ketchup = new SweetKetchup();
}
这样写实际上汉堡类中也是硬编码了番茄酱类的子类,如果换一种酱,还是需要修改源代码。
“依赖注入”中的“依赖”,表示一个类使用了另一个类作为属性,“注入”,表示为属性赋值。
使用了依赖注入之后,应用程序不需要再为属性赋值:
public class Hamburger {
private Ketchup ketchup;
}
而是在Spring框架的配置文件中使用依赖注入,即使用property定义属性,ref表示属性的值来源于另一个bean:
<bean id="ketchup" class="SweetKetchup" />
<bean id="hamburger" class="FishHamburger" >
<property name="ketchup" ref="ketchup" />
</bean>
这里还必须强调的是,编程中应依赖于接口编程,而不应依赖于实现类,例如在我的业务逻辑层类中,会使用到数据处理层,此时应该为数据处理层定义接口,然后在业务逻辑层中,定义接口类型的属性。
例如SchoolDao接口中有增删改查方法,然后又编写了一个实现类SchoolDaoImpl。
此时,SchoolServiceImpl类的代码应为:
public class SchoolServiceImpl {
private SchoolDao schoolDao; // 依赖于接口而不应依赖于实现类
}
3、面向切面编程
面向切面编程,即AOP(Aspect Oriented Programming)。所谓切面,是指每个模块都要用到的通用功能,以前可能是在每个模块中都复制粘贴类似的代码,而面向切面编程,就是将这些通用代码抽取出来,通过定义切面的方式织入特定位置。这些通用功能包括事务、日志等。
三、Web项目中加载Spring框架
在Web项目中可以通过配置web.xml文件来加载Spring框架。
通常有两种加载方式:
1、Servlet方式
在web.xml中添加如下Servlet定义:
<servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup></servlet>ContextLoaderServlet类会读取Spring框架的配置文件(默认为applicationContext.xml),并根据配置文件初始化Spring框架。
2、监听器方式
监听器是较新的Web版本才支持的功能,配置如下:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:config/spring-*.xml</param-value></context-param><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>ContextLoaderListener类与ContextLoaderServlet类功能类似,都可加载配置文件,并初始化Spring框架。此处还配置了配置文件的路径(配置了类路径下,config目录中所有以spring开头的配置文件)。
在web.xml中,最好再指定一下字符编码:
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf8</param-value> </init-param></filter><filter-mapping> <filter-name>encodingFilter</filter-name > <url-pattern>/*</url-pattern></filter-mapping>
四、Spring配置文件
在resources文件夹下,新建一个config文件夹,并在其中添加一个名为spring-beans.xml的xml文件,内容如下:
<?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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"><mvc:annotation-driven /><context:component-scan base-package="com.hanhf" /></beans>这里我们不准备使用传统的在Spring配置文件定义bean的方式,而是采用了注解驱动的开发,即控制反转和依赖注入都由注解来完成,下一节会仔细讲解注解的使用。
由于采用了注解驱动的开发,所以定义了<mvc:annotation-driven />即注解驱动,<context:component-scan base-package="com.hanhf" />即组件扫描,表示扫描根包下的所有类并解析其中的注解。
最后,贴出代码清单。
web.xml文件:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><display-name>ssmprj</display-name><!-- 加载spring框架 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:config/spring-*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 编码过滤器 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>
spring-beans文件:
<?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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"><mvc:annotation-driven /><context:component-scan base-package="com.hanhf" /></beans>
项目的目录结构:
- SSM框架实战系列之七_Spring框架
- SSM框架实战系列之九_SpringMVC框架
- SSM框架实战系列之十_MyBatis框架
- SSM框架实战系列之十三_H-ui框架之一
- SSM框架实战系列之三_Maven之二
- SSM框架实战系列之二_Maven之一
- SSM框架实战系列之八_注解
- SSM框架实战系列之十一_MyBatis框架之DAO代码
- SSM框架实战系列之十二_MyBatis框架之动态查询
- java,ssm框架实战
- SSM框架项目搭建系列(七)—Spring AOP之基于注解的声明式AspectJ
- SSM框架实战系列之四_第一个Maven项目
- SSM框架实战系列之五_Maven项目的目录结构
- SSM框架实战系列之六_基于Maven的Web项目的运行与调试
- 权限框架_Spring Security
- unittest框架实战(七)
- 《SSM框架实战》 整合 Freemarker
- HTML系列之七-框架
- 。。
- Pace 11 (顺序表的增删改查)
- RGB HSV- 转载
- Python使用K-means聚类算法进行分类案例一则
- Linux内核移植(3)
- SSM框架实战系列之七_Spring框架
- 织梦dedecms修改include和plus重命名提高安全性防漏洞注入挂马
- 第一次测试,三四两题
- Akka(40): Http:Marshalling reviewed
- 最短路径求算
- 红黑树插入 删除演示过程
- 三栏自适应布局
- 经典美文诵读2 If I Were a Boy Again假如我又回到了童年
- 牛客练习赛7:B-购物 (dp)