1. 程式人生 > >Spring註解注入

Spring註解注入

一.Spring元件掃描機制

Spring能在Classpath下自動掃描被某些註解標識的類,並把它們放到IoC容器中,作用和使用XML配置是一樣的,但是效率要高很多。
特定的元件有如下幾個(不止):
1. Autowired是自動注入,自動從spring的上下文找到合適的bean來注入
2. Resource用來指定名稱注入
3. Qualifier和Autowired配合使用,指定bean的名稱
4. Service,Controller,Repository分別標記類是Service層類,Controller層類,資料儲存層的類,spring掃描註解配置時,會標記這些類要生成bean。
5. Component是一種泛指,標記類是元件,spring掃描註解配置時,會標記這些類要生成bean。
(每種註解詳細介紹參考:

Spring框架註解學習
上面的Autowired和Resource是用來修飾字段,建構函式,或者設定方法,並做注入的。而Service,Controller,Repository,Component則是用來修飾類,標記這些類要生成bean。

二. 通過例項專案來看下spring註解注入的使用。

首先新建一個maven專案,並在pom中新增spring相關的依賴。
然後新建CarDao類,給它新增@Repository註解,如下程式碼:

package cn.outofmemory.helloannotation;
import org.springframework.stereotype.Repository;
@Repository
public class CarDao { public void insertCar(String car) { String insertMsg = String.format("inserting car %s", car); System.out.println(insertMsg); } }

新建CarService類,並給該類標註@Service註解,在這個類中定義CarDao的欄位,並通過Autowired來修飾此欄位,這樣上面定義的CarDao類的例項就會自動注入到CarService的例項中了。

package cn.outofmemory.helloannotation;
import
org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class CarService { @Autowired private CarDao carDao; public void addCar(String car) { this.carDao.insertCar(car); } }

注意:Autowired註解有一個可以為空的屬性required,可以用來指定欄位是否是必須的,如果是必需的,則在找不到合適的例項注入時會丟擲異常。
下面我們在App.java中使用上面測試下註解注入:

package cn.outofmemory.helloannotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App {
    public static void main( String[] args )
    {
        ApplicationContext appContext = new AnnotationConfigApplicationContext("cn.outofmemory.helloannotation");
        CarService service = appContext.getBean(CarService.class);
        service.addCar("寶馬");
    }
}

在上面的main方法中首先我們初始化了appContext,他是AnnotationConfigApplicationContext,它的建構函式接受一個package的名稱,來限定要掃描的package。然後就可以通過appContext的getBean方法獲得CarService的例項了。
上面的例子非常簡單,單純的使用AnnotationConfigApplicationContext就可以了,但是在實際專案中情況往往沒有這麼簡單,還是需要spring配置檔案的。在spring配置檔案中也可以通過下面的配置讓spring自動掃描註解配置。

 <!-- bean annotation driven -->
    <context:annotation-config />
    <context:component-scan base-package="cn.outofmemory.helloannotation" >
    </context:component-scan>

下面我們看下混合使用spring配置和註解的例子,首先在專案中新增source folder,src/main/resources,並新增spring.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-3.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-3.0.xsd ">

    <!-- bean annotation driven -->
    <context:annotation-config />
    <context:component-scan base-package="cn.outofmemory.helloannotation" >
    </context:component-scan>
    <bean id="sqliteCarDao" class="cn.outofmemory.helloannotation.CarDao" >
        <constructor-arg name="driver" value="sqlite"/>
    </bean> 
 </beans>

在上面的配置檔案中,我們通過context:annotation-config和context:component-sacn節點來指定要掃描註解注入,然後又定義了一個id為sqliteCarDao的bean,它的建構函式的driver值為sqlite。
我們修改下App.java使用xml配置檔案,再執行下App看下會怎樣。

package cn.outofmemory.helloannotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
    public static void main( String[] args )
    {
        //ApplicationContext appContext = new AnnotationConfigApplicationContext("cn.outofmemory.helloannotation");
        ApplicationContext appContext = new ClassPathXmlApplicationContext("/spring.xml");
        CarService service = appContext.getBean(CarService.class);
        service.addCar("寶馬");
    }
}

執行程式發現輸出為:inserting car 寶馬 into mysql,顯然CarService自動注入的CarDao使用了預設建構函式構造的例項。是否可以通過註解指定使用spring.xml中配置的sqliteCarDao呢?
我們可以修改下CarService類,通過Qualifier註解來指定要使用的bean的名字。
如下,在指定Autowired註解時,同時指定Qualifier註解指定bean的名字

    @Autowired
    @Qualifier("sqliteCarDao")
    private CarDao carDao;

重新執行下App.java 這次輸出的是inserting car 寶馬 into sqlite,這次使用了spring.xml中配置的bean了。
在文中開頭我們還提到了Resouce註解,這個註解可以指定名字注入,我們再次修改下CarService類:

@Resource(name="sqliteCarDao") 
private CarDao carDao;

javax.annotation.Resource註解實現的效果和@[email protected]的效果是一樣的。

相關推薦

spring註解注入和context:component-scan

  一、spring註解 @Service告訴spring容器,這是一個Service類,標識持久層Bean元件,預設情況會自動載入它到spring容器中。 @Autowried註解告訴spring,這個欄位需要自動注入 @Scope指定此spring bean的scope

