为什么选择SpringBoot?

使用Spring MSpring进行许可是一种非常流行的基于Java的框架,用于构建Web和企业应用程序。 与许多其他只关注一个领域的框架不同,Spring框架通过其投资组合项目提供了广泛的功能来满足现代业务需求。

Spring框架提供了以多种方式(例如XMLAnnotationsJavaConfig)配置bean的灵活性。 随着功能数量的增加,复杂性也随之增加,配置Spring应用程序变得繁琐且容易出错。

Spring团队创建了SpringBoot来解决配置的复杂性。 但是在深入探讨SpringBoot之前,我们将快速了解一下Spring框架,并了解SpringBoot试图解决什么样的问题。

在本文中,我们将介绍:

  • Spring框架概述
  • 使用Spring MVC和JPA(Hibernate)的Web应用程序
  • 快速了解SpringBoot

Spring框架概述

如果您是Java开发人员,那么您很有可能听说过Spring框架,并且很可能已在项目中使用了它。 Spring框架主要是作为依赖关系注入容器创建的,但不仅如此。

春天之所以流行,有几个原因:

  • Spring的依赖注入方法鼓励编写可测试的代码
  • 易于使用,但功能强大的数据库事务管理功能
  • Spring简化了与其他Java框架(如JPA / Hibernate ORM,Struts / JSF等Web框架)的集成。
  • 用于构建Web应用程序的最新Web MVC框架

与Spring框架一起,还有许多其他Spring姐妹项目,这些项目有助于构建满足现代业务需求的应用程序:

  • Spring Data:简化了从关系和NoSQL数据存储的数据访问。
  • Spring Batch:提供了强大的批处理框架。
  • Spring Security:强大的安全框架,可保护应用程序。
  • Spring Social:支持与Facebook,Twitter,LinkedIn,GitHub等社交网站的集成。
  • Spring集成:企业集成模式的实现,以促进使用轻量级消息传递和声明性适配器与其他企业应用程序集成。

还有许多其他有趣的项目可以满足其他各种现代应用程序开发需求。 有关更多信息,请访问http://spring.io/projects 。

最初,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;@Autowiredpublic UserService(UserDao dao){this.userDao = dao;}......
}
@Repository
public class JdbcUserDao
{private DataSource dataSource;@Autowiredpublic JdbcUserDao(DataSource dataSource){this.dataSource = dataSource;}......
}

基于JavaConfig的配置

@Configuration
public class AppConfig
{@Beanpublic UserService userService(UserDao dao){return new UserService(dao);}@Beanpublic UserDao userDao(DataSource dataSource){return new JdbcUserDao(dataSource);}@Beanpublic 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(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。

步骤2:使用JavaConfig配置服务/ DAO层bean。

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages="com.sivalabs.demo")
@PropertySource(value = { "classpath:application.properties" })
public class AppConfig 
{@Autowiredprivate Environment env;@Beanpublic static PropertySourcesPlaceholderConfigurer placeHolderConfigurer(){return new PropertySourcesPlaceholderConfigurer();}@Value("${init-db:false}")private String initDatabase;@Beanpublic PlatformTransactionManager transactionManager(){EntityManagerFactory factory = entityManagerFactory().getObject();return new JpaTransactionManager(factory);}@Beanpublic 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;}@Beanpublic HibernateExceptionTranslator hibernateExceptionTranslator(){return new HibernateExceptionTranslator();}@Beanpublic 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;}@Beanpublic 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 EntityManagerFactoryJpaTransactionManager定义的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%nlog4j.category.org.springframework=INFO
log4j.category.com.sivalabs=DEBUG

步骤3:配置Spring MVC Web层bean

我们将必须为i18n配置Thymeleaf ViewResolver ,静态ResourceHandlersMessageSource等。

