日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

被各种注解搞晕了?那快来看看Spring Bean注解详解!

發布時間:2023/12/8 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 被各种注解搞晕了?那快来看看Spring Bean注解详解! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

本篇博客中,我們將會討論用于聲明不同類型 Beans 的幾種最常用的 Spring Bean 注解。

眾所周知,Spring 容器中有許多配置 Bean 的方法,我們既可以通過 XML 配置,也可以在配置類中使用 @Bean 注解來聲明 Beans。此外,我們還可以使用 org.springframework.stereotype 包中的一個注解來對類進行標記,然后把其余工作交給組件掃描即可。

組件掃描

在 Spring 中,一旦我們啟用了組件掃描, Spring 就會自動掃描包中的 Bean。

通過使用 @ComponentScan ,Spring 就會自動去掃描那些帶有注釋配置的類,我們可以使用 basePackages 或者 value 參數(兩者是一樣的,value 只不過是 basePackages 的另一種稱呼)來直接指定我們所要掃描的包的名稱,然后 Spring 就會去掃描我們指定包下所有帶有 @Component 注解的類,然后將其自動注冊為一個 Bean。

@Configuration // 以下兩者之一即可 @ComponentScan(basePackages = "com.cunyu.annotions") // @ComponentScan(value = "com.cunyu.annotions") class PetFactoryConfig{…… }

此外,我們還可以使用 basePackageClasses 參數來指向基礎包中的類。

@Configuration @ComponentScan(basePackageClasses = PetFactoryConfig.class) class PetFactoryConfig{…… }

basePackages 和 basePackageClasses 兩個參數都是數組類型的,所以在傳參時我們可以為他們提供多個包。

而如果沒有為 @ComponentScan 指定參數,那么 Spring 就只會掃描和 @ComponentScan 注釋的類位于同一個包的帶有 @Component 注解的其他類,然后將它們自動創建為一個 Bean。

@ComponentScan 充分利用了 Java 8 中的重復注解特性,因此我們能夠用它來多次標記一個類:

@Configuration @ComponentScan(basePackages = "com.cunyu.annotions") @ComponentScan(basePackageClasses = PetFactoryConfig.class) class PetFactoryConfig{…… }

除開上面的方式來標記一個類外,我們還可以使用 @CompentScans 來將多個 @ComponentScan 包含起來,用于指定多個 @ComponentScan 配置。

@Configuration @ComponentScans({@ComponentScan(basePackages = "com.cunyu.annotions"),@ComponentScan(basePackageClasses = PetFactoryConfig.class) }) class PetFactoryConfig{…… }

除開使用注解的方式來實現組件掃描之外,我們還可以通過配置 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";xmlns:context="http://www.springframework.org/schema/context";xmlns:c="http://www.springframework.org/schema/c";xmlns:p="http://www.springframework.org/schema/p";xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd">;<context:component-scan base-package="com.cunyu.dao" /><context:component-scan base-package="com.cunyu.service" /><context:component-scan base-package="com.cunyu.controller" /> </beans>

context:component-scan 元素將實現同注解 @ComponentScan 一樣的效果,即掃描 com.cunyu 包下所有帶有 @Component 注解的類,并將它們注冊創建為 Bean。

@Component

上一小節中我們講了 @ComponentScan 會自動掃描組件過程中會去掃描那些帶有 @Component 注解的類,并將其注冊創建為 Bean,比如下面的例子:

@Component public class Cat{…… }

其中 Cat 類中帶有 @Component 注解,當 Spring 自動掃描時,就會去掃描 Cat 這個類,并創建一個名為 cat 的 Bean 實例。

注意:默認情況下,使用 @ComponentScan 去掃描 @Component 注解的類,生成對應類的 Bean 實例時,Bean 實例具有與類名相同的名稱,但不同的是 Bean 實例的首字母是小寫,而一般類名首字母是大寫。

@Component 是任意 Spring 管理組建的通用構造型,當組件不好歸類時,一般使用該注解,又可以分為如下幾個常用元注解:

  • @Repository:位于持久層,能將數據庫操作跑出的原生異常轉換為 Spring 持久層異常,用于標注數據訪問組件,即 DAO 組件;
  • @Service:位于業務邏輯層,只是標注該類位于業務層邏輯;
  • @Configuration:用于定義配置類,可替換 XML 配置文件,被注解的類內部包含一個或多個被 @Bean 注解的方法,這些方法將會被 AnnotationConfigApplicaitonContext 或者 AnnotaionConfigWebApplicationContext 類掃描,并用于構建 Bean 定義,初始化 Spring 容器;
  • @Controller:屬于 Spring MVC 的注解,進行前端請求的處理、轉發、重定向;用于標注控制層組件;

它們是針對不同使用場景而采取的帶有特定功能化的注解組件,其實質功能其實和 @Component 一樣。因此,如果一個類被 @Component 注解了,那么就可以根據這個類的實際功能,利用 @Repository、@Service … 等代替,而且代替后的注解會具備更多的功能。

