欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring框架核心概念小結(jié)

 更新時間:2022年02月09日 16:06:12   作者:51CTO?開發(fā)  
Spring是企業(yè)級Java的開源開發(fā)框架。Spring框架的核心功能可用于開發(fā)任何java應(yīng)用程序,本文重點給大家介紹Spring框架核心概念總覽,感興趣的朋友跟隨小編一起看看吧

1、Spring是什么?

簡而言之,Spring是企業(yè)級Java的開源開發(fā)框架。Spring框架的核心功能可用于開發(fā)任何java應(yīng)用程序。Spring框架的核心模塊如下:

  • Spring Context(Spring上下文):用于依賴注入(DI);
  • Spring DAO(數(shù)據(jù)庫訪問對象): 使用DAP模式進行數(shù)據(jù)庫操作;
  •  Spring JDBC: 用于JDBC和數(shù)據(jù)源的支持 ;
  • Spring ORM: 用于ORM工具支持,如Hibernate;
  • Spring AOP: 用于面向方面的編程;
  • Spring Web module: 用于創(chuàng)建Web應(yīng)用。

2、Spring框架的優(yōu)點是什么

  • 輕量級:Spring時輕量級應(yīng)用框架。 Spring框架的基本版本在2MB左右;
  • 依賴注入/控制反轉(zhuǎn) (DI/IoC):這有助于通過連接獨立的組件/對象來實現(xiàn)松散耦合;
  • Spring容器:包含和管理應(yīng)用程序?qū)ο蟮纳芷?
  • 事務(wù)管理:Spring支持事務(wù)管理,即JDBC操作、文件上傳、異常處理等,通過spring注解或bean配置來完成;
  • Spring MVC:Spring MVC 可用于創(chuàng)建 Web 應(yīng)用程序以及能夠返回 XML 或 JSON 響應(yīng)的restful Web 服務(wù);
  • 異常處理:Spring 提供了一個方便的 API 來將特定的技術(shù)異常(由 JDBC、Hibernate 等拋出)轉(zhuǎn)換為一致的未經(jīng)檢查的異常;
  • 面向切面編程(AOP):AOP 將程序邏輯分解為不同的部分(稱為關(guān)注點)。它用于通過橫切關(guān)注點來增加模塊化。橫切關(guān)注點是可以影響整個應(yīng)用程序的關(guān)注點,應(yīng)盡可能集中在代碼中的一個位置,例如事務(wù)管理、身份驗證、日志記錄、安全性等。

3、什么是Spring Bean?

任何由 Spring IoC 容器初始化的普通 Java 類都稱為 Spring Bean。我們使用 spring 應(yīng)用程序上下文來獲取 Spring Bean 實例。 Spring IoC Container 管理 Spring Bean 范圍/作用域的生命周期并在 bean 中注入任何所需的依賴項。

Spring bean的不同作用域:

當(dāng)我們聲明 時,我們可以指定 bean 的作用域來通知 IoC 容器關(guān)于 bean 的創(chuàng)建以及它將存活多長時間。

對于任何 Java 應(yīng)用程序,都有兩個不同的作用域,稱為單例(Singleton)和原型(Prototype)

主要有三種不同的作用域(或范圍),即請求(request)、會話(session)和全局會話(global-session),專門針對基于 Spring 的 Java Web 應(yīng)用程序。

Singleton 是任何 bean 的默認作用域。這意味著每個 IoC 容器將創(chuàng)建單個 bean 實例。因此,單例 bean 不是線程安全的。

  • 在原型范圍內(nèi),每次請求 bean 時都會創(chuàng)建一個新實例。
  • 在請求范圍內(nèi),單個 bean 被定義到一個 HTTP 請求內(nèi)。此范圍僅在支持 Web 的 spring ApplicationContext 中有效。
  • 在會話范圍內(nèi),單個 bean 被定義到一個 HTTP 會話內(nèi)。此范圍僅在支持 Web 的 spring ApplicationContext 中有效。
  • 在 global-session 范圍內(nèi),bean 被定義為全局 HTTP 會話內(nèi)有效。此范圍僅在支持 Web 的 spring ApplicationContext 中有效。