@Configuration
@ComponentScan(basePackages = { "com.sivalabs.demo"}) 
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter
{@Beanpublic TemplateResolver templateResolver() {TemplateResolver templateResolver = new ServletContextTemplateResolver();templateResolver.setPrefix("/WEB-INF/views/");templateResolver.setSuffix(".html");templateResolver.setTemplateMode("HTML5");templateResolver.setCacheable(false);return templateResolver;}@Beanpublic SpringTemplateEngine templateEngine() {SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver());return templateEngine;}@Beanpublic ThymeleafViewResolver viewResolver() {ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();thymeleafViewResolver.setTemplateEngine(templateEngine());thymeleafViewResolver.setCharacterEncoding("UTF-8");return thymeleafViewResolver;}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry){registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");}@Overridepublic 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配置
  • 通过注册TemplateResolverSpringTemplateEngineThymeleafViewResolver 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 / Filters。 从Servlet 3.x规范开始,我们可以使用ServletContainerInitializer以编程方式注册Servlet /过滤器。

Spring MVC提供了一个方便的类AbstractAnnotationConfigDispatcherServletInitializer来注册DispatcherServlet

public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer
{@Overrideprotected Class<?>[] getRootConfigClasses(){return new Class<?>[] { AppConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses(){return new Class<?>[] { WebMvcConfig.class };}@Overrideprotected String[] getServletMappings(){return new String[] { "/" };}@Overrideprotected Filter[] getServletFilters() {return new Filter[]{ new OpenEntityManagerInViewFilter() };}
}

在我们的SpringWebAppInitializer.java配置类中,我们执行了以下操作:

  • 我们已经将AppConfig.class配置为RootConfirationClasses ,它将成为父ApplicationContext ,其中包含由所有子( DispatcherServlet )上下文共享的bean定义。
  • 我们已经将WebMvcConfig.class配置为ServletConfigClasses ,它是包含WebMvc bean定义的子ApplicationContext
  • 我们已经将“ /”配置为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:创建一个百里香叶视图/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中下载并配置服务器,例如TomcatJettyWildfly等。

您可以下载Tomcat 8并在您喜欢的IDE中进行配置,运行该应用程序,然后将浏览器指向http:// localhost:8080 / springmvcjpa-demo 。 您应该在表中看到用户详细信息列表。 是的...我们做到了。

但是,等等。仅显示从数据库表中提取的用户详细信息列表是否不是一项太多的工作? 让我们诚实和公平。 所有这些配置不仅仅针对这一用例。 此配置也是其余应用程序的基础。

但是同样,如果您想快速启动并运行,这是太多的工作要做。 另一个问题是,假设您要开发具有类似技术堆栈的另一个SpringMVC应用程序?

好了,您复制粘贴配置并进行调整。 对? 但是请记住一件事:如果您必须一次又一次地执行相同的操作,则应该找到一种自动的方法来执行此操作。

除了一次又一次地写相同的配置之外,您在这里是否还遇到其他问题?

好吧,让我列出我们在这里看到的问题。

  • 您需要寻找特定Spring版本的所有兼容库并进行配置。
  • 95%的时间中,我们以相同的方式配置DataSourceEntitymanagerFactoryTransactionManager等bean。 如果Spring可以自动为我完成任务,那不是很好。
  • 同样,我们通常以相同的方式配置SpringMVC bean,例如ViewResolverMessageSource等。

如果Spring可以自动为我完成任务,那就太好了!!!

想象一下,如果Spring能够自动配置bean呢? 如果可以使用简单的可自定义属性自定义自动配置怎么办?

例如,您不想将DispatcherServlet url-pattern映射到“ /”,而是将其映射到“ / app /”。 与其将百里香叶视图放置在“ / WEB-INF / views”文件夹中,不如将它们放置在“ / WEB-INF / templates /”文件夹中。

因此,基本上,您希望Spring自动执行操作,但是提供了以更简单的方式覆盖默认配置的灵活性?

好吧,您即将进入SpringBoot的世界,梦想成真!

快速了解SpringBoot

欢迎使用SpringBoot! SpringBoot确实可以满足您的需求。 它会自动为您执行操作,但如果需要,您可以覆盖默认值。

与其从理论上解释,不如说我以身作则。

因此,让我们实现与之前构建的应用程序相同的应用程序,但是这次使用SpringBoot。

步骤1:创建一个基于Maven的SpringBoot项目

创建一个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-demo应用程序相同的User.java,UserRepository.javaHomeController.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-apitomcat)时提取所有常用的库。
  • 我们添加了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,TransactionManager等bean,但是会自动创建它们。 如果我们在类路径中有任何内存数据库驱动程序(例如H2HSQL) ,则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中的打包类型是'jar'而不是'war' 。 精彩!

好的,但是如果我想使用Jetty服务器而不是tomcat怎么办?

很简单,从spring-boot-starter-web中排除spring-bootstarter-tomcat ,并包含spring-boot-starter-jetty

而已。 但是,这看起来很神奇!!!

我可以想象你在想什么。 您在想,SpringBoot看起来很酷,它会自动为我做很多事情。 但是我仍然不完全了解它在幕后的运作方式。 对?

我能够了解。 观看魔术表演通常很有趣,但是在软件开发中却不是。 不用担心,我们将在以后的文章中仔细研究每件事,并详细解释幕后情况。 但是,我不想在本文中将所有内容转储到您的耳中而使您不知所措。

摘要

在本文中,我们快速浏览了各种Spring配置样式,并了解了配置Spring应用程序的复杂性。 另外,我们通过创建一个简单的Web应用程序快速浏览了SpringBoot。 在下一篇文章中,我们将深入研究SpringBoot并了解其工作原理。

翻译自: https://www.javacodegeeks.com/2016/03/why-springboot.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wamp2.5可用php5.6,局域网访问,多站点配置

1.用php5.6 直接下载个wamp3.0的&#xff0c;那里的php支持5.6&#xff0c;安装之后把php5.6的文件夹剪切到wamp2.5的放php的文件夹&#xff0c;然后wamp那里就有php5.6的选择了&#xff0c;选择后就可以用了 2.局域网访问 打开apache的配置文件&#xff0c;然后搜索Require lo…

Vue 页面如何监听用户预览时间

最近的业务中涉及到这样一个需求&#xff0c;在线培训的系统需要知道用户对某个在线预览的页面追踪用户的预览时长。初步我们首先想到借助 Vue 页面的生命周期函数 mounted 和 destroyed&#xff0c;分别在其中加入开始计时和清除计时的逻辑&#xff0c;通过后台的接口上报对应…

一个追求高效的学习者手机里装有哪些APP?(转)

转载&#xff1a;http://www.jianshu.com/p/f568c8d8b6bb 1、录音软件-Recordium 参加活动&#xff0c;如果不想错过活动现场的经常片段&#xff0c;速记又来不及&#xff0c;那就选择录音吧。小六之前都使用录音笔&#xff0c;但是自从有了这个APP之后&#xff0c;在开会&…

spring social_Spring Social入门

spring social像我一样&#xff0c;无论是添加简单的Facebook“赞”按钮&#xff0c;一大堆“共享”按钮还是显示时间轴信息&#xff0c;您都不会注意到当前对应用程序“社交化”的热衷。 每个人都在做这件事&#xff0c;包括Spring的家伙&#xff0c;事实上&#xff0c;他们提…

Vue 页面如何利用生命周期函数监听用户预览时长

最近的业务中涉及到这样一个需求&#xff0c;在线培训的系统需要知道用户对某个在线预览的页面追踪用户的预览时长。初步我们首先想到借助 Vue 页面的生命周期函数 mounted 和 destroyed&#xff0c;分别在其中加入开始计时和清除计时的逻辑&#xff0c;通过后台的接口上报对应…

iOS 11 UICollectionView顶部出现白色间隔的问题

iOS11 UICollectionView顶到屏幕顶端会出现一个20高度的白色间隔&#xff0c;是由于UICollectionView的自动调整功能为状态栏留出的位置 只需在创建UICollectionView时加入如下代码关闭自动调整&#xff1a; 该属性是iOS11新加入的&#xff0c;所以一定要在前面加上判断&#x…

项目中的富文本编辑器该如何选择?

项目中经常需要用到富文本编辑器的时候&#xff0c;而常见的富文本编辑器都有哪些&#xff1f;该如何选择&#xff1f; 先看看市面上都有哪些可用的富文本编辑器&#xff1a; TinyMCE&#xff08;插件式的&#xff0c;支持 Vue&#xff0c;React&#xff0c;Angular 框架&…

根据自己的博客数据统计国内IT人群

装上百度统计有一段时间了&#xff0c;今天突然找出报表看看&#xff0c;发现一个很有意思的事情。访问来源TOP5依次是&#xff1a;北京&#xff0c;上海&#xff0c;深圳&#xff0c;杭州&#xff0c;广州 虽然大部分文章都是当时特别白的时候记录下来的遇到过的问题&#xff…

Vue刷新页面有哪几种方式

在Vue项目中&#xff0c;刷新当前页除了 window.reload()&#xff0c;你还能想到什么办法&#xff1f;而且这种办法会重新加载资源出现短暂的空白页面。体验不是很好。 在某个详情页面的时候&#xff0c;我们经常需要通过路由中的详情 id 去获取内容&#xff0c;当我们在不同的…

java web服务_将Java服务公开为Web服务

java web服务本教程解决了开发人员面临的最实际的情况。 大多数时候&#xff0c;我们可能需要将某些现有服务公开为Web服务。 在项目生命周期的不同阶段可能会遇到这种情况。 如果这是初始阶段&#xff0c;那么您几乎是安全的&#xff0c;您可以为此做好充分的准备。 但是&…

python文件打开方式详解——a、a+、r+、w+区别

第一步 排除文件打开方式错误&#xff1a;r只读&#xff0c;r读写&#xff0c;不创建w新建只写&#xff0c;w新建读写&#xff0c;二者都会将文件内容清零&#xff08;以w方式打开&#xff0c;不能读出。w可读写&#xff09;**w与r区别&#xff1a;r&#xff1a;可读可写&#…

程序员的工作周报该怎么写?

大多数公司都有写周报的要求&#xff0c;为什么要写周报&#xff1f;很多流于形式的周报&#xff0c;会让员工感到厌烦。特别是程序员&#xff0c;你让他写代码可以&#xff0c;写这种篇幅稍微大点的文字&#xff0c;简直要了他的命。周报作为一种文字载体&#xff0c;是下级向…

一个快速生成元素背景的 React 组件

在开发过程中&#xff0c;我们经常会遇到使用背景的地方&#xff0c;比如登录页面&#xff0c;用户信息页面&#xff0c;封面图…… 寻找契合业务主题的背景十分耗费精力&#xff0c;总觉得做的背景不合适&#xff0c;如果直接用图片呢&#xff0c;逻辑是比较简单&#xff0c;但…

引入ReactiveInflux:用于Scala和Java的无阻塞InfluxDB驱动程序,支持Apache Spark

我很高兴宣布Pygmalios开发的ReactiveInflux的第一个发行版。 InfluxDB错过了Scala和Java的非阻塞驱动程序。 不变性&#xff0c;可测试性和可扩展性是ReactiveInflux的关键功能。 加上对Apache Spark的支持&#xff0c;它是首选武器。 https://github.com/pygmalios/reactive…

python之路_前端基础之Bootstrap 组件

文档内容参考地址&#xff1a;http://v3.bootcss.com/components/ 一、图标 如下例&#xff0c;Star文本前有一个空格&#xff1a; <button type"button" class"btn btn-default btn-lg"><span class"glyphicon glyphicon-star" aria-h…

内卷之下,前端工程师如何自救

近两年的职场内卷现象越来越严重&#xff0c;996 工作制在各大公司已经很常见&#xff0c;甚至有更甚者&#xff0c;告诉你我们公司的前端是如何内卷的&#xff1f;为了数字化转型&#xff0c;公司要为产品平台化打造一个办公协同的在线管理系统&#xff0c;来规范化项目流程管…

Java核心技术 卷1 多线程----线程安全的集合(4)

如果多线程要并发的修改一个数据结构&#xff0c;例如散列表&#xff0c;那么很容易会破坏这个数据结构。一个线程可能要开始向表中插入一个新元素。假定在调整散列表各个桶之间的链接关系的过程中&#xff0c;被剥夺了控制权。如果另一个线程也开始遍历同一个链表&#xff0c;…

如何快速实现 Wordpress 博客域名更换?

如题&#xff0c;如何快速更换使用 Wordpress 搭建的网站、博客的域名&#xff0c;除了在域名服务商那更换域名的解析和 web服务器端的配置外&#xff0c;还应该从数据库端做些什么&#xff1f;熟悉 Wordpress 的用户都知道在 Wordpress 后台&#xff0c;设置 --> 常规 里有…

java jigsaw_是从Java 8启动的Project Jigsaw吗?

java jigsaw在马克雷因霍尔德 &#xff08; Mark Reinhold &#xff09;在他的《 项目拼图&#xff1a;火车晚点 》一文中提出“将项目拼图推迟到Java 9的下一个发行版中”。 他解释了这样做的原因&#xff1a;“仍然存在一些重大的技术挑战”&#xff0c;并且“没有足够的时间…

浮动—春联(文字竖直排列)

<div id"main"><div class"top">李白</div><div class"left">明月几时有</div><div class"right">把酒问青天</div> </div> 1 #main{2 height: 540px;3 …