SpringBoot詳解系列文章:
SpringBoot詳解(一)-快速入門
SpringBoot詳解(二)-Spring Boot的核心
SpringBoot詳解(三)-Spring Boot的web開發(fā)
SpringBoot詳解(四)-優(yōu)雅地處理日志
一、Spring Boot
久聞Spring Boot大名,這兩天終于得空,學(xué)習(xí)了一把,發(fā)覺Spring Boot確實(shí)好用,那Spring Boot到底是什么,又是怎么好用呢?
什么是Spring Boot
目前ssm框架還是比較常用的,其中的ss指的無非就是Spring 和 SpringMVC,我們可以簡(jiǎn)單的認(rèn)為 "Spring Boot ≥ Spring + SpringMVC",沒錯(cuò),用了Spring Boot中涵蓋了Spring和SpringMVC等大量常用開發(fā)配置,而且Spring Boot的配置極其簡(jiǎn)單,可以讓你不用或者只需要很少的Spring配置就可以讓你的項(xiàng)目快速運(yùn)行起來。
Spring Boot的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 快速構(gòu)建項(xiàng)目
- 對(duì)主流開發(fā)框架的無配置集成
- 項(xiàng)目可獨(dú)立運(yùn)行,無須外部依賴Servlet容器(Spring Boot默認(rèn)自帶了一個(gè)Tomcat)
- 提供運(yùn)行時(shí)的應(yīng)用監(jiān)控
- 極大地提高了開發(fā)、部署效率
- 與云計(jì)算的天然集成
缺點(diǎn)
- 坑有些多, 文檔略少
二、快速入門
1、Spring的Java配置方式
上面已經(jīng)提到了,使用Spring Boot,可以讓你不用或者只需要很少的Spring配置就可以讓你的項(xiàng)目快速運(yùn)行起來,說的就是使用代碼注解來取代xml配置。其實(shí)從Spring3.x開始就已經(jīng)提供了java配置方式,使用java配置方式可以更好的理解你配置的Bean,而如今的Spring4.x更是推薦java配置方式,java配置方式可以完全替代xml配置,下面就先來看看兩個(gè)最基本的注釋:
1)@Configuration 和 @Bean
Spring的java配置方式是通過@Configuration 和 @Bean這兩個(gè)注釋實(shí)現(xiàn)的:
- @Configuration 作用于類上,相當(dāng)于一個(gè)xml配置文件
- @Bean 作用于方法上,相當(dāng)于xml配置中的<bean>
2)小示例
該示例將通過java配置方式配置Spring,實(shí)現(xiàn)Spring IOC功能。
這是一個(gè)簡(jiǎn)單的模擬從數(shù)據(jù)庫獲取User數(shù)據(jù)的Dao類(注意,它并沒有使用任何注解,也就是說UserDao目前并沒有交給Spring容器管理)。
public class UserDao {
public List<String> queryUserList() {
List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add("User " + i);
}
return list;
}
}
這是一個(gè)最最常見的Service,通過注入U(xiǎn)serDao,使用UserDao的方法獲取用戶數(shù)據(jù)。
@Service
public class UserService {
@Autowired
UserDao userDao;
public void getUserList() {
List<String> list = userDao.queryUserList();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
從這里開始就跟以往的Spring開發(fā)不一樣了,這個(gè)類使用了2個(gè)新的注解,其中@Configuration表明該相當(dāng)于Spring的一個(gè)xml配置文件,@Bean將一開始的UserDao配置給Spring管理.
@Configuration// 通過注解來表明該類是一個(gè)Spring的配置,相當(dāng)于一個(gè)xml文件
public class SpringConfig {
@Bean// 這里要注意,方法名"getUserDao"將作為UserDao在容器中的id
public UserDao getUserDao() {
return new UserDao();
}
}
接下來就是獲取Spring容器,從容器中拿到UserService,并調(diào)用其獲取用戶數(shù)據(jù)的方法,代碼如下:
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext acac = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = (UserService) acac.getBean("userService");
userService.getUserList();
}
}
像普通的java程序一樣,直接運(yùn)行Test類中的main方法即可在控制臺(tái)看到用戶數(shù)據(jù)輸出了。
細(xì)心的你應(yīng)該發(fā)現(xiàn)了,以往獲取Spring容器使用到的類要么是ClassPathXmlApplicationContext 或是 FileSystemXmlApplicationContext,但Spring Boot使用的卻是AnnotationConfigApplicationContext,原因也好理解,因?yàn)槲覀僑pring Boot使用的是java配置的方式,而以往使用的是Spring的xml配置方式.
2、第一個(gè)Web應(yīng)用
通過上面的示例,我們已經(jīng)知道了java配置方式是怎么回事了,那接下來便正式開始使用Spring Boot來開發(fā)我們的第一個(gè)web應(yīng)用了.
1)pom.xml配置
設(shè)置spring boot的parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
說明:Spring boot的項(xiàng)目必須要將parent設(shè)置為spring boot的parent,該parent包含了大量默認(rèn)的配置,大大簡(jiǎn)化了我們的開發(fā)。
導(dǎo)入spring boot的web支持
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
添加Spring boot的插件
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
通過上面簡(jiǎn)單的3步配置,Spring Boot就配置完畢了,相比以往的Spring、SpringMVC配置是不是要簡(jiǎn)潔的多呢?
2)小示例
@SpringBootApplication// Spring Boot項(xiàng)目的核心注解,主要目的是開啟自動(dòng)配置
@Controller//標(biāo)明這是一個(gè)SpringMVC的Controller控制器
public class HelloApplication {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "hello world";
}
// 在main方法中啟動(dòng)一個(gè)應(yīng)用,即:這個(gè)應(yīng)用的入口
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
一般Spring Boot的Web應(yīng)用都有一個(gè)xxxApplication類,并使用@SpringBootApplication注解標(biāo)記,作為該web應(yīng)用的加載入口。此外,還需要在main方法中(可以是任意一個(gè)類)使用SpringApplication.run(xxxApplication.class, args)來啟動(dòng)該web應(yīng)用。
運(yùn)行HelloApplication中的main()方法,啟動(dòng)該web應(yīng)用后,在地址欄輸入"http://localhost:8080/hello",就可以看到輸出結(jié)果了。

