Maven 构建 Spring MVC 项目的简单示例
Spring 是一个很优秀的基于Java的轻量级开源框架,为了解决企业级应用的复杂性而创建的,Spring不仅可用于服务器端开发,从简单性、可测试性和松耦合性的角度,任何java应用程序都可以利用这个思路进行开发,Spring的核心就是控制反转(Inversion of Control,IoC)和 面向切面(Aspect Oriented Programming,AOP)
控制反转(IoC)
控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup),依赖注入应用比较广泛。
IoC最大的好处是什么?
因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拔(有点像USB接口和SCSI硬盘了)。
IoC中最基本的Java技术就是“反射”编程。反射又是一个生涩的名词,通俗的说反射就是根据给出的类名(字符串)来生成对象,这种编程方式可以让对象在生成时才决定要生成哪一种对象。反射的应用是很广泛的,像Hibernate、Spring中都是用“反射”做为最基本的技术手段。
在过去,反射编程方式相对于正常的对象生成方式要慢10几倍,这也许也是当时为什么反射技术没有普遍应用开来的原因。但经SUN改良优化后,反射方式生成对象和通常对象生成方式,速度已经相差不大了(但依然有一倍以上的差距)。
IoC最大的缺点是什么?
1)生成一个对象的步骤变复杂了(事实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。
2)对象生成因为是使用反射编程,在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。
3)缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺陷所在。
总的来说,Spring是一个分层的Java轻量级框架。
控制反转 (IoC)
利用某种技术实现低耦合,对象之间相互的依赖关系是通过被动的方式传递进来,而不是对象主动进行另外对象的使用和查找,就是说控制权交给了容器,在初始化的时候,容器将实例化好的对象不用请求就主动传递过来,开发过程中不用进行任何的实例化对象就可以使用对象的方法,使用起来也感觉更加的轻松,所有的对象在Spring中都是一个bean,Spring提供了一种完善的javabean的依赖管理,实际上就是常说的依赖注入,是通过依赖注入的方式实现了控制反转的操作。
面向切面(AOP)
通过分离应用程序的业务逻辑和系统级服务,进行高内聚性的开发,应用对象只完成自己该完成的业务逻辑操作,其他的完全不必考虑,例如系统日志或其他事务等系统服务级操作对象完全不必关心,这样模块化更加清晰,更加适用于逻辑复杂的业务系统。
AOP(Aspect Oriented Programming,面向切面编程),通过 预编译方式 和 运行期动态代理 实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。在Spring中提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
主要功能: 日志记录,性能统计,安全控制,事务处理,异常处理等等。
主要意图: 将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
刚接触Spring时会出现很多不好理解的概念,下面从一个最简单的例子开始,进入Spring的学习,让Spring更加的形象。
Spring 官网: http://spring.io
首先看一下web.xml,通过查看log4j的日志可以发现在服务器启动时applicationContext.xml是先于Spring3-servlet.xml加载,因此applicationContext.xml中已经注册到BeanFactory的bean在Spring3-servlet.xml也是可以使用的,比如在applicationContext.xml中通过context:component-scan扫描了service和dao包,而在Spring3-servlet.xml只扫描了web包,但web包中的Controller依然被注入了Service。
web.xml 各个标签的加载顺序:context-param -> listener -> filter -> servlet
1、首先,项目结构
总结:主要是将配置文件配置好之后就不会有什么问题了。
在阅读《Maven实战》这本书的时候可以知道有一章是讲解关于继承和聚合的知识,这里主要的是Maven构建SpringMVC项目,所以DAO等这些都写到一起了。因为我也没有只用Maven进行过一个完整项目的实践,所以独立模块开发+聚合可以参考《Maven实战》这本书上面的示例讲解。作为初学者,有很多的东西要学。
附源代码地址:点击打开链接
Spring MVC 项目配置文件及代码如下:
2、pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>MavenTest</groupId> <artifactId>tan.maven.Springmvc</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>tan.maven.Springmvc Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <Springversion>3.1.1.RELEASE</Springversion> <junitversion>3.8.1</junitversion> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junitversion}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-aop</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-asm</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-aspects</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-beans</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-context</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-context-support</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-core</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-expression</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-jdbc</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-jms</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-orm</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-oxm</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-tx</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-web</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-webmvc</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-test</artifactId> <version>${Springversion}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1</version> </dependency> </dependencies> <build> <finalName>tan-Springmvc-book</finalName> </build> </project>
3、web.xml 配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" 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"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- Spring的log4j监听器 --> <listener> <listener-class>org.Springframework.web.util.Log4jConfigListener</listener-class> </listener> <!-- 核心控制器 --> <servlet> <servlet-name>book</servlet-name> <servlet-class>org.Springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <listener> <listener-class>org.Springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet-mapping> <servlet-name>book</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
4、applicationContext.xml 配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.Springframework.org/schema/beans" xmlns:aop="http://www.Springframework.org/schema/aop" xmlns:context="http://www.Springframework.org/schema/context" xmlns:mvc="http://www.Springframework.org/schema/mvc" xmlns:tx="http://www.Springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.Springframework.org/schema/aop http://www.Springframework.org/schema/aop/Spring-aop-3.0.xsd http://www.Springframework.org/schema/beans http://www.Springframework.org/schema/beans/Spring-beans-3.0.xsd http://www.Springframework.org/schema/context http://www.Springframework.org/schema/context/Spring-context-3.0.xsd http://www.Springframework.org/schema/mvc http://www.Springframework.org/schema/mvc/Spring-mvc-3.0.xsd http://www.Springframework.org/schema/tx http://www.Springframework.org/schema/tx/Spring-tx-3.0.xsd"> <mvc:annotation-driven /> <context:component-scan base-package="com.tan.*" /> <bean class="org.Springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
5、model:book.java
package com.tan.model; public class Book { private int id; private String name; private String author; public Book() { } public Book(int id, String name, String author) { super(); this.id = id; this.name = name; this.author = author; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } }
6、Dao:bookDao.java
package com.tan.dao; import org.Springframework.stereotype.Component; import com.tan.model.Book; @Component public class BookDao { // 模拟数据库操作 public void add(Book book) { System.out.print("Add"); } public void update(Book book) { System.out.print("Update"); } }
7、Service:BookService.java
package com.tan.service; import javax.annotation.Resource; import org.Springframework.stereotype.Component; import com.tan.dao.BookDao; import com.tan.model.Book; @Component public class BookService { private BookDao bookDao; public BookDao getBookDao() { return bookDao; } @Resource public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; } public void add(Book book) { bookDao.add(book); } public void update(Book book) { bookDao.update(book); } }
8、controller:BookController.java
package com.tan.controller; import javax.annotation.Resource; import org.Springframework.stereotype.Controller; import org.Springframework.web.bind.annotation.RequestMapping; import com.tan.model.Book; import com.tan.service.BookService; @Controller @RequestMapping("/book.do") public class BookController { private BookService bookService; @RequestMapping(params = "method=add") public String add(Book book) { System.out.println("bookname:" + book.getName()); System.out.println("author:" + book.getAuthor()); bookService.add(book); return "success"; } @RequestMapping(params = "method=update") public String update(Book book) { bookService.update(book); return "success"; } public BookService getBookService() { return bookService; } @Resource public void setBookService(BookService bookService) { this.bookService = bookService; } }
9、index.jsp
<html> <body> <h2>Add Book</h2> <form method="post" action="<%=request.getContextPath()%>/book.do?method=add"> bookname:<input type="text" name="name" id="name"> author:<input type="text" name="author" id="author"> <input type="submit" value="Add"> </form> </body> </html>
10、success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'success.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> Success! <br> </body> </html>
参考推荐:
Spring MVC 详细示例实战 (详细)
Spring 具体分析applicationContext.xml和Spring3-servlet.xml
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2017-04-23 08:02:47
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!