知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) @ComponentScan({"cn.netkiller.controller"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
/etc/systemd/system/spring.service
#################################################### # Homepage: http://netkiller.github.io # Author: netkiller<netkiller@msn.com> # Script: https://github.com/oscm/shell # Date: 2015-11-03 #################################################### [Unit] Description=Spring Boot Application After=network.target [Service] User=www Group=www Type=oneshot WorkingDirectory=/www/netkiller.cn/api.netkiller.cn ExecStart=/usr/bin/java -jar your_jar_file.jar --spring.config.location=appliction-production.properties --spring.profiles.active=profile #ExecStop=pkill -9 -f RemainAfterExit=yes [Install] WantedBy=multi-user.target
#!/bin/bash ############################################## # Author: netkiller<netkiller@msn.com> # Homepage: http://www.netkiller.cn # Date: 2017-02-08 # $Author$ # $Id$ ############################################## # chkconfig: 345 100 02 # description: Spring boot application # processname: springbootd # File : springbootd ############################################## BASEDIR="/www/netkiller.cn/api.netkiller.cn" JAVA_HOME=/srv/java JAVA_OPTS="-server -Xms2048m -Xmx8192m -Djava.security.egd=file:/dev/./urandom" PACKAGE="api.netkiller.cn-0.0.2-release.jar" CONFIG="--spring.config.location=$BASEDIR/application.properties" USER=www ############################################## NAME=springbootd PROG="$JAVA_HOME/bin/java $JAVA_OPTS -jar $BASEDIR/$PACKAGE $CONFIG" LOGFILE=/var/tmp/$NAME.log PIDFILE=/var/tmp/$NAME.pid ACCESS_LOG=/var/tmp/$NAME.access.log ############################################## function log(){ echo "$(date -d "today" +"%Y-%m-%d %H:%M:%S") $1 $2" >> $LOGFILE } function start(){ if [ -f "$PIDFILE" ]; then echo $PIDFILE exit 2 fi su - $USER -c "$PROG & echo \$! > $PIDFILE" log info start } function stop(){ [ -f $PIDFILE ] && kill `cat $PIDFILE` && rm -rf $PIDFILE log info stop } function status(){ ps aux | grep $PACKAGE | grep -v grep | grep -v status log info status } function reset(){ pkill -f $PACKAGE [ -f $PIDFILE ] && rm -rf $PIDFILE log info reset } case "$1" in start) start ;; stop) stop ;; status) status ;; restart) stop start ;; log) tail -f $LOGFILE ;; reset) reset ;; *) echo $"Usage: $0 {start|stop|status|restart|log|reset}" esac exit $?
package demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.web.SpringBootServletInitializer; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @Configuration @ComponentScan @EnableAutoConfiguration public class Application extends SpringBootServletInitializer { private static Class<Application> applicationClass = Application.class; public static void main(String[] args) { SpringApplication.run(applicationClass, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(applicationClass); } }
@SpringBootApplication 是 @Configuration, @EnableAutoConfiguration 跟 @ComponentScan 的集合。
@SpringBootApplication
exclude 排除配置,下面例子是排除 DataSource配置
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@ComponentScan 注入會掃瞄 @Controller 與 @RestController
@ComponentScan @ComponentScan({"cn.netkiller.controller"}) @ComponentScan({"cn.netkiller.controller", "cn.netkiller.rest"})
public @Bean Filter characterEncodingFilter() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceEncoding(true); return characterEncodingFilter; }
隱藏 Spring Boot Banner
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.3.1.RELEASE)
public static void main(String[] args) { SpringApplication app = new SpringApplication(Application.class); app.setShowBanner(false); app.run(args); }
@EntityScan(basePackages = { "cn.netkiller.model" }) @EnableJpaRepositories(basePackages = { "cn.netkiller.repository" })
package cn.netkiller; import java.util.Arrays; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableAutoConfiguration @ComponentScan @EnableMongoRepositories @EnableJpaRepositories @EnableScheduling public class Application { public static void main(String[] args) { //SpringApplication.run(Application.class, args); ApplicationContext ctx = SpringApplication.run(Application.class, args); System.out.println("Let's inspect the beans provided by Spring Boot:"); String[] beanNames = ctx.getBeanDefinitionNames(); Arrays.sort(beanNames); for (String beanName : beanNames) { System.out.println(beanName); } } }
@Configuration public class TomcatConfiguration implements EmbeddedServletContainerCustomizer { int ports[] = { 8080, 8081, 8082 }; @Override public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) { if (ports != null) { // 判斷如果是Tomcat才進行如下配置 if (configurableEmbeddedServletContainer instanceof TomcatEmbeddedServletContainerFactory) { TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) configurableEmbeddedServletContainer; for (int port : ports) { // 一個Connecter監聽一個連接埠,指定協議為HTTP/1.1 Connector httpConnector = new Connector("HTTP/1.1"); httpConnector.setPort(port); tomcat.addAdditionalTomcatConnectors(httpConnector); } } } } }
public static void main(String[] args) { SpringApplication.run(Backend.class, "--spring.application.name=backend", "--server.port=9000" ); }
在 Java 代碼中激活 profile 直接指定環境變數來激活 profile: System.setProperty("spring.profiles.active", "test"); 在 Spring 容器中激活 profile: AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.getEnvironment().setActiveProfiles("development"); ctx.register(SomeConfig.class, StandaloneDataConfig.class, JndiDataConfig.class); ctx.refresh();