
在Nest.js中使用Redis:高效緩存與數據管理
Spring5.x 版本中 Web 模塊的 Portlet 組件已經被廢棄掉,同時增加了用于異步響應式處理的 WebFlux 組件。
Spring 團隊提倡測試驅動開發(TDD)。有了控制反轉 (IoC)的幫助,單元測試和集成測試變得更簡單。Spring 的測試模塊對 JUnit、TestNG、Mockito、PowerMock 等常用測試框架有良好的支持,并且提供了模擬 Http 請求等基于 Spring 的測試功能。
Spring 框架的核心模塊,主要提供 IoC 依賴注入功能的支持,由 Beans 模塊、Core 核心模塊、Context 上下文模塊和 SpEL 表達式語言模塊組成。沒有這些核心容器,也就不可能有 AOP、Web 等上層的功能。
這些模塊提供了面向切面編程、與 AspectJ 的集成支持、為 JVM 添加代理的功能、基礎的報文傳送應用支持等。
這些模塊提供了對數據庫訪問的抽象、編程和聲明式事務管理、對 ORM 框架的支持、OXM 支持、JMS 支持等。
提供了基本的 Web 開發集成特性、Spring MVC Web 框架實現、WebSocket 支持、WebFlux 支持等。
Spring 包含多個功能模塊,其中最重要的是 Spring-Core 模塊,其他模塊如 Spring MVC 的功能實現基本都依賴于該模塊。Spring MVC 是 Spring 中的一個重要模塊,主要賦予快速構建 MVC 架構的能力。Spring Boot 旨在簡化 Spring 開發,減少配置文件,實現開箱即用。
案例源碼點擊 這里。
8
8
5.3.37
1.9.6
org.springframework
spring-context
${spring.version}
org.springframework
spring-core
${spring.version}
org.springframework
spring-beans
${spring.version}
org.aspectj
aspectjweaver
${aspectjweaver.version}
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class UserDaoImpl{
public List findUserList() {
return Collections.singletonList(new User("seven", 18));
}
}
public class UserServiceImpl {
private UserDaoImpl userDao;
public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
}
public List findUserList() {
return userDao.findUserList();
}
}
@Aspect
public class LogAspect {
@Around("execution(* com.seven.springhelloworldxml.service.*.*(..))")
public Object businessService(ProceedingJoinPoint pjp) throws Throwable {
Method method = ((MethodSignature) pjp.getSignature()).getMethod();
System.out.println("execute method: " + method.getName());
return pjp.proceed();
}
}
public class APP {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("aspects.xml", "spring.xml");
UserServiceImpl service = context.getBean("userService", UserServiceImpl.class);
List userList = service.findUserList();
userList.forEach(a -> System.out.println(a.getName() + "," + a.getAge()));
}
}
運行結果:
控制反轉是一種設計思想,Spring 通過 IoC 容器來實現這一特性。用戶不再需要手動創建對象,而是由 Spring 框架負責管理對象的創建和生命周期。這不僅提高了代碼的可維護性,還使得組件之間的依賴關系變得更加清晰。
AOP 的核心思想是將業務邏輯與系統服務邏輯分開,通過定義切面來實現解耦。Spring 的 AOP 模塊通過動態代理技術在運行時將切面邏輯織入到目標對象中,從而實現日志記錄、事務管理等功能的非侵入式集成。
在傳統的 Spring 配置中,XML 被廣泛用于定義 Bean 和其依賴關系。然而,XML 配置容易變得冗長和難以維護。Java 配置通過注解和 Java 類來替代 XML 配置,使得配置更加直觀和易于管理。
@EnableAspectJAutoProxy
@Configuration
public class BeansConfig {
@Bean("userDao")
public UserDaoImpl userDao() {
return new UserDaoImpl();
}
@Bean("userService")
public UserServiceImpl userService() {
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(userDao());
return userService;
}
@Bean("logAspect")
public LogAspect logAspect() {
return new LogAspect();
}
}
隨著 Java 5 引入注解,Spring 從 2.5 版本開始支持基于注解的配置。通過注解,開發者可以簡化 Bean 的定義和依賴注入過程。
@Service
public class UserServiceImpl {
@Autowired
private UserDaoImpl userDao;
public List findUserList() {
return userDao.findUserList();
}
}
Spring Boot 通過約定大于配置的理念,進一步簡化了 Spring 應用的開發。它提供了一系列的 starter 包,幫助開發者快速搭建項目。
問:Spring 框架的主要特點是什么?
問:如何使用 Spring 進行依賴注入?
問:什么是 Spring Boot?
問:Spring AOP 是如何工作的?
問:Spring MVC 和 Spring Boot 有什么區別?