SpringBoot常用注解:@Resource/@Component與@Autowired的使用、@PostConstruct注解、@Mapper注解的作用


一、@Resource與@Component

  SR-250標准注解,推薦使用它來代替Spring專有的@Autowired注解。

  @Resource的作用相當於@Autowired,只不過 @Autowired按byType自動注入,而@Resource默認按byName自動注入罷了。

  @Resource有兩個屬性是比較重要的,分別是 name 和 type,Spring將 @Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。

  所以如果使用name屬性,則使用byName的自 動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動 注入策略。

1、@Resource裝配順序:

(1)如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常

(2)如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常

(3)如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常

(4)如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配(見2)。如果沒有匹配,則回退為一個原始類型(UserDao)進行匹配,如果匹配則自動裝配。

二、@Autowired

  在java代碼中使用@Autowired或@Resource注解方式進行裝配,這兩個注解的區別是:@Autowired 默認按類型裝配,@Resource默認按名稱裝配,當找不到與名稱匹配的bean才會按類型裝配。

  @Autowired注解是按類型裝配依賴對象,默認情況下它要求依賴對象必須存在,如果允許null值,可以設置它required屬性為false。

三、@PostConstruct注解

  @PostConstruct注解好多人以為是Spring提供的,其實是Java自己的注解。

  Java中該注解的說明:@PostConstruct 該注解被用來修飾一個非靜態的 void() 方法。

  被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,並且只會被服務器執行一次。PostConstruct在構造函數之后執行,init() 方法之前執行。

  通常我們會是在Spring框架中使用到@PostConstruct注解,該注解的方法在整個Bean初始化中的執行順序:

  Constructor(構造方法) -> @Autowired(依賴注入) -> @PostConstruct(注釋的方法)

  @PostConstruct的應用:比如我們在 servlet 里拿token或解析token時需要分不同環境,那么我們就可以利用這個注解,去提前取得這個環境設置的不同的值。(這個是我們在springSecurity里的token處理時用到的,所以查了一下具體是什么意思)

 
         
  private static String SECRET;
  @PostConstruct public void setSecret() { if (envService.isProd()) { SECRET = "TokenSecret"; } else { SECRET = "TestTokenSecret"; } }

四、@Mapper注解的作用

1、為了把mapper這個DAO交給Spring管理

  我們定義DemoMapper類,但是並沒有在該類上定義類似@Service或者@Controller之類的注解,那么為什么可以被Spring管理呢?

(1)方式一:使用@Mapper注解:為了讓DemoMapper能夠讓別的類進行引用,我們可以在DemMapper類上添加@Mapper注解。

    @Mapper  
    public interface DemoMapper { @Insert("insert into Demo(name) values(#{name})") @Options(keyProperty="id",keyColumn="id",useGeneratedKeys=true) public void save(Demo demo); } 

  直接在Mapper類上面添加注解@Mapper,這種方式要求每一個mapper類都需要添加此注解,麻煩。

(2)方式二:使用@MapperScan注解:通過使用@MapperScan可以指定要掃描的Mapper類的包的路徑,比如:

    @SpringBootApplication  
    @MapperScan("com.kfit.*.mapper") public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } } 

  可以根據包的結構指定不同的表達式。

  使用@MapperScan注解多個包:可以使用如下的方式指定多個包:

    @SpringBootApplication  
    @MapperScan({"com.kfit.*.mapper","org.kfit.*.mapper"}) public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } } 

2、為了不再寫mapper映射文件:從mybatis3.4.0開始加入了@Mapper注解,目的就是為了不再寫mapper映射文件。

/** * 添加了@Mapper注解之后這個接口在編譯時會生成相應的實現類 * * 需要注意的是:這個接口中不可以定義同名的方法,因為會生成相同的id * 也就是說這個接口是不支持重載的 */ @Mapper public interface UserDAO {}

3、為了給mapper接口 自動根據一個添加@Mapper注解的接口生成一個實現類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM