天天看點

springboot 基本知識

官方建議的代碼目錄

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

Application.java 典型的代碼

package com.example.myproject;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
      

@ComponentScan

它會掃描(@Component, @Service, @Repository, @Controller)等這些注解,并自動注冊為Spring Bean

@SpringBootApplication

等同于同時使用(@Configuration, @EnableAutoConfiguration, @Componentscan)這些注解.

運作Spring Boot

java -jar target/myproject-0.0.1-SNAPSHOT.jar

或者
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar target/myproject-SNAPSHOT.jar

或者
export MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=M -Djava.security.egd=file:/dev/./urandom
mvn spring-boot:run

或者
      

預設的配置檔案名

父,子容器設定

new SpringApplicationBuilder()
    .bannerMode(Banner.Mode.OFF)
    .sources(Parent.class)
    .child(Application.class)
    .run(args);
           

Spring boot 中事件監聽

SpringApplication.addListeners(…​)
      

通過注冊監聽器,來監聽相應的事件

通路應用參數

@Component
public class MyBean {

    @Autowired
    public MyBean(ApplicationArguments args) {
        boolean debug = args.containsOption("debug");
        List<String> files = args.getNonOptionArgs();
        // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"]
    }

}
           

Spring Boot 監控

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
      

添加這個依賴,然後就可以看到啟動時加載的資訊了:

troller.error(javax.servlet.http.HttpServletRequest)
 ::  INFO  --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
 ::  INFO  --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
 ::  INFO  --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
 ::  INFO  --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/autoconfig || /autoconfig.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
 ::  INFO  --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/dump || /dump.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
 ::  INFO  --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/env/{name:.*}],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpoint.value(java.lang.String)
 ::  INFO  --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/env || /env.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
 ::  INFO  --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/health || /health.json],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint.invoke(java.security.Principal)
 ::  INFO  --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/metrics/{name:.*}],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint.value(java.lang.String)
 ::  INFO  --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/metrics || /metrics.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
 ::  INFO  --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/beans || /beans.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
 ::  INFO  --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/mappings || /mappings.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
 ::  INFO  --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/configprops || /configprops.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
 ::  INFO  --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/info || /info.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
 ::  INFO  --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/trace || /trace.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
           

修改字首

這樣子,就要通過 

/my/manager/health

 這樣子來通路了.

Spring Admin

maven的依賴

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-server</artifactId>
</dependency>
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-server-ui</artifactId>
</dependency>
      

在配置檔案裡添加

spring.application.name=Spring Boot Admin Web
spring.boot.admin.url=http://localhost:${server.port}/admin
spring.boot.admin.context-path=/admin
      

然後通路: Go

根據不同環境使用 properties

application.properties
application-dev.properties
application-pro.properties
           

然後設定 

spring.profiles.active=xxx

 ,就可以使用相應的配置檔案了.(-Dspring.profiles.active=production)

注意,這裡是有繼承關系的.即 

application.properties

 是公共的,即無論在哪種環境,它都會加載的.

如果 

spring.profiles.active=default

 ,就隻會加載 

application.properties

 .

如果 

spring.profiles.active=dev

 ,就會加載 

application.properties

 ,然後再加載 

application-dev.properties

 .而且 

application-dev.properties

 的屬性,會覆寫 

application.properties

 的.

而且,還可以向前引用變量。比如這樣子:

hello.world=def
hello.world.parent=${hello.world} from parent
           

使用 Bean 來映射properties檔案

@Component
@ConfigurationProperties(prefix="person")
public class ConnectionSettings {

    private String firstName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

}
      

然後 

properties

 檔案 裡可以這樣子寫

person.firstName=xxx

或者
person.first-name=xxx

或者
PERSON_FIRST_NAME=xxx
           

配置自定義Bean

@Configuration
public class MyConfiguration {

    @Bean
    public HttpMessageConverters customConverters() {
        HttpMessageConverter<?> additional = ...
        HttpMessageConverter<?> another = ...
        return new HttpMessageConverters(additional, another);
    }

}
           

關于靜态資源的處理

這是Spring boot 預設情況下配置.

預設情況下,在classpath路徑下的 

/static (or /public or /resources or /META-INF/resources)

 這些目錄,是被看作是靜态資源的存放路徑的.

也可以通過 

spring.resources.staticLocations

 參數來指定.

打包為普通的 war 包形式

HelloWorldSpringBoot.java

package org.emacsist;

import de.codecentric.boot.admin.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * Created by sky on 16-2-14.
 */
@SpringBootApplication
@EnableAdminServer
@EnableDiscoveryClient
public class HelloWorldSpringBoot extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(HelloWorldSpringBoot.class);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication app = new SpringApplication(HelloWorldSpringBoot.class);
        app.run(args);
    }

}
      

修改 

pom

<packaging>war</packaging>


<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <start-class>org.emacsist.HelloWorldSpringBoot</start-class>
        <java.version>1.8</java.version>
</properties>

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
</dependency>
           

項目的目錄結構改為

src |
    |-main
        |-webapp
            |-WEB-INF

其他的按普通的項目目錄處理即可.
           

參考資料

  • Spring Boot

繼續閱讀