Spring框架核心概念小結
1、Spring是什麼?
簡而言之,Spring是企業級Java的開源開發框架。Spring框架的核心功能可用於開發任何java應用程序。Spring框架的核心模塊如下:
- ü Spring Context(Spring上下文):用於依賴註入(DI);
- ü Spring DAO(數據庫訪問對象): 使用DAP模式進行數據庫操作;
- ü Spring JDBC: 用於JDBC和數據源的支持 ;
- ü Spring ORM: 用於ORM工具支持,如Hibernate;
- ü Spring AOP: 用於面向方面的編程;
- ü Spring Web module: 用於創建Web應用。
2、Spring框架的優點是什麼
- ü 輕量級:Spring時輕量級應用框架。 Spring框架的基本版本在2MB左右;
- ü 依賴註入/控制反轉 (DI/IoC):這有助於通過連接獨立的組件/對象來實現松散耦合;
- ü Spring容器:包含和管理應用程序對象的生命周期;
- ü 事務管理:Spring支持事務管理,即JDBC操作、文件上傳、異常處理等,通過spring註解或bean配置來完成;
- ü Spring MVC:Spring MVC 可用於創建 Web 應用程序以及能夠返回 XML 或 JSON 響應的restful Web 服務;
- ü 異常處理:Spring 提供瞭一個方便的 API 來將特定的技術異常(由 JDBC、Hibernate 等拋出)轉換為一致的未經檢查的異常;
- ü 面向切面編程(AOP):AOP 將程序邏輯分解為不同的部分(稱為關註點)。它用於通過橫切關註點來增加模塊化。橫切關註點是可以影響整個應用程序的關註點,應盡可能集中在代碼中的一個位置,例如事務管理、身份驗證、日志記錄、安全性等。
3、什麼是Spring Bean?
任何由 Spring IoC 容器初始化的普通 Java 類都稱為 Spring Bean。我們使用 spring 應用程序上下文來獲取 Spring Bean 實例。 Spring IoC Container 管理 Spring Bean 范圍/作用域的生命周期並在 bean 中註入任何所需的依賴項。
Spring bean的不同作用域:
當我們聲明 時,我們可以指定 bean 的作用域來通知 IoC 容器關於 bean 的創建以及它將存活多長時間。
對於任何 Java 應用程序,都有兩個不同的作用域,稱為單例(Singleton)和原型(Prototype)
主要有三種不同的作用域(或范圍),即請求(request)、會話(session)和全局會話(global-session),專門針對基於 Spring 的 Java Web 應用程序。
Singleton 是任何 bean 的默認作用域。這意味著每個 IoC 容器將創建單個 bean 實例。因此,單例 bean 不是線程安全的。
- 在原型范圍內,每次請求 bean 時都會創建一個新實例。
- 在請求范圍內,單個 bean 被定義到一個 HTTP 請求內。此范圍僅在支持 Web 的 spring ApplicationContext 中有效。
- 在會話范圍內,單個 bean 被定義到一個 HTTP 會話內。此范圍僅在支持 Web 的 spring ApplicationContext 中有效。
- 在 global-session 范圍內,bean 被定義為全局 HTTP 會話內有效。此范圍僅在支持 Web 的 spring ApplicationContext 中有效。
要設置 spring bean 的范圍,我們可以在 標簽中使用scope屬性。 @scope 用於基於註釋的 DI。
4、Spring IoC 容器
Spring 容器是 Spring 框架的核心。容器將創建對象,把它們連接在一起,配置它們,並管理它們從創建到銷毀的完整生命周期。 Spring 容器使用依賴註入 (DI) 來管理組成應用程序的組件。
有兩種不同類型的容器:
BeanFactory 容器:這是 Spring 容器的核心。
org.springframework.beans.factory.BeanFactory 是一個接口,充當 IoC 容器,它實例化、配置和管理許多 bean。應用示例如下:
Beans.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloWorld" class="com.newday.bean.HelloWorld"> <property name="message" value="Hello World!"/> </bean> </beans> package com.newday.bean; public class HelloWorld { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } MainApp.java: import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import com.newday.bean.HelloWorld; public class MainApp { public static void main(String args[]) { Resource resource = new ClassPathResource("beans.xml"); BeanFactory beanFactory = new XmlBeanFactory(resource); HelloWorld helloWorld = (HelloWorld) beanFactory.getBean("helloWorld"); System.out.println(helloWorld.getMessage()); } }
ApplicationContext 容器:
org.springframework.context.ApplicationContext 接口也充當 IoC 容器,但 ApplicationContext 接口建立在 BeanFactory 接口之上,以提供一些BeanFactory 額外的功能,例如與 Spring 的 AOP 的簡單集成、消息資源處理(對於 I18N )、事件傳播、Web 應用程序的應用層特定上下文(例如 WebApplicationContext)。所以使用 ApplicationContext 比使用 BeanFactory更好些。示例代碼如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloWorld" class="com.newday.bean.HelloWorld"> <property name="message" value="Hello World!"/> </bean> </beans> package com.newday.bean; public class HelloWorld { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } package com.newday.applicationcontext; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.newday.bean.HelloWorld; public class MainApp { public static void main(String args[]) { ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml"); HelloWorld helloWorld = (HelloWorld) appContext.getBean("helloWorld"); System.out.println(helloWorld.getMessage()); } }
5、@Autowired
對於基於註解的依賴註入,使用@Autowired 註解。標有@Component/@Service/@Repository 等的類可以註入到標有@Autowired 的屬性中
@Autowired 應用於:
- ü 字段域:用於基於字段的依賴註入;
- ü setter:用於setter依賴註入 。與基於字段的依賴註入相同;
- ü 構造器:基於構造函數的依賴註入。
1)基於構造器和setter的區別
- ü 依賴項的註入可以是可選的,也可以是強制性的。對於強制註入,我們使用基於構造函數的 DI。對於可選的依賴項,我們可以使用基於 setter 的 DI。但是,我們可以使用 @Required 註釋標記基於 setter 的 DI。
- ü 在循環依賴的情況下,基於構造器的 DI 將無法註入,但基於 setter 的 DI 將能夠註入
- ü 如果要註入更多數量的參數,則建議使用基於構造函數的 DI。
2)context:annotation-config 和 context:component-scan 的區別
- ü context:annotation-config 用於激活已在應用程序上下文中註冊的 bean 中的註釋;
- ü context:component-scan 也可以執行 context:annotation-config 所做的工作,但也可以掃描包以在應用程序上下文中查找和註冊 bean。
3)@Component、@Controller、@Repository & @Service 註解的區別
如果一個類用@Component/@Controller/@Service/@Repository 註解標記,那麼Spring DI 容器可以在組件掃描機制期間識別該類。但是,對於服務層類使用@Service 是個好主意,並且@Controller 應該在spring mvc web 控制器中使用。 @Repository 用於將 DAO 導入 DI 容器。此外,任何未經檢查的異常都將被轉換為 Spring DataAccessException。
4)ViewResolver 與 MultipartResolver
ViewResolver 用於按名稱解析視圖。該接口由
InternalResourceViewResolver 實現 ;
MultipartResolver 用於處理 web 應用程序中的文件上傳。
5)Spring MVC 中的驗證
org.springframework.validation.Validator 接口支持 spring MVC 驗證。驗證表單的一些實用方法是 ValidationUtils 類中的 rejectIfEmptyOrWhitespace() 和 rejectIfEmpty()。示例如下:
@Component public class EmployeeValidator implements Validator{ public boolean supports(Class clazz) { return EmployeeVO.class.isAssignableFrom(clazz); } public void validate(Object target, Errors errors){ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "error.firstName", "First name is required."); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "error.lastName", "Last name is required."); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "error.email", "Email is required."); } }
Spring MVC 中驗證表單的另一種方法是:
對模型 bean 的屬性使用Hibernate驗證(例如 @NotNull、@Size 等)
在控制器的方法簽名中使用@Valid、BindingResult。
BindingResult.hasErrors() 方法來驗證模型 bean。
6、Spring MVC 攔截器
HandlerInterceptor 接口充當 spring MVC 攔截器。它在服務請求之前和之後攔截。如果您實現瞭 HandlerInterceptor 接口,則 preHandle()、postHandle() 和 afterCompletion() 是要覆蓋的方法。但是,為瞭避免覆蓋,您可以使用 HandlerInterceptorAdapter 類。
7、Spring MVC 框架中的異常處理
Spring 中的異常是使用
SimpleMappingExceptionResolver 類以聲明方式處理的。您要處理的異常列表是針對 exceptionMapping 屬性配置的。如果有異常發生在流程中的任何地方,都將被捕獲並顯示相應的視圖。對於所有其他異常,您可以針對 defaultErrorView 屬性捕獲它們。示例配置如下:
快速切入:Spring框架核心概念總覽 原創2021-12-31 12:08·牛旦視界 編者按: 這篇內容將幫助你總體認識有關Spring框架相關的核心知識。我盡量在這裡涵蓋 Spring 框架的一些非常重要的概念。希望這可幫助你更好的總體把握Spring框架,促使你積極探索Spring的有趣的技術棧生態世界。 Spring框架 1、Spring是什麼? 簡而言之,Spring是企業級Java的開源開發框架。Spring框架的核心功能可用於開發任何java應用程序。Spring框架的核心模塊如下: ü Spring Context(Spring上下文):用於依賴註入(DI); ü Spring DAO(數據庫訪問對象): 使用DAP模式進行數據庫操作; ü Spring JDBC: 用於JDBC和數據源的支持 ; ü Spring ORM: 用於ORM工具支持,如Hibernate; ü Spring AOP: 用於面向方面的編程; ü Spring Web module: 用於創建Web應用。 2、Spring框架的優點是什麼 ü 輕量級:Spring時輕量級應用框架。 Spring框架的基本版本在2MB左右; ü 依賴註入/控制反轉 (DI/IoC):這有助於通過連接獨立的組件/對象來實現松散耦合; ü Spring容器:包含和管理應用程序對象的生命周期; ü 事務管理:Spring支持事務管理,即JDBC操作、文件上傳、異常處理等,通過spring註解或bean配置來完成; ü Spring MVC:Spring MVC 可用於創建 Web 應用程序以及能夠返回 XML 或 JSON 響應的restful Web 服務; ü 異常處理:Spring 提供瞭一個方便的 API 來將特定的技術異常(由 JDBC、Hibernate 等拋出)轉換為一致的未經檢查的異常; ü 面向切面編程(AOP):AOP 將程序邏輯分解為不同的部分(稱為關註點)。它用於通過橫切關註點來增加模塊化。橫切關註點是可以影響整個應用程序的關註點,應盡可能集中在代碼中的一個位置,例如事務管理、身份驗證、日志記錄、安全性等。 3、什麼是Spring Bean? 任何由 Spring IoC 容器初始化的普通 Java 類都稱為 Spring Bean。我們使用 spring 應用程序上下文來獲取 Spring Bean 實例。 Spring IoC Container 管理 Spring Bean 范圍/作用域的生命周期並在 bean 中註入任何所需的依賴項。 Spring bean的不同作用域: 當我們聲明 <bean> 時,我們可以指定 bean 的作用域來通知 IoC 容器關於 bean 的創建以及它將存活多長時間。 對於任何 Java 應用程序,都有兩個不同的作用域,稱為單例(Singleton)和原型(Prototype) 主要有三種不同的作用域(或范圍),即請求(request)、會話(session)和全局會話(global-session),專門針對基於 Spring 的 Java Web 應用程序。 Singleton 是任何 bean 的默認作用域。這意味著每個 IoC 容器將創建單個 bean 實例。因此,單例 bean 不是線程安全的。 在原型范圍內,每次請求 bean 時都會創建一個新實例。 在請求范圍內,單個 bean 被定義到一個 HTTP 請求內。此范圍僅在支持 Web 的 spring ApplicationContext 中有效。 在會話范圍內,單個 bean 被定義到一個 HTTP 會話內。此范圍僅在支持 Web 的 spring ApplicationContext 中有效。 在 global-session 范圍內,bean 被定義為全局 HTTP 會話內有效。此范圍僅在支持 Web 的 spring ApplicationContext 中有效。 要設置 spring bean 的范圍,我們可以在 <bean> 標簽中使用scope屬性。 @scope 用於基於註釋的 DI。 4、Spring IoC 容器 Spring 容器是 Spring 框架的核心。容器將創建對象,把它們連接在一起,配置它們,並管理它們從創建到銷毀的完整生命周期。 Spring 容器使用依賴註入 (DI) 來管理組成應用程序的組件。 有兩種不同類型的容器: BeanFactory 容器:這是 Spring 容器的核心。 org.springframework.beans.factory.BeanFactory 是一個接口,充當 IoC 容器,它實例化、配置和管理許多 bean。應用示例如下: Beans.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloWorld" class="com.newday.bean.HelloWorld"> <property name="message" value="Hello World!"/> </bean> </beans> package com.newday.bean; public class HelloWorld { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; MainApp.java: import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import com.newday.bean.HelloWorld; public class MainApp { public static void main(String args[]) { Resource resource = new ClassPathResource("beans.xml"); BeanFactory beanFactory = new XmlBeanFactory(resource); HelloWorld helloWorld = (HelloWorld) beanFactory.getBean("helloWorld"); System.out.println(helloWorld.getMessage()); ApplicationContext 容器: org.springframework.context.ApplicationContext 接口也充當 IoC 容器,但 ApplicationContext 接口建立在 BeanFactory 接口之上,以提供一些BeanFactory 額外的功能,例如與 Spring 的 AOP 的簡單集成、消息資源處理(對於 I18N )、事件傳播、Web 應用程序的應用層特定上下文(例如 WebApplicationContext)。所以使用 ApplicationContext 比使用 BeanFactory更好些。示例代碼如下: package com.newday.applicationcontext; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml"); HelloWorld helloWorld = (HelloWorld) appContext.getBean("helloWorld"); 5、@Autowired 對於基於註解的依賴註入,使用@Autowired 註解。標有@Component/@Service/@Repository 等的類可以註入到標有@Autowired 的屬性中 @Autowired 應用於: ü 字段域:用於基於字段的依賴註入; ü setter:用於setter依賴註入 。與基於字段的依賴註入相同; ü 構造器:基於構造函數的依賴註入。 1)基於構造器和setter的區別 ü 依賴項的註入可以是可選的,也可以是強制性的。對於強制註入,我們使用基於構造函數的 DI。對於可選的依賴項,我們可以使用基於 setter 的 DI。但是,我們可以使用 @Required 註釋標記基於 setter 的 DI。 ü 在循環依賴的情況下,基於構造器的 DI 將無法註入,但基於 setter 的 DI 將能夠註入 ü 如果要註入更多數量的參數,則建議使用基於構造函數的 DI。 2)context:annotation-config 和 context:component-scan 的區別 ü context:annotation-config 用於激活已在應用程序上下文中註冊的 bean 中的註釋; ü context:component-scan 也可以執行 context:annotation-config 所做的工作,但也可以掃描包以在應用程序上下文中查找和註冊 bean。 3)@Component、@Controller、@Repository & @Service 註解的區別 如果一個類用@Component/@Controller/@Service/@Repository 註解標記,那麼Spring DI 容器可以在組件掃描機制期間識別該類。但是,對於服務層類使用@Service 是個好主意,並且@Controller 應該在spring mvc web 控制器中使用。 @Repository 用於將 DAO 導入 DI 容器。此外,任何未經檢查的異常都將被轉換為 Spring DataAccessException。 4)ViewResolver 與 MultipartResolver ViewResolver 用於按名稱解析視圖。該接口由 InternalResourceViewResolver 實現 ; MultipartResolver 用於處理 web 應用程序中的文件上傳。 5)Spring MVC 中的驗證 org.springframework.validation.Validator 接口支持 spring MVC 驗證。驗證表單的一些實用方法是 ValidationUtils 類中的 rejectIfEmptyOrWhitespace() 和 rejectIfEmpty()。示例如下: @Component public class EmployeeValidator implements Validator{ public boolean supports(Class clazz) { return EmployeeVO.class.isAssignableFrom(clazz); public void validate(Object target, Errors errors){ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "error.firstName", "First name is required."); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "error.lastName", "Last name is required."); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "error.email", "Email is required."); Spring MVC 中驗證表單的另一種方法是: 對模型 bean 的屬性使用Hibernate驗證(例如 @NotNull、@Size 等) 在控制器的方法簽名中使用@Valid、BindingResult。 BindingResult.hasErrors() 方法來驗證模型 bean。 6、Spring MVC 攔截器 HandlerInterceptor 接口充當 spring MVC 攔截器。它在服務請求之前和之後攔截。如果您實現瞭 HandlerInterceptor 接口,則 preHandle()、postHandle() 和 afterCompletion() 是要覆蓋的方法。但是,為瞭避免覆蓋,您可以使用 HandlerInterceptorAdapter 類。 7、Spring MVC 框架中的異常處理 Spring 中的異常是使用 SimpleMappingExceptionResolver 類以聲明方式處理的。您要處理的異常列表是針對 exceptionMapping 屬性配置的。如果有異常發生在流程中的任何地方,都將被捕獲並顯示相應的視圖。對於所有其他異常,您可以針對 defaultErrorView 屬性捕獲它們。示例配置如下: <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="com.newday.exception.XYZException"> error/xyzExceptionView </prop> </props> </property> <property name="defaultErrorView" value="error/genericExceptionView"/>
8、如何在 Spring Bean 中獲取 ServletContext 和 ServletConfig 對象?
實現 ServletContextAware 和 ServletConfigAware 接口並覆蓋以下方法:
@Controller @RequestMapping(value = "/magic") public class SimpleController implements ServletContextAware, ServletConfigAware { private ServletContext context; private ServletConfig config; @Override public void setServletConfig(final ServletConfig servletConfig) { this.config = servletConfig; } @Override public void setServletContext(final ServletContext servletContext) { this.context = servletContext; } //other code }
9、Spring中的事務管理
數據庫事務是一組被視為關聯工作單元的操作。事務的主要原則是提交所有操作或在失敗的情況下回滾所有操作。在交易中提交數據時,我們需要確保交易協議/稱為 ACID(原子性-一致性-隔離-持久性)的屬性:
- ü 原子性(Atomicty):事務中的所有操作都被視為一個工作單元。因此,事務將被提交或回滾。
- ü 一致性(Consistency):這通過維護數據庫的引用完整性來確保事務將數據庫從一個有效狀態帶到另一個有效狀態。
- ü 隔離性(Isolation):每個事務都應該與其他事務隔離,即使它們處理的是同一組數據。
- ü 持久性(Durability):這確保一旦事務完成,數據將永久存在於數據庫中。即使斷電或系統崩潰,數據也不會丟失。
Spring 支持編程式和聲明式兩種事務管理。它還支持全局和本地事務。
全局事務 vs 本地事務:
- ü 本地事務處理集中式系統中的單個數據源(例如 JDBC);
- ü 全局事務處理分佈式系統中的多個數據源(例如 JDBC、JMS)。一個全局事務是多個本地事務的集合;
編程式事務與聲明式事務:
Spring 支持兩種不同類型的事務管理,稱為 編程式(Programatic) 和聲明式(Declarative) 事務管理:
- ü 編程式事務:這意味著,您需要在代碼中管理事務。很難維護;
- ü 聲明式事務:這意味著要將事務管理代碼與業務邏輯分開。因此需要使用 XML 或基於註釋的配置來管理事務。 Spring AOP 模塊支持聲明式事務管理。
臟讀、幻讀和不可重復讀:
- ü 臟讀:當一個事務正在更改記錄/元組並且第二個事務在原始更改被提交或回滾之前嘗試讀取此元組/記錄時,就會發生臟讀。這被稱為臟讀場景,因為第一個事務總是有可能回滾更改,導致第二個事務讀取無效值。
- ü 幻讀:幻讀發生在同一查詢在事務中執行兩次,並且第二個結果集包含在第一個結果集中不可見的行。這種情況是由另一個事務在兩個查詢的執行之間插入新行引起的
- ü 不可重復讀:當在同一個事務中相同的查詢產生不同的結果時,就會發生不可重復讀取。這因為當另一個事務更新其他事務返回的數據時,就會發生這種情況。
隔離與傳播:
- ü 隔離度(Isolation):此事務與其他事務的工作隔離的程度。例如,這個事務可以看到來自其他事務的未提交的寫入嗎?
- ü 傳播(Propagation):在傳播的情況下,代碼將始終在事務范圍內運行。創建一個新事務或重用一個(如果可用)。
10、HibernateDAOSupport 和 HibernateTemplate
在舊版本的 spring 和 hibernate 集成中,需要 HibernateDAOSupport 和 HibernateTemplate。但是,較新版本的 Spring 不建議使用這兩個類(這裡僅做瞭解)。
通常我們從 HibernateDAOSupport 擴展我們的 DAO 類,並且 getHibernateTemplate() 方法將可用於Hibernate會話中的 CRUD 操作。由於這不是推薦的方法,所以我們在 DAO 中註入會話工廠(SessionFactory)。下面的代碼片段會給你一些關於 HibernateDAOSupport 和 HibernateTemplate 的想法:
public class EmployeeHibernateDao extends HibernateDaoSupport implements EmployeeDao { @Transactional(readOnly=false) public void saveEmployee(Employee emp){ System.out.println("Create new employee " + emp); getHibernateTemplate().save(emp); System.out.println("Employee created " + emp); } }
11、Spring DAO 和 Spring ORM 的區別
DAO 是一種設計模式,以最大限度地減少應用程序和後端之間的耦合;
ORM 處理如何將對象映射到對象關系數據庫中,從而減少數據庫和應用程序之間的耦合。
如果您在沒有 DAO 的情況下使用 ORM,那麼您的應用程序將變得依賴於 ORM,因此很難從一個 ORM(例如Hibernate)移動到另一個 ORM(例如 NoSQL)。
Spring DAO 是使用@Repository 註解實現的。 Spring 存儲庫擴展 JPARepository 並傳遞 JPA 實體及其主鍵。
@Repository public interface PersonRepository extends JPARepository<Person, PersonPK> { public List findByFirstName(String firstName); @Query("Your SQL query") public List findByAddress(String firstName); }
最後,關於Spring框架相關的概念就簡要介紹到這裡,希望這能給你進入並深入Spring技術棧一個簡單入口,而不會被Spring技術生態所驚嚇(Spring現在都成軟件開發技術的全傢桶瞭,啥都有)——日進一步,鍥而不舍,終將大成!
到此這篇關於Spring框架核心概念總覽的文章就介紹到這瞭,更多相關Spring框架核心概念內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java Spring框架創建項目與Bean的存儲與讀取詳解
- Spring概述和快速構建的方式
- Spring超詳細講解註解開發
- Spring 控制反轉和依賴註入的具體使用
- 一篇文章帶你Java Spring開發入門