要設(shè)置 spring bean 的范圍,我們可以在 標(biāo)簽中使用scope屬性。 @scope 用于基于注釋的 DI。

4、Spring IoC 容器

Spring 容器是 Spring 框架的核心。容器將創(chuàng)建對象,把它們連接在一起,配置它們,并管理它們從創(chuàng)建到銷毀的完整生命周期。 Spring 容器使用依賴注入 (DI) 來管理組成應(yīng)用程序的組件。

有兩種不同類型的容器:

BeanFactory 容器:這是 Spring 容器的核心。

org.springframework.beans.factory.BeanFactory 是一個接口,充當(dāng) IoC 容器,它實例化、配置和管理許多 bean。應(yīng)用示例如下:

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 接口也充當(dāng) IoC 容器,但 ApplicationContext 接口建立在 BeanFactory 接口之上,以提供一些BeanFactory 額外的功能,例如與 Spring 的 AOP 的簡單集成、消息資源處理(對于 I18N )、事件傳播、Web 應(yīng)用程序的應(yīng)用層特定上下文(例如 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 注解。標(biāo)有@Component/@Service/@Repository 等的類可以注入到標(biāo)有@Autowired 的屬性中

@Autowired 應(yīng)用于:

  • 字段域:用于基于字段的依賴注入;
  • setter:用于setter依賴注入 。與基于字段的依賴注入相同;
  • 構(gòu)造器:基于構(gòu)造函數(shù)的依賴注入。

1)基于構(gòu)造器和setter的區(qū)別

  • 依賴項的注入可以是可選的,也可以是強制性的。對于強制注入,我們使用基于構(gòu)造函數(shù)的 DI。對于可選的依賴項,我們可以使用基于 setter 的 DI。但是,我們可以使用 @Required 注釋標(biāo)記基于 setter 的 DI。
  • 在循環(huán)依賴的情況下,基于構(gòu)造器的 DI 將無法注入,但基于 setter 的 DI 將能夠注入
  • 如果要注入更多數(shù)量的參數(shù),則建議使用基于構(gòu)造函數(shù)的 DI。

2)context:annotation-config 和 context:component-scan 的區(qū)別

  • context:annotation-config 用于激活已在應(yīng)用程序上下文中注冊的 bean 中的注釋;
  • context:component-scan 也可以執(zhí)行 context:annotation-config 所做的工作,但也可以掃描包以在應(yīng)用程序上下文中查找和注冊 bean。

3)@Component、@Controller、@Repository & @Service 注解的區(qū)別

如果一個類用@Component/@Controller/@Service/@Repository 注解標(biāo)記,那么Spring DI 容器可以在組件掃描機制期間識別該類。但是,對于服務(wù)層類使用@Service 是個好主意,并且@Controller 應(yīng)該在spring mvc web 控制器中使用。 @Repository 用于將 DAO 導(dǎo)入 DI 容器。此外,任何未經(jīng)檢查的異常都將被轉(zhuǎn)換為 Spring DataAccessException。

4)ViewResolver 與 MultipartResolver

ViewResolver 用于按名稱解析視圖。該接口由

InternalResourceViewResolver 實現(xiàn) ;

MultipartResolver 用于處理 web 應(yīng)用程序中的文件上傳。

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 接口充當(dāng) spring MVC 攔截器。它在服務(wù)請求之前和之后攔截。如果您實現(xiàn)了 HandlerInterceptor 接口,則 preHandle()、postHandle() 和 afterCompletion() 是要覆蓋的方法。但是,為了避免覆蓋,您可以使用 HandlerInterceptorAdapter 類。

7、Spring MVC 框架中的異常處理

Spring 中的異常是使用

SimpleMappingExceptionResolver 類以聲明方式處理的。您要處理的異常列表是針對 exceptionMapping 屬性配置的。如果有異常發(fā)生在流程中的任何地方,都將被捕獲并顯示相應(yīng)的視圖。對于所有其他異常,您可以針對 defaultErrorView 屬性捕獲它們。示例配置如下:

