为什么选择Spring Boot?
本文概述了各种Spring配置样式,并帮助你了解配置Spring应用程序的复杂性。抽丝剥茧 细说架构那些事——【优锐课】
Spring是一个非常流行的基于Java的框架,用于构建Web和企业应用程序。与许多其他框架仅关注一个领域不同,Spring框架通过其投资组合项目提供了广泛的功能来满足现代业务需求。
Spring框架提供了以多种方式(例如XML,Annotations和JavaConfig)配置bean的灵活性。随着功能数量的增加,复杂性也随之增加,配置Spring应用程序变得乏味且容易出错。
Spring团队创建了Spring Boot来解决配置的复杂性。
但是在深入探讨SpringBoot之前,我们将快速浏览一下Spring框架,看看SpringBoot试图解决什么样的问题。
在本文中,我们将介绍:
- Spring框架概述
- 使用Spring MVC和JPA(Hibernate)的Web应用程序
- 快速体验Spring Boot
Spring框架概述
如果你是Java开发人员,那么你很有可能听说过Spring框架,并且很可能已在项目中使用了它。Spring框架主要是作为依赖关系注入容器创建的,但不仅如此。
Spring非常受欢迎有几个原因:
- Spring的依赖注入方法鼓励编写可测试的代码
- 易于使用但功能强大的数据库事务管理功能
- Spring简化了与其他Java框架,比如JPA/Hibernate ORM, Struts/JSF/etc. web框架
- 用于构建Web应用程序的最新Web MVC框架
除Spring框架外,还有许多其他Spring姐妹项目可帮助构建满足现代业务需求的应用程序:
- Spring Data: 简化从关系和NoSQL数据存储的数据访问。
- Spring Batch: 提供强大的批处理框架。
- Spring Security: 强大的安全框架来保护应用程序。
- Spring Social: 支持与Facebook,Twitter,LinkedIn,GitHub等社交网站的集成。
- Spring Integration: 企业集成模式的实现,以促进使用轻量级消息传递和声明性适配器与其他企业应用程序集成。
还有许多其他有趣的项目可以满足其他各种现代应用程序开发需求。
最初,Spring框架提供了一种用于配置bean的基于XML的方法。后来,Spring引入了用于配置bean的基于XML的DSL,注释和基于JavaConfig的方法。
让我们快速看一下每种配置样式的外观。
基于XML的配置
<bean id="userService" class="com.sivalabs.myapp.service.UserService">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.sivalabs.myapp.dao.JdbcUserDao">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="secret"/>
</bean>
基于注释的配置
@Service
public class UserService
{
private UserDao userDao;
@Autowired
public UserService(UserDao dao){
this.userDao = dao;
}
...
...
}
@Repository
public class JdbcUserDao
{
private DataSource dataSource;
@Autowired
public JdbcUserDao(DataSource dataSource){
this.dataSource = dataSource;
}
...
...
}
基于JavaConfig的配置
@Configuration
public class AppConfig
{
@Bean
public UserService userService(UserDao dao){
return new UserService(dao);
}
@Bean
public UserDao userDao(DataSource dataSource){
return new JdbcUserDao(dataSource);
}
@Bean
public DataSource dataSource(){
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("secret");
return dataSource;
}
}
哇... Spring提供了许多用于完成同一任务的方法,我们甚至可以混合使用这些方法,并在同一应用程序中同时使用基于JavaConfig和基于注释的配置样式。
这具有很大的灵活性,既有好处也有坏处。 刚接触Spring框架的人可能会对采用哪种方法感到困惑。 到目前为止,Spring团队建议遵循基于JavaConfig的方法,因为它可以提供更大的灵活性。
但是,没有一种千篇一律的解决方案。 必须根据自己的应用程序需求选择方法。
好的,现在你已经大致了解了各种样式的Spring bean配置外观。
让我们快速看一下典型的SpringMVC + JPA / Hibernate Web应用程序配置的配置。
使用Spring MVC和JPA的Web应用程序(休眠)
在了解什么是Spring Boot及其提供的功能之前,让我们看一下典型的Spring Web应用程序配置的外观,痛点以及Spring Boot如何解决这些问题。
步骤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。
步骤2:使用JavaConfig配置服务/ DAO层Bean
@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配置类中,我们执行了以下操作:
- 使用@Configuration批注将其标记为Spring Configuration类
- 使用@EnableTransactionManagement启用基于注释的事务管理
- 配置了@EnableJpaRepositories以指示在何处查找Spring Data JPA存储库
- 使用@PropertySource批注和PropertySourcesPlaceholderConfigurer Bean定义配置的PropertyPlaceHolder Bean,该定义从application.properties文件加载属性
- 为DataSource,JPA EntityManagerFactory,JpaTransactionManager定义的bean
- 已配置的DataSourceInitializer bean通过在应用程序启动时执行data.sql脚本来初始化数据库
我们需要在application.properties中配置属性占位符值,如下所示:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=admin
init-db=true
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update
我们可以创建一个简单的SQL脚本data.sql,以将示例数据填充到USER表中:
delete from user;
insert into user(id, name) values(1,'Siva');
insert into user(id, name) values(2,'Prasad');
insert into user(id, name) values(3,'Reddy');
我们可以使用以下基本配置创建log4j.properties文件:
log4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %t %c{2}:%L - %m%n
log4j.category.org.springframework=INFO
log4j.category.com.sivalabs=DEBUG
步骤3:配置Spring MVC Web层Bean
我们将必须为i18n配置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配置类中,我们执行了以下操作:
- 使用@Configuration批注将其标记为Spring Configuration类
- 使用@EnableWebMvc启用基于注释的Spring MVC配置
- 通过注册TemplateResolver,SpringTemplateEngine,ThymeleafViewResolver Bean来配置Thymeleaf ViewResolver
- 已注册的ResourceHandlers bean,以指示将通过位置/resources/目录来提供对带有URI/resources/ **的静态资源的请求
- 已配置的MessageSource bean从类路径的ResourceBundle消息-{country-code} .properties中加载i18n消息
目前,我们没有任何消息要配置,因此请在src/main/ resources文件夹中创建一个空的messages.properties文件。
步骤4:注册Spring MVC FrontController Servlet DispatcherServlet
在Servlet 3.x规范之前,我们必须在web.xml中注册Servlet/过滤器。从Servlet 3.x规范开始,我们可以使用ServletContainerInitializer以编程方式注册Servlet/过滤器。
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配置类中,我们执行了以下操作:
- 我们已将AppConfig.class配置为RootConfirationClasses,它将成为父ApplicationContext,其中包含由所有子(DispatcherServlet)上下文共享的bean定义。
- 我们已将WebMvcConfig.class配置为ServletConfigClasses,它是包含WebMvc bean定义的childApplicationContext。
- 我们已将“/”配置为ServletMapping,这意味着所有请求将由DispatcherServlet处理。
- 我们已经将OpenEntityManagerInViewFilter注册为Servlet过滤器,以便在呈现视图时可以延迟加载JPA Entity延迟集合。
步骤5:创建一个JPA实体和Spring Data JPA存储库
为用户实体创建一个JPA实体User.java和一个Spring Data JPA存储库。
@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>
{
}
步骤6:创建一个SpringMVC控制器
创建一个SpringMVC控制器来处理URL“/”并呈现用户列表。
@Controller
public class HomeController
{
@Autowired UserRepository userRepo;
@RequestMapping("/")
public String home(Model model)
{
model.addAttribute("users", userRepo.findAll());
return "index";
}
}
步骤7:创建Thymeleaf View /WEB-INF/views/index.html来呈现用户列表
<!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>
现在我们已经准备好运行该应用程序。但是在此之前,我们需要在你的IDE中下载并配置服务器,例如Tomcat或Jetty或Wildfly等。
你可以下载Tomcat 8并在你喜欢的IDE中进行配置,运行该应用程序并将浏览器指向http:// localhost:8080/ springmvcjpa-demo。你应该在表中看到用户详细信息列表。
是的...我们做到了。
但是,等等。仅显示从数据库表中提取的用户详细信息列表是否不是一项繁重的工作?
让我们诚实和公平。所有这些配置不仅仅针对这一用例。此配置也是其余应用程序的基础。
但是同样,如果你想快速启动并运行,这是太多的工作要做。
另一个问题是,假设你要开发具有类似技术堆栈的另一个SpringMVC应用程序?
好了,你复制粘贴配置并进行调整。对?但是请记住一件事:如果你必须一次又一次地执行相同的操作,则应该找到一种自动的方法来执行此操作。
除了一遍又一遍地写相同的配置,你在这里还看到其他问题吗?
好吧,让我列出我在这里看到的问题。
- 你需要寻找特定Spring版本的所有兼容库并进行配置。
- 95%的时间我们以相同的方式配置DataSource,EntitymanagerFactory,TransactionManager等bean。如果Spring可以自动为我完成任务,那不是很好。
- 同样,大多数情况下,我们以相同的方式配置SpringMVC bean,例如ViewResolver,MessageSource等。
想象一下,如果Spring能够自动配置bean呢?如果可以使用简单的可自定义属性自定义自动配置该怎么办?
例如,你不想将DispatcherServlet url-pattern映射到“/”,而是要将其映射到“/app/”。与其将Thymeleaf视图放置在“/ WEB-INF / views”文件夹中,不如将它们放置在“/WEB-INF/templates/”文件夹中。
因此,基本上,你希望Spring自动执行操作,但是提供了以更简单的方式覆盖默认配置的灵活性?
好吧,你即将进入SpringBoot的世界,梦想成真!!!
快速体验Spring Boot
欢迎使用Spring Boot!Spring Boot确实可以满足你的需求。它会自动为你执行操作,但是允许你覆盖默认值。
与其从理论上解释,不如说我以身作则。
因此,让我们实现与之前构建的应用程序相同的应用程序,但是这次使用SpringBoot。
步骤1:创建基于Maven的Spring Boot项目
创建一个Maven项目并配置依赖项,如下所示:
<?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突然变得如此之小!
步骤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文件夹中。
步骤3:为该实体创建JPA实体和Spring Data JPA存储库接口
创建与springmvc-jpa-demoapplication中相同的User.java,UserRepository.java和HomeController.java。
步骤4:创建Thymeleaf视图以显示用户列表
将我们在springmvc-jpa-demo应用程序中创建的/WEB-INF/views/index.html复制到新项目中的src/-main/resources/ templates文件夹中。
步骤5:创建SpringBoot EntryPoint类
使用以下主要方法创建一个Java类Application.java:
@SpringBootApplication
public class Application
{
public static void main(String[] args)
{
SpringApplication.run(Application.class, args);
}
}
现在,将Application.java作为Java应用程序运行,并将浏览器指向http:// localhost:8080/。
你应该以表格格式看到用户列表。酷!!!
好吧好吧,我听到你在喊“发生了什么事??”。
让我解释一下发生了什么。
1. 轻松的依赖管理
- 首先要观察的是,我们正在使用一些名为spring-boot-starter- *的依赖项。请记住,我说过“ 95%的时间我使用相同的配置。因此,默认情况下,当你添加springboot-starter-web依赖项时,它将在开发Spring MVC应用程序(例如spring-webmvc,jackson-json,validation-api和tomcat)时提取所有常用的库。
- 我们添加了spring-boot-starter-data-jpa依赖性。这拉动了所有spring-data-jpa依赖关系,并添加了Hibernate库,因为大多数应用程序都将Hibernate用作JPA实现。
2. 自动配置
- 不仅spring-boot-starter-web添加了所有这些库,而且还使用合理的默认值配置了常用注册的Bean,例如DispatcherServlet,ResourceHandlers,MessageSource等Bean。
- 我们还添加了spring-boot-starter-Thymeleaf,它不仅添加Thymeleaf库依赖项,而且还自动配置ThymeleafViewResolver Bean。
- 我们尚未定义任何DataSource,EntityManagerFactory,TransactionManageretc Bean,但是会自动创建它们。怎么样?如果我们的类路径中有任何内存数据库驱动程序,例如H2或HSQL,那么SpringBoot将自动创建内存数据源,然后自动使用明智的默认值注册EntityManagerFactory和TransactionManager bean。但是我们正在使用MySQL,因此我们需要显式提供MySQL连接详细信息。我们已经在application.properties文件中配置了这些MySQL连接详细信息,SpringBoot使用这些属性创建了一个DataSource。
3. 嵌入式Servlet容器支持
最重要和令人惊讶的事情是,我们创建了一个简单的Java类,该类以一些神奇的注释@SpringApplication进行了注释,该类具有main方法,并且通过运行该main方法,我们可以运行该应用程序并在http:// localhost:8080/进行访问。
servlet容器来自哪里?
我们添加了spring-boot-starter-web,它会自动拉出spring-boot-starter-tomcat,当我们运行main()方法时,它将tomcat作为嵌入式容器启动,这样我们就不必在任何应用程序上部署应用程序 外部安装的tomcat服务器。
顺便说一句,你是否注意到我们在pom.xml中的包装类型是“罐子”而不是“战争”。精彩!
好的,但是如果我想使用Jetty服务器而不是tomcat怎么办?
简单,将spring-bootstarter-tomcat从spring-boot-starter-web中排除,并包括spring-boot-starter-jetty。
而已。
但是,这看起来很神奇!!!
我可以想象你在想什么。你在想,SpringBoot看起来很酷,它会自动为我做很多事情。但是,我仍然不完全了解幕后工作的一切。对?
我能够了解。观看魔术表演通常很有趣,但是在软件开发中却不是。不用担心,我们将在以后的文章中仔细研究每件事,并详细说明幕后情况。但是,我现在不想在本文中将所有内容都丢给你而让你不知所措。
总结
在本文中,我们快速概述了各种Spring配置样式,并了解了配置Spring应用程序的复杂性。另外,我们通过创建一个简单的Web应用程序快速浏览了SpringBoot。
在下一篇文章中,我们将深入研究SpringBoot并了解其工作原理。
感谢阅读!
为什么选择Spring Boot?的更多相关文章
- 【转】为什么选择Spring Boot作为微服务的入门级微框架
本文为普元云计算高级工程师许二虎在普元云计算架构设计群的微课堂分享.如需加入普元新一代数字化企业云平台研发设计群参与微课堂.架构设计与讨论直播,请直接回复此公众号:"加群 姓名 公司 职位 ...
- 为什么选择Spring Boot作为微服务的入门级微框架
摘要:1. Spring Boot是什么,解决哪些问题 1) Spring Boot使编码变简单 2) Spring Boot使配置变简单 3) Spring Boot使部署变简单 4) Spring ...
- Spring Boot 揭秘与实战(一) 快速上手
文章目录 1. 简介 1.1. 什么是Spring Boot 1.2. 为什么选择Spring Boot 2. 相关知识 2.1. Spring Boot的spring-boot-starter 2. ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习
转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习--转
原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...
- Spring Boot自动配置如何工作
通过使用Mongo和MySQL DB实现的示例,深入了解Spring Boot的@Conditional注释世界. 在我以前的文章“为什么选择Spring Boot?”中,我们讨论了如何创建Sprin ...
- 一:Spring Boot、Spring Cloud
上次写了一篇文章叫Spring Cloud在国内中小型公司能用起来吗?介绍了Spring Cloud是否能在中小公司使用起来,这篇文章是它的姊妹篇.其实我们在这条路上已经走了一年多,从16年初到现在. ...
- Spring Boot 容器选择 Undertow 而不是 Tomcat
Spring Boot 内嵌容器Undertow参数设置 配置项: # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程 # 不要设置过大,如果过大,启动 ...
- Spring Boot 学习系列(06)—采用log4j2记录日志
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 为什么选择log4j2 log4j2相比于log4j1.x和logback来说,具有更快的执行速度.同时也支 ...
随机推荐
- kafka概念扫盲
一.kafka概述 1.1.定义 Kakfa是一个分布式的基于发布/订阅模式的消息队列(message queue),主要应用于大数据的实时处理领域 1.2.消息队列 1.2.1.传统的消息队列&am ...
- [集训]dance
题意 http://uoj.ac/problem/77 思考 显然能转化为最小割模型.若没有pi的代价,则对于第i个格子,可以让源点连向第i个点,容量为黑色收益,再连向汇点,容量为白色收益.再考虑pi ...
- rtmp协议规范
译序: 本文是为截至发稿时止最新 Adobe 官方公布的 RTMP 规范.本文包含 RTMP 规范的全部内容.是第一个比较全面的 RTMP 规范的中译本.由于成文时间仓促,加上作者知识面所限,翻译错误 ...
- 关于远程办公,微软MVP 15年研发团队的经验分享
今天是2月5日,春节假期结束后的第三天了.为了能够应对来势汹汹的疫情,众多互联网企业纷纷开启了远程办公模式.不知道各团队前两天的远程办公效果如何,我们 Worktile 管理层在大年初四就开始讨论远程 ...
- IntelliJ IDEA 2019.3 安装+永久破解[Windows]
IntelliJ IDEA 2019的最后一个版本发布了,听说大幅优化了运行速度,本人实测启动速度确实比以前快不少,所以赶紧安排上新版本IDEA的破解教程 系统环境:Win10 LTSC(1809) ...
- python3基础
1.print()函数 支持自动换行: 不自动换行:使用 end=“” print格式化输出: 字符串格式化符号: • %c 格式化字符及其ASCII码• %s 格式化字符串• %d 格式化整数• ...
- Codeforces_821
A.直接判断每一个数. #include<bits/stdc++.h> using namespace std; ][]; int main() { ios::sync_with_stdi ...
- CCF_ 201409-2_画图
将一个数组比作画板,有颜色的位置标1,统计即可. #include<cstdio> #include<iostream> #define NUM 100 using names ...
- POJ 1789 Truck History (Kruskal最小生成树) 模板题
Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for v ...
- java代码之美(15)---Java8 Function、Consumer、Supplier
Java8 Function.Consumer.Supplier 有关JDK8新特性之前写了三篇博客: 1.java代码之美(1)---Java8 Lambda 2.java代码之美(2)---Jav ...