• Spring Boot 入门


    一、Spring Boot

    久闻Spring Boot大名,这两天终于得空,学习了一把,发觉Spring Boot确实好用,那Spring Boot到底是什么,又是怎么好用呢?

    什么是Spring Boot

    目前ssm框架还是比较常用的,其中的ss指的无非就是Spring 和 SpringMVC,我们可以简单的认为 “Spring Boot ≥ Spring + SpringMVC”,没错,用了Spring Boot中涵盖了Spring和SpringMVC等大量常用开发配置,而且Spring Boot的配置极其简单,可以让你不用或者只需要很少的Spring配置就可以让你的项目快速运行起来。

    Spring Boot的优缺点

    优点

    1. 快速构建项目
    2. 对主流开发框架的无配置集成
    3. 项目可独立运行,无须外部依赖Servlet容器(Spring Boot默认自带了一个Tomcat)
    4. 提供运行时的应用监控
    5. 极大地提高了开发、部署效率
    6. 与云计算的天然集成

    缺点

    1. 坑有些多, 文档略少

    二、快速入门

    1、Spring的Java配置方式

    上面已经提到了,使用Spring Boot,可以让你不用或者只需要很少的Spring配置就可以让你的项目快速运行起来,说的就是使用代码注解来取代xml配置。其实从Spring3.x开始就已经提供了java配置方式,使用java配置方式可以更好的理解你配置的Bean,而如今的Spring4.x更是推荐java配置方式,java配置方式可以完全替代xml配置,下面就先来看看两个最基本的注释:

    1)@Configuration 和 @Bean

    Spring的java配置方式是通过@Configuration 和 @Bean这两个注释实现的:

    • @Configuration 作用于类上,相当于一个xml配置文件
    • @Bean 作用于方法上,相当于xml配置中的

    2)小示例

    该示例将通过java配置方式配置Spring,实现Spring IOC功能。

    这是一个简单的模拟从数据库获取User数据的Dao类(注意,它并没有使用任何注解,也就是说UserDao目前并没有交给Spring容器管理)。

    public class UserDao {
        public List<String> queryUserList() {
            List<String> list = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                list.add("User " + i);
            }
            return list;
        }
    }

    这是一个最最常见的Service,通过注入UserDao,使用UserDao的方法获取用户数据。

    @Service
    public class UserService {
    
        @Autowired
        UserDao userDao;
    
        public void getUserList() {
            List<String> list = userDao.queryUserList();
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
            }
        }
    
    }

    从这里开始就跟以往的Spring开发不一样了,这个类使用了2个新的注解,其中@Configuration表明该相当于Spring的一个xml配置文件,@Bean将一开始的UserDao配置给Spring管理.

    @Configuration// 通过注解来表明该类是一个Spring的配置,相当于一个xml文件
    public class SpringConfig {
        @Bean// 这里要注意,如果没有name属性指定注入名称,方法名"getUserDao"将作为UserDao在容器中的id
        public UserDao getUserDao() {
            return new UserDao();
        }
    }

    接下来就是获取Spring容器,从容器中拿到UserService,并调用其获取用户数据的方法,代码如下:

    public class Test {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext acac = new AnnotationConfigApplicationContext(SpringConfig.class);
            UserService userService = (UserService) acac.getBean("userService");
            userService.getUserList();
        }
    }

    像普通的java程序一样,直接运行Test类中的main方法即可在控制台看到用户数据输出了。

    细心的你应该发现了,以往获取Spring容器使用到的类要么是ClassPathXmlApplicationContext 或是 FileSystemXmlApplicationContext,但Spring Boot使用的却是AnnotationConfigApplicationContext,原因也好理解,因为我们Spring Boot使用的是java配置的方式,而以往使用的是Spring的xml配置方式.

    2、第一个Web应用

    通过上面的示例,我们已经知道了java配置方式是怎么回事了,那接下来便正式开始使用Spring Boot来开发我们的第一个web应用了.

    Spring Boot建议使用Maven或Gradle,本文以Maven为例。

    首先创建一个一般的Maven项目,有一个pom.xml和基本的src/main/java结构

    1)pom.xml配置

    设置spring boot的parent

    <?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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.github.abel533</groupId>
        <artifactId>spring-boot</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.3.0.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <dependencies>
                        <dependency>
                            <groupId>org.springframework</groupId>
                            <artifactId>springloaded</artifactId>
                            <version>1.2.5.RELEASE</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    </project>

    说明:Spring boot的项目必须要将parent设置为spring boot的parent,该parent包含了大量默认的配置,大大简化了我们的开发。

    使用父pom虽然简单,但是有些情况我们已经有父pom,不能直接增加<parent>时,可以通过如下方式:

    <dependencyManagement>
         <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.2.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    添加spring-boot-starter-web依赖

    Spring通过添加spring-boot-starter-*这样的依赖就能支持具体的某个功能。

    我们这个示例最终是要实现web功能,所以添加的是这个依赖。

    添加spring-boot-maven-plugin插件

    该插件支持多种功能,常用的有两种,第一种是打包项目为可执行的jar包。

    在项目根目录下执行mvn package将会生成一个可执行的jar包,jar包中包含了所有依赖的jar包,只需要这一个jar包就可以运行程序,使用起来很方便。该命令执行后还会保留一个XXX.jar.original的jar包,包含了项目中单独的部分。

    生成这个可执行的jar包后,在命令行执行java -jar xxxx.jar即可启动项目。

    另外一个命令就是mvn spring-boot:run,可以直接使用tomcat(默认)启动项目。

    在我们开发过程中,我们需要经常修改,为了避免重复启动项目,我们可以启用热部署。

    Spring-Loaded项目提供了强大的热部署功能,添加/删除/修改 方法/字段/接口/枚举 等代码的时候都可以热部署,速度很快,很方便。

    想在Spring Boot中使用该功能非常简单,就是在spring-boot-maven-plugin插件下面添加依赖:

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
            <version>1.2.5.RELEASE</version>
        </dependency>
    </dependencies>

    添加以后,通过mvn spring-boot:run启动就支持热部署了。

    注意:使用热部署的时候,需要IDE编译类后才能生效,你可以打开自动编译功能,这样在你保存修改的时候,类就自动重新加载了。

    创建一个应用类

    我们创建一个Application类:

    @SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})// Spring Boot项目的核心注解,主要目的是开启自动配置
    @RestController//标明这是一个SpringMVC的Controller控制器
    public class HelloApplication {
    
        @RequestMapping("/hello")
        public String hello() {
            return "hello world";
        }
    
        // 在main方法中启动一个应用,即:这个应用的入口
        public static void main(String[] args) {
            SpringApplication.run(HelloApplication.class, args);
        }
    
    }

    注意

    Spring Boot建议将我们main方法所在的这个主要的配置类配置在根包名下。

    类似如下结构:

    com
     +- example
         +- myproject
             +- Application.java
             |
             +- domain
             |   +- Customer.java
             |   +- CustomerRepository.java
             |
             +- service
             |   +- CustomerService.java
             |
             +- web
                 +- CustomerController.java

    Application.java中有main方法。

    因为默认和包有关的注解,默认包名都是当前类所在的包,例如@ComponentScan, @EntityScan, @SpringBootApplication注解

    @RestController

    因为我们例子是写一个web应用,因此写的这个注解,这个注解相当于同时添加@Controller@ResponseBody注解。

    @EnableAutoConfiguration

    Spring Boot建议只有一个带有该注解的类。

    @EnableAutoConfiguration作用:Spring Boot会自动根据你jar包的依赖来自动配置项目。例如当你项目下面有HSQLDB的依赖时,Spring Boot会创建默认的内存数据库的数据源DataSource,如果你自己创建了DataSource,Spring Boot就不会创建默认的DataSource

    如果你不想让Spring Boot自动创建,你可以配置注解的exclude属性,例如:

    @Configuration
    @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
    public class MyConfiguration {
    }

    @SpringBootApplication

    由于大量项目都会在主要的配置类上添加@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解。

    因此Spring Boot提供了@SpringBootApplication注解,该注解可以替代上面三个注解(使用Spring注解继承实现)

    一般Spring Boot的Web应用都有一个xxxApplication类,并使用@SpringBootApplication注解标记,作为该web应用的加载入口。此外,还需要在main方法中(可以是任意一个类)使用SpringApplication.run(xxxApplication.class, args)来启动该web应用。

    hello等方法

    @RequestMapping("/hello")
        public String hello() {
            return "hello world";
        }

    这些方法都添加了@RequestMapping("xxx"),这个注解起到路由的作用。

    启动项目SpringApplication.run

    启动Spring Boot项目最简单的方法就是执行下面的方法:

    SpringApplication.run(HelloApplication.class, args);

    运行HelloApplication中的main()方法,启动该web应用后,在地址栏输入”http://localhost:8080/hello“,就可以看到输出结果了。

    项目启动后输出如下日志:

    [INFO] Attaching agents: [F:.m2
    epositoryorgspringframeworkspringloaded1.2.5.RELEASEspringloaded-1.2.5.RELEASE.jar]
    
      .   ____          _            __ _ _
     /\ / ___'_ __ _ _(_)_ __  __ _    
    ( ( )\___ | '_ | '_| | '_ / _` |    
     \/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v1.2.3.RELEASE)
    
    2015-12-12 22:26:35.298  INFO 9844 --- [           main] c.github.abel533.springboot.Application  : Starting Application on liuzh-PC with PID 9844 (F:LiuIDEASpringBootspring-boot	argetclasses started by liuzh_3nofxnp in F:LiuIDEASpringBootspring-boot)
    2015-12-12 22:26:35.332  INFO 9844 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@a38d7a3: startup date [Sat Dec 12 22:26:35 CST 2015]; root of context hierarchy
    2015-12-12 22:26:35.734  INFO 9844 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
    2015-12-12 22:26:36.302  INFO 9844 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
    2015-12-12 22:26:36.456  INFO 9844 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
    2015-12-12 22:26:36.457  INFO 9844 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.0.20
    2015-12-12 22:26:36.537  INFO 9844 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
    2015-12-12 22:26:36.537  INFO 9844 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1207 ms
    2015-12-12 22:26:36.941  INFO 9844 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
    2015-12-12 22:26:36.944  INFO 9844 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'characterEncodingFilter' to: [/*]
    2015-12-12 22:26:36.945  INFO 9844 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
    2015-12-12 22:26:37.111  INFO 9844 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@a38d7a3: startup date [Sat Dec 12 22:26:35 CST 2015]; root of context hierarchy
    2015-12-12 22:26:37.152  INFO 9844 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto java.lang.String com.github.abel533.springboot.Application.home()
    2015-12-12 22:26:37.152  INFO 9844 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/now],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto java.lang.String com.github.abel533.springboot.Application.hehe()
    2015-12-12 22:26:37.156  INFO 9844 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
    2015-12-12 22:26:37.156  INFO 9844 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[text/html],custom=[]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
    2015-12-12 22:26:37.175  INFO 9844 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2015-12-12 22:26:37.175  INFO 9844 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2015-12-12 22:26:37.195  INFO 9844 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2015-12-12 22:26:37.237  INFO 9844 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
    2015-12-12 22:26:37.279  INFO 9844 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
    2015-12-12 22:26:37.280  INFO 9844 --- [           main] c.github.abel533.springboot.Application  : Started Application in 2.181 seconds (JVM running for 2.607)

    最后

    以上是Spring Boot基础的内容。

  • 相关阅读:
    用来验证字符串的规则引擎
    C++基本错误:
    web service传递stream二进制对象的解决方法
    安装EnterpriseLibrary4.1后遇到PresentationBuildTasks找不到的问题
    关于NHibernate示例程序QuickStart无法运行的问题
    关于iframe.document
    .NET下转换日期格式为中文大写
    History(历史)命令用法 15 例
    防火墙技术发展趋势浅析
    MIME类型大全
  • 原文地址:https://www.cnblogs.com/huanglog/p/8436464.html
Copyright © 2020-2023  润新知