快速切入:Spring框架核心概念總覽
原創(chuàng)2021-12-31 12:08·牛旦視界
編者按:
這篇內(nèi)容將幫助你總體認識有關(guān)Spring框架相關(guān)的核心知識。我盡量在這里涵蓋 Spring 框架的一些非常重要的概念。希望這可幫助你更好的總體把握Spring框架,促使你積極探索Spring的有趣的技術(shù)棧生態(tài)世界。

Spring框架
1、Spring是什么?
簡而言之,Spring是企業(yè)級Java的開源開發(fā)框架。Spring框架的核心功能可用于開發(fā)任何java應(yīng)用程序。Spring框架的核心模塊如下:
ü Spring Context(Spring上下文):用于依賴注入(DI);
ü Spring DAO(數(shù)據(jù)庫訪問對象): 使用DAP模式進行數(shù)據(jù)庫操作;
ü Spring JDBC: 用于JDBC和數(shù)據(jù)源的支持 ;
ü Spring ORM: 用于ORM工具支持,如Hibernate;
ü Spring AOP: 用于面向方面的編程;
ü Spring Web module: 用于創(chuàng)建Web應(yīng)用。
2、Spring框架的優(yōu)點是什么
ü 輕量級:Spring時輕量級應(yīng)用框架。 Spring框架的基本版本在2MB左右;
ü 依賴注入/控制反轉(zhuǎn) (DI/IoC):這有助于通過連接獨立的組件/對象來實現(xiàn)松散耦合;
ü Spring容器:包含和管理應(yīng)用程序?qū)ο蟮纳芷冢?
ü 事務(wù)管理:Spring支持事務(wù)管理,即JDBC操作、文件上傳、異常處理等,通過spring注解或bean配置來完成;
ü Spring MVC:Spring MVC 可用于創(chuàng)建 Web 應(yīng)用程序以及能夠返回 XML 或 JSON 響應(yīng)的restful Web 服務(wù);
ü 異常處理:Spring 提供了一個方便的 API 來將特定的技術(shù)異常(由 JDBC、Hibernate 等拋出)轉(zhuǎn)換為一致的未經(jīng)檢查的異常;
ü 面向切面編程(AOP):AOP 將程序邏輯分解為不同的部分(稱為關(guān)注點)。它用于通過橫切關(guān)注點來增加模塊化。橫切關(guān)注點是可以影響整個應(yīng)用程序的關(guān)注點,應(yīng)盡可能集中在代碼中的一個位置,例如事務(wù)管理、身份驗證、日志記錄、安全性等。
3、什么是Spring Bean?
任何由 Spring IoC 容器初始化的普通 Java 類都稱為 Spring Bean。我們使用 spring 應(yīng)用程序上下文來獲取 Spring Bean 實例。 Spring IoC Container 管理 Spring Bean 范圍/作用域的生命周期并在 bean 中注入任何所需的依賴項。
Spring bean的不同作用域:
當(dāng)我們聲明 <bean> 時,我們可以指定 bean 的作用域來通知 IoC 容器關(guān)于 bean 的創(chuàng)建以及它將存活多長時間。
對于任何 Java 應(yīng)用程序,都有兩個不同的作用域,稱為單例(Singleton)和原型(Prototype)
主要有三種不同的作用域(或范圍),即請求(request)、會話(session)和全局會話(global-session),專門針對基于 Spring 的 Java Web 應(yīng)用程序。
Singleton 是任何 bean 的默認作用域。這意味著每個 IoC 容器將創(chuàng)建單個 bean 實例。因此,單例 bean 不是線程安全的。
在原型范圍內(nèi),每次請求 bean 時都會創(chuàng)建一個新實例。
在請求范圍內(nèi),單個 bean 被定義到一個 HTTP 請求內(nèi)。此范圍僅在支持 Web 的 spring ApplicationContext 中有效。
在會話范圍內(nèi),單個 bean 被定義到一個 HTTP 會話內(nèi)。此范圍僅在支持 Web 的 spring ApplicationContext 中有效。
在 global-session 范圍內(nèi),bean 被定義為全局 HTTP 會話內(nèi)有效。此范圍僅在支持 Web 的 spring ApplicationContext 中有效。
要設(shè)置 spring bean 的范圍,我們可以在 <bean> 標(biāo)簽中使用scope屬性。 @scope 用于基于注釋的 DI。
4、Spring IoC 容器
Spring 容器是 Spring 框架的核心。容器將創(chuàng)建對象,把它們連接在一起,配置它們,并管理它們從創(chuàng)建到銷毀的完整生命周期。 Spring 容器使用依賴注入 (DI) 來管理組成應(yīng)用程序的組件。
有兩種不同類型的容器:
BeanFactory 容器:這是 Spring 容器的核心。 
org.springframework.beans.factory.BeanFactory 是一個接口,充當(dāng) IoC 容器,它實例化、配置和管理許多 bean。應(yīng)用示例如下:
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 接口也充當(dāng) IoC 容器,但 ApplicationContext 接口建立在 BeanFactory 接口之上,以提供一些BeanFactory 額外的功能,例如與 Spring 的 AOP 的簡單集成、消息資源處理(對于 I18N )、事件傳播、Web 應(yīng)用程序的應(yīng)用層特定上下文(例如 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 注解。標(biāo)有@Component/@Service/@Repository 等的類可以注入到標(biāo)有@Autowired 的屬性中
@Autowired 應(yīng)用于:
ü 字段域:用于基于字段的依賴注入;
ü setter:用于setter依賴注入 。與基于字段的依賴注入相同;
ü 構(gòu)造器:基于構(gòu)造函數(shù)的依賴注入。
1)基于構(gòu)造器和setter的區(qū)別
ü 依賴項的注入可以是可選的,也可以是強制性的。對于強制注入,我們使用基于構(gòu)造函數(shù)的 DI。對于可選的依賴項,我們可以使用基于 setter 的 DI。但是,我們可以使用 @Required 注釋標(biāo)記基于 setter 的 DI。
ü 在循環(huán)依賴的情況下,基于構(gòu)造器的 DI 將無法注入,但基于 setter 的 DI 將能夠注入
ü 如果要注入更多數(shù)量的參數(shù),則建議使用基于構(gòu)造函數(shù)的 DI。
2)context:annotation-config 和 context:component-scan 的區(qū)別
ü context:annotation-config 用于激活已在應(yīng)用程序上下文中注冊的 bean 中的注釋;
ü context:component-scan 也可以執(zhí)行 context:annotation-config 所做的工作,但也可以掃描包以在應(yīng)用程序上下文中查找和注冊 bean。
3)@Component、@Controller、@Repository & @Service 注解的區(qū)別
如果一個類用@Component/@Controller/@Service/@Repository 注解標(biāo)記,那么Spring DI 容器可以在組件掃描機制期間識別該類。但是,對于服務(wù)層類使用@Service 是個好主意,并且@Controller 應(yīng)該在spring mvc web 控制器中使用。 @Repository 用于將 DAO 導(dǎo)入 DI 容器。此外,任何未經(jīng)檢查的異常都將被轉(zhuǎn)換為 Spring DataAccessException。
4)ViewResolver 與 MultipartResolver
ViewResolver 用于按名稱解析視圖。該接口由 
InternalResourceViewResolver 實現(xiàn) ;
MultipartResolver 用于處理 web 應(yīng)用程序中的文件上傳。
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 接口充當(dāng) spring MVC 攔截器。它在服務(wù)請求之前和之后攔截。如果您實現(xiàn)了 HandlerInterceptor 接口,則 preHandle()、postHandle() 和 afterCompletion() 是要覆蓋的方法。但是,為了避免覆蓋,您可以使用 HandlerInterceptorAdapter 類。
7、Spring MVC 框架中的異常處理
Spring 中的異常是使用 
SimpleMappingExceptionResolver 類以聲明方式處理的。您要處理的異常列表是針對 exceptionMapping 屬性配置的。如果有異常發(fā)生在流程中的任何地方,都將被捕獲并顯示相應(yīng)的視圖。對于所有其他異常,您可以針對 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 對象?

