本次教程中會使用到這三項來輔助開發一套完整的後端系統,我們會從簡單的組合開始介紹,也就是從Spring Boot + Spring Data,再到Spring Boot + Spring Data + Spring Security
但是在那之前,我們還是先針對這幾項進行簡單的介紹
Spring Boot 透過提供自動配置、簡化依賖管理、內嵌服務器等特性,大大簡化了 Spring 應用的開發過程。它遵循「約定優於配置」的原則,減少了樣板代碼和配置的需求,讓開發者能夠加速開發過程。
其中最直觀的一個差異就是在啟動應用時,沒使用Spring Boot需要手寫一長串的配置,大概像這樣:
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
servletContext.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
這串程式碼的主要用意,是為了要設置 Spring Web 應用,首先創建一個基於 Spring 應用的 Context,接著註冊自己設定的 AppConfig,然後添加加載器的監聽器,最後配置 DispatcherServlet
看著就十分麻煩,因此若有使用Spring Boot ,我們可以將這段程式碼簡化成下面這樣:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
其他便利的設定還有,配置屬性時,使用Spring Boot可以很簡單的在 application.properties 中設定相關的設定:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=user
spring.datasource.password=password
如果沒有使用就必須先創建屬性文件,並在Spring 配置文件中明確加載這個屬性文件
Spring Data 簡化了數據訪問層的開發。它提供了一種熟悉且一致的基於Spring的編程模型,同時仍保留底層數據存儲的特殊特性。
在後端開發過程中,少不了的就是資料庫的建立,我們可以透過 Spring Data 快速建立相關的設定,像是DAO的設計
在未使用的情況下,我們需要寫清楚每個功能的SQL查詢
@Repository
public class UserRepositoryImpl implements UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<User> findByName(String name) {
return jdbcTemplate.query(
"SELECT * FROM users WHERE name = ?",
new Object[]{name},
(rs, rowNum) ->
new User(
rs.getLong("id"),
rs.getString("name"),
rs.getString("email")
)
);
}
}
相反的,如果有使用 Spring Data 的話,就可以縮減成這樣
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByName(String name);
}
Spring Data 提供了在 Repository 接口中定義特定的方法名稱來快速創建所需的查詢方法
這邊列出一些常用的方法名稱
以及結合上述的常用方法、前綴和關鍵字的一些使用範例:
public interface UserRepository extends JpaRepository<User, Long> {
// 根據名字查找用戶
List<User> findByName(String name);
// 根據名字和郵箱查找用戶
User findByNameAndEmail(String name, String email);
// 查找年齡大於指定值的用戶
List<User> findByAgeGreaterThan(int age);
// 查找名字包含特定字符串的用戶,忽略大小寫
List<User> findByNameContainingIgnoreCase(String namePart);
// 根據年齡範圍查找用戶,並按名字排序
List<User> findByAgeBetweenOrderByNameAsc(int ageFrom, int ageTo);
// 查找特定城市的活躍用戶
List<User> findByAddressCityAndActiveTrue(String city);
// 統計特定郵箱域名的用戶數量
long countByEmailEndingWith(String emailDomain);
// 檢查是否存在特定名字的用戶
boolean existsByName(String name);
}
Spring Security是一個功能強大且高度自定義的認證和訪問控制框架。它是保護基於Spring的應用程式的事實標準。
想要一個後端服務系統變的完整,另外一個重要的項目就是安全性,我們可以透過 Spring Security 為我們的後端服務添加像是:
帳戶權限
我們可以設定一個用戶在註冊時的角色權限,並設定特定的 API 服務需要不同權限才可以使用,例如:我們可以設定「一般使用者、擁有者」這兩種角色,接著設定一個API 服務需要 擁有者 的權限才可以使用。
身分認證
我們可以使用像是「JWT、OAuth 2.0、HTTP Basic 認證...」等等的身分認證方式,做到避免未經系統認證的請求通過。
安全標頭
Spring Security 自動添加了一些安全標頭,像是「X-XSS-Protection、X-Frame-Options、X-Content-Type-Options...」。
CSRF保護
Spring Security默認啟用CSRF (跨站請求偽造) 保護。
藉由上述介紹的各種加速開發的工具,在後端開發上可以節省很多時間,也避免了各種需要重複設計的版面,不但讓程式碼更簡潔也讓程式碼在維護上更加輕鬆。