Spring基礎(Bean)

tankII發表於2021-09-09

Spring基礎(Bean)

Bean配置項(常用)

  • Id
  • Class
  • Scope
  • Constructor arguments
  • Properties
  • Autowiring mode
  • lazy-initialization mode
  • Initialization/destruction method

Bean的作用域

  • singleton:單例,指一個Bean容器中只存在一份
  • prototype: 每次請求(每次使用)建立新的例項,destroy方式不生效
  • request:每次http請求建立一個例項且僅在當前request內有效
  • session
  • global session
  • global session

例子(singleton與prototype)

Bean的生命週期

++Bean的定義——Bean的初始化——Bean的使用——Bean的銷燬++

  1. Bean的定義

    Bean是spring裝配的元件模型,一切實體類都可以配置成一個Bean,進而就可以在任何其他的Bean中使用,一個Bean也可以不是指定的實體類,這就是抽象Bean。
  2. Bean的初始化

    2.1 實現InitializingBean介面,覆蓋afterPropertiesSet()方法。

    2.2 配置init-method
  3. Bean的使用

    3.1 BeanFactory

    3.2 ApplicationContext
  4. Bean的銷燬

    4.1 實現DisposableBean介面,覆蓋destory()方法

    4.2 配置destroy-method

配置全域性預設初始化、銷燬方法

default-init-method=“init” default-destroy-method=“destroy”

Aware

  1. Aware是什麼?

     - Spring中提供了一些以Aware結尾的介面,實現了Aware介面的bean在被初始化之後,可以獲取相應資源

     - 透過Aware介面,可以對Spring相應資源進行操作(一定要慎重)

     - 為對Spring進行簡單的擴充套件提供了方便的入口

Bean的自動裝配(Autowiring)

default-autowire="byName">
   		<!-- default-autowire="constructor" -->
   		<!-- default-autowire="byType" -->
  • No:不做任何操作
  • Byname:根據屬性名自動裝配。此選項將檢查容器並根據名字查詢與屬性完全一致的bean,並將其與屬性自動裝配
  • byType:如果容器中存在一個與指定屬性型別相同的bean,那麼將與該屬性自動裝配。
  • Constructor:與byType方式類似,不同之處在於它應用於構造器引數。

Resources

  • 針對於資原始檔的統一介面
  • Resources

     - UrlResource:URL對應的資源,根據一個URL地址即可構建

     - ClassPathResource:獲取類路徑下的資原始檔

     - FileSystemResource:獲取檔案系統裡面的資源

     - ServletContextResource:ServletContext封裝的資源,用於訪問ServletContext環境下的資源

     - InputStreamResource:針對於輸入流封裝的資源

     - 針對於位元組陣列封裝的資源

ResourceLoader

Bean管理的註解

  1. 元註解

     - 許多Spring提供的註解可以作為自己的程式碼,即“後設資料註解”,元註解是一個簡單的註解,可以應用到另一個註解

     - 除了value(),元註解還可以有其它的屬性,允許定製
  2. 類的自動檢測及Bean的註冊

     - Spring可以自動檢測類並註冊Bean到ApplicationContext中。


  3.  - 透過在基於XML的Spring配置如下標籤(請注意包含上下文名稱空間)

     - 僅會查詢在同一個applicationContext中的bean註解
  4. 類的自動檢測及Bean的註冊

     - 為了能夠檢測這些類並註冊相應的Bean,需要下面內容

    <context:component-scan base-package="org.example">

     - 包含,通常在使用前者後,不用再使用後者

     - AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor也會被包含進來
  5. 使用過濾器進行自定義掃描
  • 預設情況下,類被自動發現並註冊bean的條件是:使用@Component,@Repository,@Service,@Controller註解或者使用@Component的自定義註解
  • 可以透過過濾器修改上面的行為,如:下面例子的XML配置忽略所有的@Repository註解並用“Stub”代替
  • 還可使用use-default-filters="false"禁用自動發現與註冊
  1. 定義Bean
  • 掃描過程中元件被自動檢測,那麼Bean名稱是由BeanNameGenerator生成的(@Component,@Repository,@Service,@Controller都會有個name屬性用於顯示設定Bean Name)
  • 可自定義bean命名策略,實現BeanNameGenerator介面,並一定要包含一個無引數建構函式。
  1. 作用域(Scope)
  • 通常情況下自動查詢的Spring元件,其scope是singleton,Spring2.5提供了一個標識scope的註解@Scope
  • 也可以自定義scope策略,實現ScopeMetadataResolver介面並提供一個無參構造器
  1. 代理方式
  • 可以使用scoped-proxy屬性指定代理,有三個值可選:no,interfaces,targetClass
  1. @Required
  • @Required註解適用於bean屬性的setter方法
  • 這個註解僅僅表示,受影響的bean屬性必須在配置時被填充,透過在bean定義或透過自動裝配一個明確的屬性值
  1. @Autowired
  • 可以將@Autowired註解為”傳統“的setter方法
  • 可用於構造器或成員變數
  • 預設情況下,如果因找不到合適的bean將會導致autowiring失敗丟擲異常,可以透過下面的方式避免
  • 每個類只能有一個構造器被標記為required=true
  • @Autowired的必要屬性,建議使用@Required註解

     -可以使用@Autowired註解那些眾所周知的解析依賴性介面,比如:BeanFactory,ApplicationContext,Environment,ResourceLoader,ApplicationEventPublisher,and MessageSource

     -可以透過新增註解給需要該型別的陣列的欄位或方法,以提供ApplicationContext中的所有特定型別的bean

     -可以用於裝配key為String的Map

     -如果希望陣列有序,可以讓bean實現org.springframework.core.Ordered介面或使用的@Order註解

     -@Autowired是由Spring BeanPostProcessor處理的,所以不能在自己的BeanPostProcessor或BeanFactoryPostProcessor型別應用這些註解,這些型別必須透過XML或者Spring的@Bean註解載入
  1. @Qualifier
  • 按型別自動裝配可能多個bean例項的情況,可以使用Spring的@Qualifier註解縮小範圍(或指定唯一),也可以用於指定單獨的構造器引數或方法引數
  • 可用於註解集合型別變數
  1. @Resource(name="")
  • 如果沒有顯示地指定@Resource的name,預設的名稱是從屬性名或者setter方法得出
  • 註解提供的名字被解析為一個bean的名稱,這是由ApplicationContext的中的CommonAnnotationBeanPostProcessor發現並處理的
  1. 基於java的容器註解
  • @Bean標識一個用於配置和初始化一個由SpringIoc容器管理的新物件的方法,類似於XML配置檔案的
  • 可以在Spring的@Component註解的類中使用@Bean註解任何方法(僅僅是可以)
  • 上一點中,通常使用的是@Configuration
@Configuration
public class AppConfig{
    
    @Bean
    public MyService myService(){
        return new MyServiceImpl();
    }
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1795/viewspace-2815609/,如需轉載,請註明出處,否則將追究法律責任。

相關文章