實現(xiàn) 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中的事務(wù)管理

數(shù)據(jù)庫事務(wù)是一組被視為關(guān)聯(lián)工作單元的操作。事務(wù)的主要原則是提交所有操作或在失敗的情況下回滾所有操作。在交易中提交數(shù)據(jù)時,我們需要確保交易協(xié)議/稱為 ACID(原子性-一致性-隔離-持久性)的屬性:

  • 原子性(Atomicty):事務(wù)中的所有操作都被視為一個工作單元。因此,事務(wù)將被提交或回滾。
  • 一致性(Consistency):這通過維護數(shù)據(jù)庫的引用完整性來確保事務(wù)將數(shù)據(jù)庫從一個有效狀態(tài)帶到另一個有效狀態(tài)。
  • 隔離性(Isolation):每個事務(wù)都應(yīng)該與其他事務(wù)隔離,即使它們處理的是同一組數(shù)據(jù)。
  • 持久性(Durability):這確保一旦事務(wù)完成,數(shù)據(jù)將永久存在于數(shù)據(jù)庫中。即使斷電或系統(tǒng)崩潰,數(shù)據(jù)也不會丟失。

Spring 支持編程式和聲明式兩種事務(wù)管理。它還支持全局和本地事務(wù)。

全局事務(wù) vs 本地事務(wù):

  • 本地事務(wù)處理集中式系統(tǒng)中的單個數(shù)據(jù)源(例如 JDBC);
  • 全局事務(wù)處理分布式系統(tǒng)中的多個數(shù)據(jù)源(例如 JDBC、JMS)。一個全局事務(wù)是多個本地事務(wù)的集合;

