SpringBoot詳解系列文章:
SpringBoot詳解(一)-快速入門
SpringBoot詳解(二)-Spring Boot的核心
SpringBoot詳解(三)-Spring Boot的web開發
SpringBoot詳解(四)-優雅地處理日志
一、Spring Boot
久聞Spring Boot大名,這兩天終于得空,學習了一把,發覺Spring Boot確實好用,那Spring Boot到底是什么,又是怎么好用呢?
什么是Spring Boot
目前ssm框架還是比較常用的,其中的ss指的無非就是Spring 和 SpringMVC,我們可以簡單的認為 "Spring Boot ≥ Spring + SpringMVC",沒錯,用了Spring Boot中涵蓋了Spring和SpringMVC等大量常用開發配置,而且Spring Boot的配置極其簡單,可以讓你不用或者只需要很少的Spring配置就可以讓你的項目快速運行起來。
Spring Boot的優缺點
優點
- 快速構建項目
- 對主流開發框架的無配置集成
- 項目可獨立運行,無須外部依賴Servlet容器(Spring Boot默認自帶了一個Tomcat)
- 提供運行時的應用監控
- 極大地提高了開發、部署效率
- 與云計算的天然集成
缺點
- 坑有些多, 文檔略少
二、快速入門
1、Spring的Java配置方式
上面已經提到了,使用Spring Boot,可以讓你不用或者只需要很少的Spring配置就可以讓你的項目快速運行起來,說的就是使用代碼注解來取代xml配置。其實從Spring3.x開始就已經提供了java配置方式,使用java配置方式可以更好的理解你配置的Bean,而如今的Spring4.x更是推薦java配置方式,java配置方式可以完全替代xml配置,下面就先來看看兩個最基本的注釋:
1)@Configuration 和 @Bean
Spring的java配置方式是通過@Configuration 和 @Bean這兩個注釋實現的:
- @Configuration 作用于類上,相當于一個xml配置文件
- @Bean 作用于方法上,相當于xml配置中的
2)小示例
該示例將通過java配置方式配置Spring,實現Spring IOC功能。
這是一個簡單的模擬從數據庫獲取User數據的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;}
}復制代碼
這是一個最最常見的Service,通過注入UserDao,使用UserDao的方法獲取用戶數據。
@Service
public class UserService {@AutowiredUserDao userDao;public void getUserList() {List<String> list = userDao.queryUserList();for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}}復制代碼
從這里開始就跟以往的Spring開發不一樣了,這個類使用了2個新的注解,其中@Configuration表明該相當于Spring的一個xml配置文件,@Bean將一開始的UserDao配置給Spring管理.
@Configuration// 通過注解來表明該類是一個Spring的配置,相當于一個xml文件
public class SpringConfig {@Bean// 這里要注意,方法名"getUserDao"將作為UserDao在容器中的idpublic UserDao getUserDao() {return new UserDao();}
}復制代碼
接下來就是獲取Spring容器,從容器中拿到UserService,并調用其獲取用戶數據的方法,代碼如下:
public class Test {public static void main(String[] args) {AnnotationConfigApplicationContext acac = new AnnotationConfigApplicationContext(SpringConfig.class);UserService userService = (UserService) acac.getBean("userService");userService.getUserList();}
}復制代碼
像普通的java程序一樣,直接運行Test類中的main方法即可在控制臺看到用戶數據輸出了。
細心的你應該發現了,以往獲取Spring容器使用到的類要么是ClassPathXmlApplicationContext 或是 FileSystemXmlApplicationContext,但Spring Boot使用的卻是AnnotationConfigApplicationContext,原因也好理解,因為我們Spring Boot使用的是java配置的方式,而以往使用的是Spring的xml配置方式.
2、第一個Web應用
通過上面的示例,我們已經知道了java配置方式是怎么回事了,那接下來便正式開始使用Spring Boot來開發我們的第一個web應用了.
1)pom.xml配置
設置spring boot的parent
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version>
</parent>復制代碼
說明:Spring boot的項目必須要將parent設置為spring boot的parent,該parent包含了大量默認的配置,大大簡化了我們的開發。
導入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>復制代碼
通過上面簡單的3步配置,Spring Boot就配置完畢了,相比以往的Spring、SpringMVC配置是不是要簡潔的多呢?
2)小示例
@SpringBootApplication// Spring Boot項目的核心注解,主要目的是開啟自動配置
@Controller//標明這是一個SpringMVC的Controller控制器
public class HelloApplication {@RequestMapping("/hello")@ResponseBodypublic String hello() {return "hello world";}// 在main方法中啟動一個應用,即:這個應用的入口public static void main(String[] args) {SpringApplication.run(HelloApplication.class, args);}}復制代碼
一般Spring Boot的Web應用都有一個xxxApplication類,并使用@SpringBootApplication注解標記,作為該web應用的加載入口。此外,還需要在main方法中(可以是任意一個類)使用SpringApplication.run(xxxApplication.class, args)來啟動該web應用。
運行HelloApplication中的main()方法,啟動該web應用后,在地址欄輸入"http://localhost:8080/hello",就可以看到輸出結果了。
3)運行報錯
如果你項目中沒有其他配置,那在運行這個簡單的項目時一般是不會報錯的,但如果很不幸你第一次運行就報錯的話,也不用著急,大部分問題百度即可,本人在啟動項目過程中遇到就"Cannot determine embedded database driver class for database type NONE"這樣的錯誤,這樣就記錄一下,報錯截圖如下:
原因是:springboot啟動時會自動注入數據源和配置jpa。
解決方法:在@SpringBootApplication中排除其注入
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
所以,上面的代碼修改如下即可:
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
@Controller
public class HelloApplication {...
}復制代碼
三、疑問
到這里是不是已經大概感覺到了Spring Boot的高效和簡潔了呢?配置就是如此簡單,功能就是如此強大,但通過上面一系列的講解,你是不是也產生一些疑惑呢,比如:
- Spring Boot的WEB應用默認端口就是8080,那這個端口要怎么修改呢?
- 為什么會出現"Cannot determine embedded database driver class for database type NONE"這樣的錯誤?(或者說為什么springboot啟動時會自動注入數據源和配置jpa)
- 為什么@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})就可以解決"Cannot determine embedded database driver class for database type NONE"這樣的錯誤呢?
- 既然Spring Boot的WEB應用默認使用的是自帶的Tomcat,那要怎么部署到外部的Servlet容器呢?
- ...
不急,后續文章將會對這些問題一一解釋清楚。