官方建議的代碼目錄
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