spring註解注入:詳解

spring從2.5版本開始支援註解注入,註解注入可以省去很多的xml配置工作。由於註解是寫入java程式碼中的,所以註解注入會失去一定的靈活性,我們要根據需要來選擇是否啟用註解注入。 我們首先看一個註解注入的實際例子,然後再詳細介紹context:component-scan的使用。 如果你已經在用

利用反射實現簡單的Spring註解注入例項

一時興起,這兩天看了看Spring的原始碼,就想寫一個簡單的Spring利用註解注入!!Spring的註解注入方式給了我們很方便的好處!大家應該都瞭解Spring的注入原理,在這裡寫下一個非常簡單的使用註解來注入的例項,做個小小的筆記! 要使用註解,那就絕對和反射離不開。摘

spring註解注入屬性

1 注入普通型別屬性 (1)在要注入值的屬性上面使用註解 @Value,不需要set方法 @Value(value="lucymary")  privateStringbname; 2 注入物件型別屬性(重點) (0)首先把物件使用註解建立 第一個註解: @Autowir

Spring註解注入集合物件

目錄 1. @Autowired註解注入map、list與@Qualifier package com.imooc.beanannotation.multibean; public interface BeanInterface { } package com

spring註解注入properties屬性值

1 首先在applicationContext.xml中加入:    <beans xmlns:util="http://www.springframework.org/schema/util"      xsi:schemaLocation="http://www.

關於使用spring註解注入靜態屬性

1. 使用場景 一般需要在一個工具類中使用@Autowired 註解注入一個service。但是由於工具類方法一般都寫成static,所以直接注入就存在問題。 2. 解決方法 方法1

Spring註解注入

一.Spring元件掃描機制 Spring能在Classpath下自動掃描被某些註解標識的類,並把它們放到IoC容器中,作用和使用XML配置是一樣的,但是效率要高很多。 特定的元件有如下幾個(不止): 1. Autowired是自動注入,自動從spring的上下文找到合

Spring註解注入原理

Spring容器框架包org.springframework.stereotype下Controller註解介面原始碼如下:@Target({java.lang.annotation.ElementType.TYPE})@Retention(RetentionPolicy.RU

quartz如何獲取spring註解注入的bean

其實很簡單,如下: public class ExampleJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext con

Spring 註解注入—@Qualifier 註釋

當建立多個具有相同型別的 bean 時,並且想要用一個屬性只為它們其中的一個進行裝配,在這種情況下,你可以使用 @Qualifier 註釋和 @Autowired 註釋通過指定哪一個真正的 bean 將會被裝配來消除混亂。下面顯示的是使用 @Qualifier 註釋的一

Spring註解注入bean和配置檔案注入bean

註解的方式確實比手動寫xml檔案注入要方便快捷很多,省去了很多不必要的時間去寫xml檔案 按以往要注入bean的時候,需要去配置一個xml,當然也可以直接掃描包體,用xml注入bean有以下方法: 1 <?xml version="1.0" encoding="UTF-8"?> 2

spring常用的一些註解以及註解注入總結

轉載自:http://blog.csdn.net/ailan_/article/details/47682069 常用的spring註解有如下幾種:@Controller @Service @Autowired @RequestMapping @Reques

Spring 實現執行緒介面 Runnable 註解注入失敗 @Resource annotation is not supported on static fields

原因就是spring和多執行緒安全的問題,不讓注入 解決方案有以下幾種 一.變數字首加static,生成set方法並加上@Resource,記住把set方法 static 去掉,否則會丟擲 @Resource annotation is not supported on static f

spring 使用註解注入bean

學了兩種使用註解注入bean的方式,按照網上提供的方法學習並整理的。 1、@Resource  2、@Autowired 首先要說明的是 spring的標頭檔案,下面是一個比較全的標頭檔案 <beans xmlns="http://www.springfram

Spring依賴注入(構造引數注入、集合,陣列屬性注入、XML自動注入 ,全註解配置)

依賴注入 構造引數注入        --> 常用的是方案一和方案二         MyBean類  YouBean類 <?xml version="1.0" encodin

spring依賴注入: 註解注入

註解注入顧名思義就是通過註解來實現注入, Spring和注入相關的常見註解有Autowired、Resource、Qualifier、Service、Controller、Repository、Component。 [email protected]是自動注入

java 靜態程式碼塊和spring @value等註解注入順序

今天在引用yml配置檔案的時候,因為用到了繼承的靜態程式碼塊。類與類有繼承關係的靜態程式碼塊是先執行父類靜態程式碼塊再執行子類靜態程式碼塊,這個問題不用說。 今天探索的是與spring相關的執行順序 我在專案啟動的時候需要去載入部分配置檔案,這些配置檔案的資訊在子類的靜態程式碼塊需要使用

Spring 如何使用註解注入集合類list、set、map

首先通過示例來展示,如何在Spring中使用註解注入集合類(list、map、set等) 定義介面InjectService,繼承InitializingBean介面,便於列印Spring注入的例項物件 public interface InjectService extends Initi

後端-框架-Spring-IoC-註解注入

=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/