【转】Spring Boot 构建应用——快速构建 Spring Boot 应用
Spring Boot 简化了 Spring 应用开发,不需要配置就能运行 Spring 应用,Spring Boot 的自动配置是通过 Spring 4.x 的条件注解 @Conditional 来实现的,@Conditional 根据特定条件来控制 bean 的创建行为。Spring Boot 默认会使用内置的 Tomcat,并支持 Spring MVC、RESTful 服务。新建 Spring Boot 项目很简单,IntelliJ IDEA 在 New Project 中选择 Spring Initializr,然后组件选择 Web (集成 Spring MVC 框架) 即可创建成功。Spring Boot 通过 Starter 来提供系统级服务,Spring Boot 已经提供了一系列的 Starter,下表是 Spring Boot 提供的常用 Starter:
| 名称 | 作用 |
|---|---|
| spring-boot-starter-web | Web开发支持,默认使用Tomcat8 |
| spring-boot-starter-aop | AOP开发支持,使用AspectJ |
| spring-boot-starter-test | 包含JUnit、Spring Test、Hamcrest、Mockito等测试工具 |
| spring-boot-starter-jdbc | Spring JDBC |
| spring-boot-starter-cache | 缓存,支持多种缓存方式,如本地的、Redis、Ehcache等 |
| spring-boot-starter-activemq | 消息集成ActiveMQ支持 |
| spring-boot-starter-amqp | 消息集成AMQP协议支持,如支持RabbitMQ |
| spring-boot-starter-web-services | webservice支持 |
| spring-boot-starter-websocket | websocket支持 |
| spring-boot-starter-jersey | REST应用和Jersey支持 |
| spring-boot-starter-freemarker | Freemarker模板引擎支持 |
| spring-boot-starter-thymeleaf | Thymeleaf模板引擎支持 |
| spring-boot-starter-jta-atomikos | 分布式事务支持,使用atomikos |
| spring-boot-starter-jta-bitronix | 一个开源的分布式事务支持 |
| spring-boot-starter-data-jpa | JPA方式访问数据库,使用Hibernate作为JPA实现 |
| spring-boot-starter-data-elasticsearch | 集成Elasticsearch,默认访问localhost:9200 |
| spring-boot-starter-data-redis | 集成Redis,使用JRedis,默认连接localhost:6379 |
| spring-boot-starter-data-mongodb | 集成MongoDB,默认访问mongodb://localhost/test |
| spring-boot-starter-data-neo4j | 集成neo4j,默认访问localhost:7474 |
| spring-boot-starter-data-gemfire | 集成分布式缓存 |
| spring-boot-starter-data-solr | 集成solr搜索平台,默认访问http://localhost:8983/solr |
| spring-boot-starter-data-cassandra | 集成Cassandra,默认访问localhost:7474 |
| spring-boot-starter-data-ldap | 集成ldap |
| spring-boot-devtools | 页面和代码的热部署,在修改类或者配置文件的时候自动重新加载Spring Boot应用 |
http://localhost:8081/hello,即可看到输出结果 “Hello, Spring Boot!”。Spring Boot其他常用注解如下:
| Spring Boot常用注解 | 释义 |
|---|---|
| @Component | 通用注解,会被注册为bean组件、基于它的还有@Repository、@Service、@Controller |
| @Autowired | 标注在构造方法、类的任何方法上,实现自动装配 |
| @Resource | 默认按名称装配,当找不到与名称匹配的bean才会按类型装配 |
| @Lazy(true) | 表示延迟初始化 |
| @Import | 导入配置类,并支持导入普通的java类,并将其声明成一个bean |
| @Transactional | 标注在类或方法上,声明式事务注解。建议使用@Transactional(rollbackFor = Exception.class) |
| @Value | 使用EL-Spring表达式注入字符、属性、内容等 |
| @JsonSerialize | jackson注解,标注在属性或者字段上,指定序列化方式 |
| @JsonProperty(“name”) | jackson注解,标注在VO对象的属性上,例如categoryName,返回json中将显示成name |
| @JsonIgnore | jackson注解,标注在POJO对象的属性、方法上,转成json格式时忽略该属性或者方法 |
http://www.pppet.net/ 生成。配置类:
@Configuration
@EnableScheduling
public class TaskSchedulerConfiguration {
}
@Configuration
@EnableScheduling
public class TaskSchedulerConfiguration {
}计划任务执行类:
@Service
public class ScheduledTaskService {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
System.out.println("每隔5秒执行1次:" + dateFormat.format(new Date()));
}
@Scheduled(cron = "0/10 * * * * ? ")
public void fixTimeExecution() {
System.out.println("在指定时间" + dateFormat.format(new Date()) + "执行");
}
}
运行 Spring Boot 项目,发现计划任务按照计划依次执行成功。
Freemaker 模版页面放在 resources/templates 下。我们将Freemaker 模版页面 index.ftl 放入到 resources/templates 下,编写一个 Controller 测试一下:
@Controller
public class IndexController {
@RequestMapping(value = "index", method = RequestMethod.GET)
public String showIndex() {
return "index";
}
}
@Controller
public class IndexController {
@RequestMapping(value = "index", method = RequestMethod.GET)
public String showIndex() {
return "index";
}
}运行访问,发现已经可以访问了。替换 favicon 只需要将自己的 favicon.ico 放置在 resources/static 下即可。除了这些,Spring Boot 还可以加载 WebJars,WebJars 将浏览器资源(css,js等)打成 jar 文件,以对资源进行统一依赖管理,例如添加 bootstrap:
<dependency>
<groupId>org.webjarsgroupId>
<artifactId>bootstrapartifactId>
<version>3.3.7-1version>
dependency>
页面引入就可以正常使用了:
<script type="text/javascript" src="/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js">script>
9.Spring Boot单元测试
1.Service单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class ContentServiceTest {
@Resource
private ContentService contentService;
@Test
public void whenGetContentListSuccess() throws Exception {
Assert.assertNotEquals(0, contentService.getContentList().size());
}
}
2.Controller单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class ContentControllerTest {
@Resource
private ContentController contentController;
private MockMvc mvc;
private Logger logger = LoggerFactory.getLogger(ContentControllerTest.class);
@Before
public void setup() {
mvc = MockMvcBuilders.standaloneSetup(contentController).build();
}
@Test
public void whenGetContentListSuccess() throws Exception {
MvcResult result = mvc.perform(MockMvcRequestBuilders.get("/content/query/list")
.contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(MockMvcResultMatchers.status().isOk())
.andReturn();
logger.info(result.getResponse().getContentAsString());
}
}
Maven 打包跳过单元测试:
mvn clean package -Dmaven.test.skip=true
10.Spring Boot Logback日志配置
Spring Boot 默认使用 SLF4j 和 Logback 输出日志。增加 Logback 配置 resources/logback-spring.xml 即可完成日志文件的生成:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration debug="false">
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
pattern>
layout>
appender>
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERRORlevel>
<onMatch>DENYonMatch>
<onMismatch>ACCEPTonMismatch>
filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
pattern>
encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/tomcat/PROJECT_NAME/info.%d.logfileNamePattern>
<MaxHistory>30MaxHistory>
rollingPolicy>
appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERRORlevel>
filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
pattern>
encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/tomcat/PROJECT_NAME/error.%d.logfileNamePattern>
<MaxHistory>30MaxHistory>
rollingPolicy>
appender>
<root level="info">
<appender-ref ref="consoleLog" />
<appender-ref ref="fileInfoLog" />
<appender-ref ref="fileErrorLog" />
root>
configuration>
- spring boot项目发布
Spring Boot 内置了 tomcat-embed,所以可以直接通过 java -jar 的方式运行:
mvn clean package //打包
java -jar xx.jar --server.port=9090
java -jar xx.jar --spring.profiles.active=dev //可以通过java -jar配置参数指定配置文件
转载自:https://blog.csdn.net/smartbetter/article/details/53933096#