動態

詳情 返回 返回

高階面經:Spring框架全析 - 動態 詳情

在 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,備註:思否面試羣。

user avatar xuxueli 頭像 lab4ai 頭像 junyidedalianmao 頭像 feibendemaojin 頭像 yinzhixiaxue 頭像 tiandexianggua 頭像 huamingshixunkeji 頭像 huanledeyanjing 頭像 jkkang 頭像 qingfouai 頭像 gedyh 頭像 zhishaofei3_586768cab32fd 頭像
點贊 14 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.