在 Java 開發的浩瀚世界裏,Spring 框架無疑是一顆璀璨耀眼的明珠。無論是初涉編程領域的新手,還是經驗豐富的資深開發者,都難以忽視它的強大與實用。它宛如一把萬能鑰匙,為諸多複雜的企業級應用開發難題解鎖,那麼 Spring 框架究竟是什麼呢?下面就帶你一探究竟。
一、Spring 框架 是什麼?
Spring 是輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架,可以很方便地對數據庫進行訪問、可以很方便地集成第三方組件。Spring 框架通過提供一系列的工具和特性,極大地簡化了企業級 Java 應用的開發過程。它不僅提高了代碼的可維護性和可測試性,還幫助開發者快速構建高效、可靠和可擴展的應用程序。
Spring 官網:https://spring.io/
二、什麼是控制反轉(IOC)?
在傳統的編程模型中,應用程序代碼通常直接控制對象的創建和依賴關係。例如,一個對象需要依賴另一個對象時,通常會在代碼中直接創建依賴對象。這種方式使得代碼緊密耦合,不利於測試和維護。
控制反轉的理念是將這種控制權從應用程序代碼中移除,轉而交給一個容器來管理。這個容器就是 Spring IOC 容器。通過這種方式,對象的創建和依賴關係的管理被反轉了,應用程序代碼不再負責這些任務,而是由容器來處理。
而依賴注入(DI)是實現控制反轉的一種方式。
Spring IOC 容器
Spring IOC 容器負責管理應用程序中對象的生命週期和依賴關係。
它的主要職責包括:
對象的創建:根據配置文件或註解創建對象。
依賴注入:將對象的依賴注入到相應的對象中。
對象的銷燬:在適當的時候銷燬對象,釋放資源。
三、Spring 的依賴注入是什麼?
依賴注入(Dependency Injection,簡稱 DI)是 Spring 框架實現控制反轉(IOC)的主要手段。DI 的核心思想是將對象的依賴關係從對象內部抽離出來,通過外部注入的方式提供給對象。這樣,依賴對象的創建和管理由 Spring 容器負責,而不是由對象自身負責,使得代碼更加模塊化、鬆耦合和易於測試。
在傳統編程中,一個對象通常會自己創建它所依賴的其他對象。這種方式使得代碼緊密耦合,不利於維護和測試。依賴注入通過將依賴關係從代碼中移除,轉而由外部容器(如 Spring 容器)來注入,從而實現了對象之間的鬆耦合。
依賴注入的配置方式
XML 配置:通過 XML 文件定義 Bean 及其依賴關係。
<beans>
<bean id="repository" class="com.example.Repository"/>
<bean id="service" class="com.example.Service">
<constructor-arg ref="repository"/>
</bean>
</beans>
Java 配置:通過 Java 類和註解定義 Bean 及其依賴關係。
@Configuration
public class AppConfig {
@Bean
public Repository repository() {
return new Repository();
}
@Bean
public Service service() {
return new Service(repository());
}
}
註解配置:通過註解(如@Component,@Autowired)自動掃描和注入 Bean。
@Component
public class Repository {
}
@Component
public class Service {
@Autowired
private Repository repository;
}
四、什麼是 AOP
aop 是 spring 框架的一個核心。常見的可以做日誌記錄,事務管理等公共性的處理。當我們想要統一做一些水平統一的操作的時候,就常用 aop。
aop 的核心概念就是面向切面變成。通過 aop 可以在範圍內的類方法執行之前,執行之後,或者異常的時候,做統一的操作。
aop 可以提高代碼的可維護性,任何修改只需要在切面中進行,而不需要修改業務邏輯代碼。
基於動態代理機制,還可以在不修改源代碼的情況下為現有代碼添加功能。在 boot 應用使用中,只需要配合 Aspect 註解,即可實現功能。
@Aspect
@Component
public class LogAspect {
// 定義切點 在執行UserService的每個方法前執行:
@PointCut("execution(public * com.mszlu.service.UserService.*(..))")
public void pt() {}
//定義通知
@Around("pt()")
public Object doLogging(ProceedingJoinPoint pjp) throws Throwable{
//方法調用
Object ret = pjp.proceed();
return ret;
}
}
五、説説 Spring 常用的註解
@Component:將一個類標記為 Spring 組件類,表示這個類的實例將由 Spring 容器管理。
@Autowired:自動注入依賴對象。可以用於構造器、字段、Setter 方法或其他任意方法。
@Qualifier:在有多個候選 Bean 時,指定要注入的 Bean。通常與@Autowired 一起使用。
@Component
public class MyComponent {
@Autowired
@Qualifier("specificBean")
private Dependency dependency;
}
@Configuration:標記一個類為 Spring 配置類,該類可以包含一個或多個@Bean 方法。
@Configuration
public class AppConfig {
@Bean
public MyComponent myComponent() {
return new MyComponent();
}
}
@Bean:定義一個方法,返回一個要註冊為 Spring 容器管理的 Bean。
@Bean
public MyComponent myComponent() {
return new MyComponent();
}
@Service:標記一個類為服務層組件,實際上是@Component 的特殊化。
@Service
public class MyService {
// 服務邏輯
}
@Repository:標記一個類為數據訪問層組件,實際上是@Component 的特殊化,並且支持持久化異常轉換。
@Repository
public class MyRepository {
// 數據訪問邏輯
}
@Controller:標記一個類為 Spring MVC 控制器,實際上是@Component 的特殊化
@Controller
public class MyController {
// 控制器邏輯
}
@RestController:標記一個類為 RESTful Web 服務的控制器,等同於@Controller 和@ResponseBody 的組合。
@RestController
public class MyRestController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
@Aspect:標記一個類為切面類。
@Aspect
@Component
public class MyAspect {
// 切面邏輯
}
@Before:定義一個方法,在目標方法執行之前執行。
@Aspect
@Component
public class MyAspect {
@Before("execution(* com.example.service.
*.*
(..))")
public void beforeMethod(JoinPoint joinPoint) {
// 前置邏輯
}
}
@After:定義一個方法,在目標方法執行之後執行。
@Aspect
@Component
public class MyAspect {
@After("execution(* com.example.service.
*.*
(..))")
public void afterMethod(JoinPoint joinPoint) {
// 後置邏輯
}
}
@Around:定義一個方法,包圍目標方法的執行
@Aspect
@Component
public class MyAspect {
@Around("execution(* com.example.service.
*.*
(..))")
public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
// 環繞邏輯
return joinPoint.proceed();
}
}
@Transactional:標記一個方法或類,表示該方法或類中的所有方法都需要事務管理。
@Service
public class MyService {
@Transactional
public void performTransaction() {
// 事務邏輯
}
}
就業陪跑訓練營學員投稿
歡迎關注 ❤
我們搞了一個免費的面試真題共享羣,互通有無,一起刷題進步。
沒準能讓你能刷到自己意向公司的最新面試題呢。
感興趣的朋友們可以加我微信:wangzhongyang1993,備註:思否面試羣。