3)運(yùn)行報(bào)錯(cuò)
如果你項(xiàng)目中沒有其他配置,那在運(yùn)行這個(gè)簡(jiǎn)單的項(xiàng)目時(shí)一般是不會(huì)報(bào)錯(cuò)的,但如果很不幸你第一次運(yùn)行就報(bào)錯(cuò)的話,也不用著急,大部分問題百度即可,本人在啟動(dòng)項(xiàng)目過程中遇到就"Cannot determine embedded database driver class for database type NONE"這樣的錯(cuò)誤,這樣就記錄一下,報(bào)錯(cuò)截圖如下:

原因是:springboot啟動(dòng)時(shí)會(huì)自動(dòng)注入數(shù)據(jù)源和配置jpa。
解決方法:在@SpringBootApplication中排除其注入
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
所以,上面的代碼修改如下即可:
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
@Controller
public class HelloApplication {
...
}
三、疑問
到這里是不是已經(jīng)大概感覺到了Spring Boot的高效和簡(jiǎn)潔了呢?配置就是如此簡(jiǎn)單,功能就是如此強(qiáng)大,但通過上面一系列的講解,你是不是也產(chǎn)生一些疑惑呢,比如:
- Spring Boot的WEB應(yīng)用默認(rèn)端口就是8080,那這個(gè)端口要怎么修改呢?
- 為什么會(huì)出現(xiàn)"Cannot determine embedded database driver class for database type NONE"這樣的錯(cuò)誤?(或者說為什么springboot啟動(dòng)時(shí)會(huì)自動(dòng)注入數(shù)據(jù)源和配置jpa)
- 為什么@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})就可以解決"Cannot determine embedded database driver class for database type NONE"這樣的錯(cuò)誤呢?
- 既然Spring Boot的WEB應(yīng)用默認(rèn)使用的是自帶的Tomcat,那要怎么部署到外部的Servlet容器呢?
- ...
不急,后續(xù)文章將會(huì)對(duì)這些問題一一解釋清楚。