javascript
Spring的自动装配方法
Spring的裝配方式
我們已經了解了依賴注入的基本原理,初識了@Component和@AutoWired標注的用法。為一個應用中的Beans的配置依賴注入關系的過程稱之為裝配(Wiring)。
Spring提供三種裝配方式:
- 基于標注的自動裝配
- 基于XML配置的顯式裝配
- 基于Java配置的顯式裝配
之前的示例就是使用自動裝配。通過給Java類增加相應的標注,就能夠啟用Spring隱式的Bean發現機制,并自動完成裝配過程。我們在開發中應該盡可能使用自動裝配,足以應付開發中的絕大多數情況。
Spring通過兩個特性實現自動裝配:
- 構件掃描:自動掃描和創建Spring應用上下文中的Beans
- @Autowired標注:自動建立Spring Beans之間的依賴關系
在某些情況下,基于XML配置和基于Java配置的顯式裝配會有用武之地,比如實例化一個第三方庫中的Bean。這種情況下,Java配置和XML配置我們優先使用Java配置,因為這是一種類型安全的方式,能夠在編譯時就盡早發現錯誤。
我們先來了解自動裝配吧!
啟用自動掃描
如何啟動自動掃描機制呢? 在Spring Boot應用中,加入@SpringBootApplication標注就能啟動自動掃描。
package com.tianmaying;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} }我們也可以通過XML配置或者Java配置的方式來啟動自動掃描。
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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.tianmaying" /> </beans><context:component-scan>標簽將會開啟Spring Beans的自動掃描,并可設置base-package屬性,表示Spring將會掃描該目錄以及子目錄下所有被@Component標注修飾的類,對它們進行裝配。
Java配置方式
package com.tianmaying.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;@Configuration @ComponentScan(basePackages = "com.tianmaying") public class BlogSystemConfig { }-
@Configuration表示這個Java文件是一個配置文件,這類Java代碼的作用在于配置,要和普通的Java代碼區分開發,因此一般我們需要將其放在一個專門的包中,在代碼例子中是com.tianmaying.config。
-
@ComponentScan表示開啟Spring Beans掃描,類似于XML配置,這里也可以可以設置basePackages屬性。
這種字符串形式的表示雖然可以,但是不具備“類型安全”,因此Spring也提供了更加類型安全的機制,即通過類或者接口來設置掃描機制的目標目錄。通過這種設置,會將類A和類B所在的目錄作為掃描的目標目錄。
類型安全大家可以這樣理解:
-
如果使用字符串的形式,即使類名寫錯了,在開發時是發現不了的,會在運行時拋出異常。
-
而使用Java類的形式,類名寫錯的話,編譯時就會提示錯誤,比如Eclipse中就會提示找不到類的錯誤信息,這就避免了這種情況下的運行時異常,因此是更加安全的。
Spring Beans的命名
@Component用于定義一個Spring Bean。啟動了自動掃描后,被@Component標注的類都自動會注冊為Spring Beans。比如,我們可以將UserDao和PostDao注冊為Spring Beans:
@Component public class UserDao {... } @Component public class PostDao {@Autowiredprivate UserDao userDao;... }在Spring上下文中,每個Bean都有自己的ID。Spring掃描過程中所創建的Bean都有默認的ID,這個ID為將類名首字母小寫形成的字符串。
如果我們希望給某個類對應的Bean取特點的名字,則可以給@Component標注傳入指定的參數,比如:
@Component("customizedName") public class UserDao {... }自動裝配Bean
@Autowired標注可以作用在以下四種地方
- 構造函數
- 成員變量
- Setter方法
- 普通方法
通常情況下,我們通過給成員變量加@Autowired標注就能滿足開發中的大部分場景。
回到博客應用中,我們已經為PostDao和UserDao增加標注@Component,這樣就能注冊為Spring Bean,被`Service`類所使用。
同樣,PostService和UserService也可以用@Component進行標注,通過在私有屬性上添加@Autowired標注,將其所依賴的Dao類注入其中。
@Component public class PostService {@Autowiredprivate PostDao postDao;... } @Component public class UserService {@Autowiredprivate UserDao userDao;... }最后在Servlet中,可以注入Service,比如IndexController類中:
@WebServlet("") public class IndexController extends HttpServlet {@Autowiredprivate UserService userService;... }可選裝配
使用自動裝配時,如果在應用上下文中,對應類型的Bean有且只有一個,則會自動裝配到該屬性上。
如果沒有找到對應的Bean,應用會拋出對應的異常,如果想避免拋出這個異常,則需要設置@Autowired(required=false)。
這個屬性應當謹慎使用,我們可能需要處理NullPointerException的問題。
作者:David
鏈接:https://zhuanlan.zhihu.com/p/20676907
來源:知乎
總結
以上是生活随笔為你收集整理的Spring的自动装配方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java集合的使用:List与Map
- 下一篇: Java时间日期格式转换