編程式事務(wù)與聲明式事務(wù):

Spring 支持兩種不同類型的事務(wù)管理,稱為 編程式(Programatic) 和聲明式(Declarative) 事務(wù)管理:

  • 編程式事務(wù):這意味著,您需要在代碼中管理事務(wù)。很難維護;
  • 聲明式事務(wù):這意味著要將事務(wù)管理代碼與業(yè)務(wù)邏輯分開。因此需要使用 XML 或基于注釋的配置來管理事務(wù)。 Spring AOP 模塊支持聲明式事務(wù)管理。

臟讀、幻讀和不可重復(fù)讀:

  • 臟讀:當(dāng)一個事務(wù)正在更改記錄/元組并且第二個事務(wù)在原始更改被提交或回滾之前嘗試讀取此元組/記錄時,就會發(fā)生臟讀。這被稱為臟讀場景,因為第一個事務(wù)總是有可能回滾更改,導(dǎo)致第二個事務(wù)讀取無效值。
  • 幻讀:幻讀發(fā)生在同一查詢在事務(wù)中執(zhí)行兩次,并且第二個結(jié)果集包含在第一個結(jié)果集中不可見的行。這種情況是由另一個事務(wù)在兩個查詢的執(zhí)行之間插入新行引起的
  • 不可重復(fù)讀:當(dāng)在同一個事務(wù)中相同的查詢產(chǎn)生不同的結(jié)果時,就會發(fā)生不可重復(fù)讀取。這因為當(dāng)另一個事務(wù)更新其他事務(wù)返回的數(shù)據(jù)時,就會發(fā)生這種情況。

隔離與傳播:

  • 隔離度(Isolation):此事務(wù)與其他事務(wù)的工作隔離的程度。例如,這個事務(wù)可以看到來自其他事務(wù)的未提交的寫入嗎?
  • 傳播(Propagation):在傳播的情況下,代碼將始終在事務(wù)范圍內(nèi)運行。創(chuàng)建一個新事務(wù)或重用一個(如果可用)。

10、HibernateDAOSupport 和 HibernateTemplate

在舊版本的 spring 和 hibernate 集成中,需要 HibernateDAOSupport 和 HibernateTemplate。但是,較新版本的 Spring 不建議使用這兩個類(這里僅做了解)。

通常我們從 HibernateDAOSupport 擴展我們的 DAO 類,并且 getHibernateTemplate() 方法將可用于Hibernate會話中的 CRUD 操作。由于這不是推薦的方法,所以我們在 DAO 中注入會話工廠(SessionFactory)。下面的代碼片段會給你一些關(guān)于 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 的區(qū)別

DAO 是一種設(shè)計模式,以最大限度地減少應(yīng)用程序和后端之間的耦合;

ORM 處理如何將對象映射到對象關(guān)系數(shù)據(jù)庫中,從而減少數(shù)據(jù)庫和應(yīng)用程序之間的耦合。

