Spring依賴注入:註解注入總結

註解注入顧名思義就是經過註解來實現注入,Spring和注入相關的常見註解有Autowired、Resource、Qualifier、Service、Controller、Repository、Component。java

  • Autowired是自動注入,自動從spring的上下文找到合適的bean來注入mysql

  • Resource用來指定名稱注入spring

  • Qualifier和Autowired配合使用,指定bean的名稱sql

  • Service,Controller,Repository分別標記類是Service層類,Controller層類,數據存儲層的類,spring掃描註解配置時,會標記這些類要生成bean。app

  • Component是一種泛指,標記類是組件,spring掃描註解配置時,會標記這些類要生成bean。maven

上面的Autowired和Resource是用來修飾字段,構造函數,或者設置方法,並作注入的。而Service,Controller,Repository,Component則是用來修飾類,標記這些類要生成bean。函數

下面咱們經過實例項目來看下spring註解注入的使用。測試

首先新建一個maven項目,並在pom中添加spring相關的依賴,若是不知道添加那些依賴,請參照上一篇文章。ui

而後新建CarDao類,給它添加@Repository註解,以下代碼:this

package cn.outofmemory.helloannotation;import org.springframework.stereotype.Repository;@Repositorypublic 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;/**
 * Hello world!
 *
 */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;
/**
 * Hello world!
 *
 */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註解實現的效果和@Autowired+@Qualifier的效果是同樣的。

相關文章
相關標籤/搜索