# X Spring

#### 什麼是 Spring 框架？主要模塊是什麼？ 有什麼好處？

{% content-ref url="../spring" %}
[spring](https://wangkh.gitbook.io/java/framework-1/spring)
{% endcontent-ref %}

#### 什麼是控制反轉 (IOC) 和依賴注入(DI)？

{% content-ref url="../spring/core-ioc" %}
[core-ioc](https://wangkh.gitbook.io/java/framework-1/spring/core-ioc)
{% endcontent-ref %}

#### 在Spring Framework 中如何使用 IOC 容器？

#### BeanFactory 和 ApplicationContext 之間的區別？

{% content-ref url="../spring/core-ioc/beanfactory" %}
[beanfactory](https://wangkh.gitbook.io/java/framework-1/spring/core-ioc/beanfactory)
{% endcontent-ref %}

{% content-ref url="../spring/core-ioc/beanfactory/n-applicationcontext" %}
[n-applicationcontext](https://wangkh.gitbook.io/java/framework-1/spring/core-ioc/beanfactory/n-applicationcontext)
{% endcontent-ref %}

#### 建構子注入與 setter 注入的差別?

{% content-ref url="../spring/core-ioc" %}
[core-ioc](https://wangkh.gitbook.io/java/framework-1/spring/core-ioc)
{% endcontent-ref %}

#### 什麼是AOP ? 為什麼使用 AOP ? 怎麼實現的 ?

{% content-ref url="../spring/core-aop" %}
[core-aop](https://wangkh.gitbook.io/java/framework-1/spring/core-aop)
{% endcontent-ref %}

#### 為什麼要使用動態代理 ?&#x20;

{% content-ref url="../../java/n-fan-she/dong-tai-dai-li" %}
[dong-tai-dai-li](https://wangkh.gitbook.io/java/java/n-fan-she/dong-tai-dai-li)
{% endcontent-ref %}

#### 有哪些有用到 AOP ?

* 攔截器 Interceptor。
* 事務管理 Transactional。
* 紀錄 Logging。
* 安全驗證 Security。

#### **Spring AOP 和 AspectJ AOP 的區別 ?**

* Spring AOP 基於 動態代理 實現。
* AspectJ 基於 靜態代理 實現。

#### 可以通過哪些方式將 Spring 配置到應用程序中？

* 基於XML的配置
* 基於註釋的配置(**主要**)
* 基於Java的配置(**主要**)

#### 解釋 Spring Bean 的生命週期？Bean 範圍有哪些不同？ Singleton bean 執行緒安全嗎？

#### 解釋 Bean自動裝配？有哪些不同的模式？

{% content-ref url="../spring/core-ioc/bean-jian-gou-guo-cheng" %}
[bean-jian-gou-guo-cheng](https://wangkh.gitbook.io/java/framework-1/spring/core-ioc/bean-jian-gou-guo-cheng)
{% endcontent-ref %}

#### BeanFactory 與 FactoryBean 的區別 ?

{% content-ref url="../spring/core-ioc/beanfactory" %}
[beanfactory](https://wangkh.gitbook.io/java/framework-1/spring/core-ioc/beanfactory)
{% endcontent-ref %}

#### 解釋 @Autowired / @Qualifier / @Required ?

{% content-ref url="../spring/core-ioc/annotation" %}
[annotation](https://wangkh.gitbook.io/java/framework-1/spring/core-ioc/annotation)
{% endcontent-ref %}

#### 什麼是循環依賴? &#x20;

A 依賴注入於 B，B 依賴注入於 C ，C 依賴注入於 A。

#### 如何解決循環依賴?

* 重新設計。
* 透過 **@Lazy 延遲加載**。
* 不透過 建構子注入，而是**透過 setter 注入**。
* 使用 **@PostConstruct** 階段，注入依賴的對象。
* 其中一個實作 ApplicationContextAware 和 InitializingBean，\
  讓其可以讀取 context，取得已經完成的另一個bean 。

#### &#x20;FileSystemResource和ClassPathResource之間的區別？

{% content-ref url="../spring/web-mo-zu/web-servlet/spring-mvc/za-qi-za-ba" %}
[za-qi-za-ba](https://wangkh.gitbook.io/java/framework-1/spring/web-mo-zu/web-servlet/spring-mvc/za-qi-za-ba)
{% endcontent-ref %}

#### 舉例幾個 Spring 常用的設計模式 ?

* **Proxy 代理** –在AOP和遠程處理中大量使用。<br>
* **Singleton 單例** – Spring bean默認為單例。<br>
* **模板方法** -廣泛地用來對付模板重複代碼，如： **RestTemplate**，**JpaTemplate**。<br>
* **Front Controller** – Spring 提供 **DispatcherServlet** 以確保傳入的請求被調度到控制器。<br>
* **View Helper** – Spring具有許多視圖技術 ( JSP、thymeleaf )，以幫助將代碼與 View 分離。<br>
* **依賴注入** –以整體 **BeanFactory** / **ApplicationContext** 概念為中心的 IOC 容器。<br>
* **工廠模式** –用於創建對象實例的 BeanFactory。