如果您在沒有 DAO 的情況下使用 ORM,那么您的應(yīng)用程序?qū)⒆兊靡蕾囉?ORM,因此很難從一個 ORM(例如Hibernate)移動到另一個 ORM(例如 NoSQL)。

Spring DAO 是使用@Repository 注解實現(xiàn)的。 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);
}

最后,關(guān)于Spring框架相關(guān)的概念就簡要介紹到這里,希望這能給你進入并深入Spring技術(shù)棧一個簡單入口,而不會被Spring技術(shù)生態(tài)所驚嚇(Spring現(xiàn)在都成軟件開發(fā)技術(shù)的全家桶了,啥都有)——日進一步,鍥而不舍,終將大成!

到此這篇關(guān)于Spring框架核心概念總覽的文章就介紹到這了,更多相關(guān)Spring框架核心概念內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 查找native方法的本地實現(xiàn)函數(shù)native_function詳解

    查找native方法的本地實現(xiàn)函數(shù)native_function詳解

    JDK開放給用戶的源碼中隨處可見Native方法,被Native關(guān)鍵字聲明的方法說明該方法不是以Java語言實現(xiàn)的,而是以本地語言實現(xiàn)的,Java可以直接拿來用。這里介紹下查找native方法的本地實現(xiàn)函數(shù)native_function,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • JAVA Iterator 轉(zhuǎn)成 List 的操作

    JAVA Iterator 轉(zhuǎn)成 List 的操作

    這篇文章主要介紹了JAVA Iterator 轉(zhuǎn)成 List 的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • java生成excel報表文件示例

    java生成excel報表文件示例

    本篇文章主要介紹了java生成excel報表文件示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • SpringMVC的@InitBinder參數(shù)轉(zhuǎn)換代碼實例

    SpringMVC的@InitBinder參數(shù)轉(zhuǎn)換代碼實例

    這篇文章主要介紹了SpringMVC的@InitBinder參數(shù)轉(zhuǎn)換代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 快速排序算法原理及java遞歸實現(xiàn)

    快速排序算法原理及java遞歸實現(xiàn)

    快速排序 對冒泡排序的一種改進,若初始記錄序列按關(guān)鍵字有序或基本有序,蛻化為冒泡排序。使用的是遞歸原理,在所有同數(shù)量級O(n longn) 的排序方法中,其平均性能最好。就平均時間而言,是目前被認為最好的一種內(nèi)部排序方法
    2014-01-01
  • Java SpringBoot的相關(guān)知識點詳解

    Java SpringBoot的相關(guān)知識點詳解

    這篇文章主要介紹了SpringBoot的相關(guān)知識點,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-10-10
  • Spring?Security配置保姆級教程

    Spring?Security配置保姆級教程

    Spring?Security是一個功能強大且可高度自定義的身份驗證和訪問控制框架。它是保護基于Spring的應(yīng)用程序的事實上的標(biāo)準(zhǔn)。Spring?Security是一個專注于為Java應(yīng)用程序提供身份驗證和授權(quán)的框架
    2023-02-02
  • 解決spring-data-jpa 事物中修改屬性自動更新update問題

    解決spring-data-jpa 事物中修改屬性自動更新update問題

    這篇文章主要介紹了解決spring-data-jpa 事物中修改屬性自動更新update問題,具有很好的參考價值,希望對大家
    2021-08-08
  • IntelliJ IDEA失焦自動重啟服務(wù)的解決方法

    IntelliJ IDEA失焦自動重啟服務(wù)的解決方法

    在使用 IntelliJ IDEA運行 SpringBoot 項目時,你可能會遇到一個令人困擾的問題,一旦你的鼠標(biāo)指針離開當(dāng)前IDE窗口,點擊其他位置時, IDE 窗口會失去焦點,你的 SpringBoot 服務(wù)就會自動重啟,所以本文給大家介紹了IntelliJ IDEA失焦自動重啟服務(wù)的解決方法
    2023-10-10
  • Java?Swing的層次結(jié)構(gòu)深入理解

    Java?Swing的層次結(jié)構(gòu)深入理解

    這篇文章主要介紹了Java?Swing的層次結(jié)構(gòu)深入理解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評論