以前的项目都采用xml的配置方式,而spring boot使用的是java config,在配置上有很大的区别。
一、pom.xml
<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> <parent> <groupId>cn.anhur.cas</groupId> <artifactId>anhur-cas</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <artifactId>anhur-cas-ucenter-webapp</artifactId> <packaging>war</packaging> <name>anhur-cas-ucenter-webapp</name> <description>Anhur CAS user center Web application.</description> <properties> <framework.version>1.0.0-SNAPSHOT</framework.version> </properties> <build> <finalName>ucenter</finalName> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <server>tomcat</server> <url>http://www.anhur.cn:8082/manager/text</url> <path>/${project.build.finalName}</path> </configuration> <executions> <execution> <phase>deploy</phase> <goals> <goal>redeploy</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <dependencyManagement> <dependencies> <dependency> <groupId>cn.anhur.framework</groupId> <artifactId>anhur-framework</artifactId> <version>${framework.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>cn.anhur.framework</groupId> <artifactId>anhur-framework-core</artifactId> <version>${framework.version}</version> </dependency> </dependencies> </project>
- <packaging>war</packaging>原有的项目采用的是自动化打包成war部署,不想打破配置,依然采用war的方式部署,不过个人觉得,使用jar的方式会好点。
- <failOnMissingWebXml>false</failOnMissingWebXml>spring boot的web工程是没有web.xml的,如果使用了war的打包方式会打包失败,这配置忽略了这一错误。
- <artifactId>tomcat7-maven-plugin</artifactId>自动化部署插件。
- <artifactId>spring-boot-maven-plugin</artifactId>加入spring boot插件
- <artifactId>spring-boot-starter-thymeleaf</artifactId>视图所需依赖,th模板最大的好处是使用了替换的方式填充模型,在html5下可以做到原型即模板。
- <artifactId>spring-boot-starter-tomcat</artifactId>由于使用了tomcat作为运行环境,那么spring boot里依赖的tomcat就不需要打包了。
二、创建程序入口
@SpringBootApplication @EnableAutoConfiguration public class AccountApplication { public static void main(String[] args) { SpringApplication.run(AccountApplication.class, args); } }
- @SpringBootApplication
- @EnableAutoConfiguration 启用自动配置
public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(AccountApplication.class); } }
使用了外置的tomcat,由于没有web.xml,tomcat无从下手,需要告诉容器怎么启动。
三、数据库等配置
spring.datasource.url=jdbc:mysql://localhost:3306/cas spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update #spring.http.encoding.charset=UTF-8 #spring.http.encoding.enable=true spring.http.encoding.force=true spring.resources.chain.strategy.content.enabled=true spring.resources.chain.strategy.content.paths=/**
四、第一个http请求
@Controller @RequestMapping("/user") public class UserController { @Autowired @Qualifier("userService") private UserService userService; @RequestMapping(value = "/", method = RequestMethod.GET) public String index(Model model) { model.addAttribute("title", "用户管理"); model.addAttribute("h", "陶远平"); return "user/index"; } @ResponseBody @RequestMapping(value = "/list", method = RequestMethod.GET) public List<User> list() { return userService.list(); } }
@Service("userService") public class UserServiceImpl extends BaseServiceImpl<User, Long> implements UserService { private UserRepository userRepository; @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; setBaseRepository(userRepository); } @Override public List<User> list() { return userRepository.findAll(); } }
public interface UserRepository extends BaseRepository<User, Long> { }
使用spring data jpa,可以简单建立数据库操作。
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title th:text="${title}">原型标题</title> <script type="text/javascript" src="../../static/js/vue.js" th:src="@{${urls.getForLookupPath('/js/vue.js')}}"></script> </head> <body> <h1 th:text="${h}">原型</h1> </body> </html>
五、整个目录结构

WebMvcConfigurer 配置了fastjson作为json的转换提供者。
@Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { super.configureMessageConverters(converters); FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConverter.setFastJsonConfig(fastJsonConfig); converters.add(fastJsonConverter); } }
@ControllerAdvice public class ControllerConfig { @Autowired private ResourceUrlProvider resourceUrlProvider; @ModelAttribute("urls") public ResourceUrlProvider urls() { return this.resourceUrlProvider; } }
ControllerConfig配置了静态资源的版本,使用了MD5的方式,主要静态资源做过修改,那么发布时就可以不用清理浏览器的缓存了。urls.getForLookupPath会得到一串带有MD5的映射。
六、我们可以测试一下


Hibernate: select user0_.id as id1_0_, user0_.create_date as create_d2_0_, user0_.modify_date as modify_d3_0_, user0_.department as departme4_0_, user0_.email as email5_0_, user0_.enabled as enabled6_0_, user0_.name as name7_0_, user0_.password as password8_0_, user0_.phone as phone9_0_, user0_.username as usernam10_0_ from user user0_
符合我们预期的效果。
ps:在程序中使用了默认的目录结构,这符合 约定优于配置