spring 是一个非常流行的基于java语言的开发框架,此框架用来构建web和企业应用程序。与许多其他仅关注一个领域的框架不同,spring框架提供了广泛的功能,通过其组合项目满足现代业务需求。
spring框架提供了以多种方式配置bean的灵活性,例如xml,注解和javaconfig。随着功能数量的增加,复杂性也会增加,配置spring应用程序变得乏味且容易出错。
spring团队创建了spring boot来解决配置的复杂性。
但在深入了解springboot之前,我们将快速浏览一下spring框架,看看springboot试图解决的问题是什么。
在本文中,我们将介绍:
如果你是 java 开发人员,那么你多半听说过 spring 框架,甚至可能在项目中使用过这一框架。spring 框架主要起源于一个依赖注入容器,但它远不止于此。
spring 之所以流行,是因为:
spring 除了框架之外,还有很多姊妹项目可以助力构建满足现代业务需求的应用程序:
还有不少其他有趣的项目,他们用于解决各种现代应用开发需求。欲知详情,请看 http://spring.io/projects。
spring 框架一开始提供了基于 xml 的方法来配置 bean。之后 spring 引入了基于 xml 的 dsl、注解和 javaconfig 来配置 bean 的方法。
让我们快速看看每种配置方式的样子。
基于xml的配置
基于注释的配置
基于javaconfig的配置
哇… spring提供了很多方法来做同样的事情,我们甚至可以混合使用这些方法,并在同一个应用程序中同时使用基于javaconfig和注解的配置方式。
但是没有一种适合所有类型的解决方案。必须根据自己的应用需求选择方法。
好了,现在您已经看到了各种样式的spring bean配置的例子。
让我们快速浏览一下典型的springmvc + jpa / hibernate web应用程序配置的样子。
使用spring mvc和jpa(hibernate)的web应用程序
在了解springboot是什么以及提供了什么样的功能之前,让我们先看看典型的spring web应用程序配置如何,难点又是什么,其次我们论述springboot将如何解决这些问题。
第1步:配置maven依赖项
首要的是我们需要配置pom.xml中所需的所有依赖项。
<?xml version="1.0" encoding="utf-8"?>
<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>com.sivalabs</groupid>
<artifactid>springmvc-jpa-demo</artifactid>
<packaging>war</packaging>
<version>1.0-snapshot</version>
<name>springmvc-jpa-demo</name>
<properties>
<project.build.sourceencoding>utf-8</project.build.sourceencoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<failonmissingwebxml>false</failonmissingwebxml>
</properties>
<dependencies>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-webmvc</artifactid>
<version>4.2.4.release</version>
</dependency>
<dependency>
<groupid>org.springframework.data</groupid>
<artifactid>spring-data-jpa</artifactid>
<version>1.9.2.release</version>
</dependency>
<dependency>
<groupid>org.slf4j</groupid>
<artifactid>jcl-over-slf4j</artifactid>
<version>1.7.13</version>
</dependency>
<dependency>
<groupid>org.slf4j</groupid>
<artifactid>slf4j-api</artifactid>
<version>1.7.13</version>
</dependency>
<dependency>
<groupid>org.slf4j</groupid>
<artifactid>slf4j-log4j12</artifactid>
<version>1.7.13</version>
</dependency>
<dependency>
<groupid>log4j</groupid>
<artifactid>log4j</artifactid>
<version>1.2.17</version>
</dependency>
<dependency>
<groupid>com.h2database</groupid>
<artifactid>h2</artifactid>
<version>1.4.190</version>
</dependency>
<dependency>
<groupid>commons-dbcp</groupid>
<artifactid>commons-dbcp</artifactid>
<version>1.4</version>
</dependency>
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<version>5.1.38</version>
</dependency>
<dependency>
<groupid>org.hibernate</groupid>
<artifactid>hibernate-entitymanager</artifactid>
<version>4.3.11.final</version>
</dependency>
<dependency>
<groupid>javax.servlet</groupid>
<artifactid>javax.servlet-api</artifactid>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupid>org.thymeleaf</groupid>
<artifactid>thymeleaf-spring4</artifactid>
<version>2.1.4.release</version>
</dependency>
</dependencies>
</project>
我们已经配置好了所有maven jar依赖项,包括spring mvc,spring data jpa,jpa / hibernate,thymeleaf和log4j。
@configuration
@enabletransactionmanagement
@enablejparepositories(basepackages="com.sivalabs.demo")
@propertysource(value = { "classpath:application.properties" })
public class appconfig
{
@autowired
private environment env;
@bean
public static propertysourcesplaceholderconfigurer placeholderconfigurer()
{
return new propertysourcesplaceholderconfigurer();
}
@value("${init-db:false}")
private string initdatabase;
@bean
public platformtransactionmanager transactionmanager()
{
entitymanagerfactory factory = entitymanagerfactory().getobject();
return new jpatransactionmanager(factory);
}
@bean
public localcontainerentitymanagerfactorybean entitymanagerfactory()
{
localcontainerentitymanagerfactorybean factory = new localcontainerentitymanagerfactorybean();
hibernatejpavendoradapter vendoradapter = new hibernatejpavendoradapter();
vendoradapter.setgenerateddl(boolean.true);
vendoradapter.setshowsql(boolean.true);
factory.setdatasource(datasource());
factory.setjpavendoradapter(vendoradapter);
factory.setpackagestoscan("com.sivalabs.demo");
properties jpaproperties = new properties();
jpaproperties.put("hibernate.hbm2ddl.auto", env.getproperty("hibernate.hbm2ddl.auto"));
factory.setjpaproperties(jpaproperties);
factory.afterpropertiesset();
factory.setloadtimeweaver(new instrumentationloadtimeweaver());
return factory;
}
@bean
public hibernateexceptiontranslator hibernateexceptiontranslator()
{
return new hibernateexceptiontranslator();
}
@bean
public datasource datasource()
{
basicdatasource datasource = new basicdatasource();
datasource.setdriverclassname(env.getproperty("jdbc.driverclassname"));
datasource.seturl(env.getproperty("jdbc.url"));
datasource.setusername(env.getproperty("jdbc.username"));
datasource.setpassword(env.getproperty("jdbc.password"));
return datasource;
}
@bean
public datasourceinitializer datasourceinitializer(datasource datasource)
{
datasourceinitializer datasourceinitializer = new datasourceinitializer();
datasourceinitializer.setdatasource(datasource);
resourcedatabasepopulator databasepopulator = new resourcedatabasepopulator();
databasepopulator.addscript(new classpathresource("data.sql"));
datasourceinitializer.setdatabasepopulator(databasepopulator);
datasourceinitializer.setenabled(boolean.parseboolean(initdatabase));
return datasourceinitializer;
}
}
在 appconfig.java 所描述的配置类中,我们做了下面的事情:
我们需要在 application.properties 中配置占位属性值:
创建简单的 sql 脚本,data.sql,将示例数据填入 user 表中:
创建 log4j.properties 文件,在其中写一些基础配置:
我们必须配置thymeleaf viewresolver,静态resourcehandlers,适用于国际化的messagesource,等等。
@configuration
@componentscan(basepackages = { "com.sivalabs.demo"})
@enablewebmvc
public class webmvcconfig extends webmvcconfigureradapter
{
@bean
public templateresolver templateresolver() {
templateresolver templateresolver = new servletcontexttemplateresolver();
templateresolver.setprefix("/web-inf/views/");
templateresolver.setsuffix(".html");
templateresolver.settemplatemode("html5");
templateresolver.setcacheable(false);
return templateresolver;
}
@bean
public springtemplateengine templateengine() {
springtemplateengine templateengine = new springtemplateengine();
templateengine.settemplateresolver(templateresolver());
return templateengine;
}
@bean
public thymeleafviewresolver viewresolver() {
thymeleafviewresolver thymeleafviewresolver = new thymeleafviewresolver();
thymeleafviewresolver.settemplateengine(templateengine());
thymeleafviewresolver.setcharacterencoding("utf-8");
return thymeleafviewresolver;
}
@override
public void addresourcehandlers(resourcehandlerregistry registry)
{
registry.addresourcehandler("/resources/**").addresourcelocations("/resources/");
}
@override
public void configuredefaultservlethandling(defaultservlethandlerconfigurer configurer)
{
configurer.enable();
}
@bean(name = "messagesource")
public messagesource configuremessagesource()
{
reloadableresourcebundlemessagesource messagesource = new reloadableresourcebundlemessagesource();
messagesource.setbasename("classpath:messages");
messagesource.setcacheseconds(5);
messagesource.setdefaultencoding("utf-8");
return messagesource;
}
}
在我们的webmvcconfig.java配置类中我们完成以下操作:
目前我们没有要配置的信息,所以在src/main/resources文件夹下创建一个空的messages.properties文件。
在servlet 3.x规范之前我们必须在web.xml注册servlets/filters。自从servlet 3.x规范出台我们能够使用servletcontainerinitializer以编程方式注册servlets/filters。
spring mvc提供了一个方便的类abstractannotationconfigdispatcherservletinitializer用于注册dispatcherservlet.
public class springwebappinitializer extends abstractannotationconfigdispatcherservletinitializer
{
@override
protected class<?>[] getrootconfigclasses()
{
return new class<?>[] { appconfig.class};
}
@override
protected class<?>[] getservletconfigclasses()
{
return new class<?>[] { webmvcconfig.class };
}
@override
protected string[] getservletmappings()
{
return new string[] { "/" };
}
@override
protected filter[] getservletfilters() {
return new filter[]{ new openentitymanagerinviewfilter() };
}
}
在springwebappinitializer.java中我们已经完成了以下的事情:
第五步:创建jpa实体和spring data jpa repository
创建jpa实体user.java和user实体对应的spring data jpa repository。
@entity
public class user
{
@id @generatedvalue(strategy=generationtype.auto)
private integer id;
private string name;
//setters and getters
}
public interface userrepository extends jparepository<user, integer>
{
}
第六步:创建spring mvc控制器
创建springmvc控制器来处理”/”url请求并返回用户列表。
@controller
public class homecontroller
{
@autowired userrepository userrepo;
@requestmapping("/")
public string home(model model)
{
model.addattribute("users", userrepo.findall());
return "index";
}
}
第七步:创建thymeleaf视图:/web-inf/views/来展示用户列表
<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8"/>
<title>home</title>
</head>
<body>
<table>
<thead>
<tr>
<th>id</th>
<th>name</th>
</tr>
</thead>
<tbody>
<tr th:each="user : ${users}">
<td th:text="${user.id}">id</td>
<td th:text="${user.name}">name</td>
</tr>
</tbody>
</table>
</body>
</html>
我们准备好运行程序啦。但在此之前,我们需要下载和配置诸如tomcat或者jetty或者wilddfly等容器。
你可以下载tomcat 8并在你喜欢使用的ide中配置并运行。然后打开浏览器访问http://localhost:8080/springmvcjpa-demo。你可以看到user的详细列表。
耶…我们做到了。
但是等一下~这不是花了非常多的工作量才能做一个从数据库中读取并显示用户列表信息吗?
我们公正公平来看问题。所有的这种配置并不只是一个用户案例。这个配置也是应用程序其它部分的基础。
回过头来,如果你只是想快速获得和运行一个应用来说这是在是太麻烦太复杂了。
另一个问题是,如果你想开发另一个有类似技术栈的 springmvc 应用吗?
好的,你可能为了拷贝粘贴这些配置而感到苦恼。是吗?提出一个记忆深刻的问题:如果你要做类似的事情重复一遍又一遍,那么你是不是想寻找一个能自动处理的方式解决问题。
各种分散的配置写了一遍又一遍,你会想到这里会有一些其他的麻烦问题吗?
好的,在这让我把这些我能想到的问题列出。
想一想,要怎样才能让 spring 能够自动化的完成配置实体?怎么样你才可以快速简单的使用基于可定制的属性完成自动的配置呢?
比如,将 dispacherservlet 的 url-pattern 映射 “/” 映射到 “/app/”。将 “/web-inf/views” 目录 替换为在 “/web-inf/templates/” 目录加入 thymeleaf 视图。
所以基本上,你希望 spring 自动执行一些操作,但是又能够提供更简单的方式灵活的提供重写默认配置?
好的,现在你正在走进 spring boot 的世界在里面你所期待已久的那些东西都已经有了!!!
欢迎来到 spring boot 世界!spring boot 并不是需要你完全地关注和掌握很多东西。它可以默认的完成自动化的配置但是你又可以按自己的需要去重新配置任意配置。
相比我更喜欢用一个例子来说明而不是更多的解析。
所以让我们现在开始用 spring boot 来快速构建一个应用。
创建一个 maven 项目和(在 pom.xml 里面)配置项目 jar 包依赖如下:
<?xml version="1.0" encoding="utf-8"?>
<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>com.sivalabs</groupid>
<artifactid>hello-springboot</artifactid>
<packaging>jar</packaging>
<version>1.0-snapshot</version>
<name>hello-springboot</name>
<parent>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-parent</artifactid>
<version>1.3.2.release</version>
</parent>
<properties>
<project.build.sourceencoding>utf-8</project.build.sourceencoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-test</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-data-jpa</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-thymeleaf</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-devtools</artifactid>
</dependency>
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
</dependency>
</dependencies>
</project>
哇原来 pom.xml 的配置这么少感觉简单多了!
step 2:在 application.properties 中配置数据源或jpa 属性配置如下:
spring.datasource.driver-class-name=com.mysql.jdbc.driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.initialize=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
你可以拷贝一些类似 data.sql 的文件到 src/main/resources 目录中。
在 springmvc-jpa-demo 应用项目中创建 user.java,userrepository.java 和 homecontroller.java 之类所需的东西。
在 springmvc-jap-demo 应用拷贝 /web-inf/views/ 到我们的新项目的 src/main/resources/templates 目录中。
创建一个有 main 函数的 java 类 application.java 如下:
@springbootapplication
public class application
{
public static void main(string[] args)
{
springapplication.run(application.class, args);
}
}
现在用 java application 的方式开始启动运行 application.java 之后打开浏览器访问 http://localhost:8080/。
你就可以在页面的表格上看到用户列表的显示。这感觉实在太酷了!!!
ok 好的,我想你会大声说”这里边到底发生了做了些什么???”。
让我说明下刚才发生了什么
1. 轻松地依赖管理
2. 自动配置
3.嵌入式servlet容器支持
最重要也是最惊奇的是我们创建了一个简单的java类,注释了一些神奇的注解@springapplication,它有一个main方法,通过运行main,我们可以运行应用程序并在http:// localhost:8080 /上访问它。
servlet容器从何而来?
我们已经添加了spring-boot-starter-web,它自动拉出spring-boot-starter-tomcat,当我们运行main()方法时,它为嵌入式容器启动了tomcat,这样我们就不必在任何外部安装的tomcat服务器上部署我们的应用程序了。
另外而言,你注意到我们在pom.xml中的打包类型是’jar’而不是’war’。 极其有趣!
好吧,但如果我想使用jetty服务器而不用tomcat呢?
很简单,从spring-boot-starter-web中将spring-bootstarter-tomcat排除,只留有spring-boot-starter-jetty。
就是这样。
但是,这看起来很神奇!我可以想象你在想什么。你觉得springboot看起来很酷,它会自动为我做很多事情。但我仍然没有完全理解它是如何真正在幕后工作的。对么?
我明白。观看魔术表演通常很有趣,但在软件开发中却没有。别担心,未来文章中我们将会查看这些内容,并详细解释幕后发生的事情。但是现在我不想在此文中将所有内容都转发给你,从而压倒你。
概要
在本文中,我们快速概述了各种spring配置样式,并了解了配置spring应用程序的复杂性。此外,我们通过创建一个简单的web应用程序快速浏览了springboot。
在下一篇文章中,我们将深入探讨springboot并了解它是如何工作的。
来源代码湾:http://codebay.cn/post/10067.html
如对本文有疑问, 点击进行留言回复!!
集合框架——Map、泛型以及Collection算法常用方法
Elasticsearch 升级 7.x 版本后,我感觉掉坑里了
Mybatis的插件运行原理以及如何编写一个Mybatis的插件
网友评论