@Repository

DAO(Data Access Object,數據訪問對象,為某種類型的數據庫或其他持久性機制提供一個抽象接口的對象) 或者 Repository 類通常代表應用程序中的數據訪問層,我們一般傾向于使用 @Repository 注解。

@Repository public class PetRepository{…… }

通過使用 @Repository 注解,它將啟用自動持久化異常轉換。此時,當我們使用一些持久化框架,比如 Hibernate、MyBatis……時,當帶有 @Repository 注解的類在拋出本地異常時,就會自動將其轉換為 Spring 中的 DataAccessException 的子類。

而要啟動異常轉換,我們就需要自己去聲明我們 PersistenceExceptionTranslationPostProcessor 的實例,聲明的方式可以分為注解性和 XML 配置型。但是一般而言,Spring 都會自動幫我們去完成這個過程,所以我們就不再需要自己去手動聲明了。

  • 注解型
@Bean public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){return new PersistenceExceptionTranslationPostProcessor(); }
  • XML 配置型
<bean class="org.springframework.dao.annotion.PersistenceExceptionTranslationPostProcessor" />

@Service

對于應用程序中的業務邏輯,一般都是位于服務層,因此我們使用 @Service 注解一個類,來指明該類屬于服務層。表示定義一個 Bean,自動根據所標注的組件實例化一個首字母為小寫的 Bean。實例如下:

@Service public class PetService{…… }

上述代碼中 PetService 類被標注為一個 Bean,其名稱為 petServie。

@Configuration

一般用于配置類,而且還可以包含用 @Bean 所注解的 Bean 定義方法,實例如下:

@Configuration public class PetFactoryConfig{@Beanpublic Dog dog(){return new Dog();} }

既然說了使用 @Confgiuration 可以和 XML 配置文件互換,那么以上的配置類等價于如下配置:

<beans><bean id="dog" class = "com.cunyu.dao.Dog"/> </beans>

注意:使用 @Configuration 注解時,一般需要遵循如下原則:

  • @Configuration 注解的類不可以是 final 類型;
  • @Configuration 注解的類不可以是匿名類;
  • 嵌套的 @Configuration 必須是靜態類;
  • @Controller

    @Controller 注解是一個類級別的注解,當把它用在類上時,表示該類在 Spring MVC 中充當控制器,該類將被 Spring 自動掃描,一般我們在該類中加入 @RequestMapping("…"),就可以直接使用瀏覽器來訪問對應界面進行邏輯處理了。實例如下:

    @Controller public class PetController{@RequestMapping(value = "/hello", method = RequestMethod.GET)public String sayHello(){return "你好,村雨遙!";}…… }

    此時,當我們去瀏覽器中訪問 localhost:8080/hello 時,頁面中就會顯示 你好,村雨遙! 這條信息。

    注意,@Controller 注解的類下,我們又發現了 RequestMapping 注解,該注解主要 6 個屬性,分別介紹如下:

    • value :用于指定瀏覽器指定的地址;
    • method,指定請求的 method 類型,一般有 GET、POST、PUT、DELETE,而現在我們一般使用對應的注解 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping;
    • consumes:用于指定處理請求的提交內容類別(Content-Type),如 application/json、test/html;
    • produces:指定返回的內容類別;
    • params:指定 request 中必須包含某些引用數值時,才能讓該方法處理;
    • headers:指定 request 中必須包含某些指定 header 值,才能讓該方法處理請求;

    原型注解及 AOP

    當我們使用 Spring 原型注解時,可以十分容易地創建一個指向所有具有特定構造型的類的切入點。

    比如我們如果想要衡量一個方法在 DAO 層中的執行時間,就可以充分利用 @Repository 注解的特點。

    @Aspect @Component public class PerformanceAspect {@Pointcut("within(@org.springframework.stereotype.Repository *)")public void repositoryClassMethods() {};@Around("repositoryClassMethods()")public Object measureMethodExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {long start = System.nanoTime();Object returnValue = joinPoint.proceed();long end = System.nanoTime();String methodName = joinPoint.getSignature().getName();System.out.println("Execution of " + methodName + " took " + TimeUnit.NANOSECONDS.toMillis(end - start) + " ms");return returnValue;} }

    以上實例中,我們創建了一個切入點,該切入點會去匹配帶有 @Repository 注解的類中的所有方法。然后我們用 @Around 通知來定位切入點,并確定被攔截的方法調用的執行時間。通過使用這個方式,我們就可以輕松地給每個應用程序添加日志記錄、性能管理、審計以及其他行為。

    總結

    好了,以上就主要介紹了 Spring 中的原型注釋,并了解了它們各自所代表的意義。此外,還學習了如何使用組件掃描功能,從而告知 Spring 容器在何處能找到帶有注解的類。

    如果你有更多的見解,歡迎評論留言,一起交流呀!

    總結

    以上是生活随笔為你收集整理的被各种注解搞晕了?那快来看看Spring Bean注解详解!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。