spring註解使用介紹
註解註入顧名思義就是通過註解來實現註入,Spring和註入相關的常見註解有Autowired、Resource、Qualifier、Service、Controller、Repository、Component。
- Autowired是自動註入,自動從spring的上下文找到合適的bean來註入
- Resource用來指定名稱註入
- Qualifier和Autowired配合使用,指定bean的名稱
- Service,Controller,Repository分別標記類是Service層類,Controller層類,數據存儲層的類,spring掃描註解配置時,會標記這些類要生成bean。
- Component是一種泛指,標記類是組件,spring掃描註解配置時,會標記這些類要生成bean。
上面的Autowired和Resource是用來修飾字段,構造函數,或者設置方法,並做註入的。而Service,Controller,Repository,Component則是用來修飾類,標記這些類要生成bean。
下面我們通過實例項目來看下spring註解註入的使用。
首先新建一個maven項目,並在pom中添加spring相關的依賴,如果不知道添加那些依賴,請參照上一篇文章。
然後新建CarDao類,[email protected],如下代碼:
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類,[email protected],在這個類中定義CarDao的字段,並通過Autowired來修飾此字段,這樣上面定義的CarDao類的實例就會自動註入到CarService的實例中了。
packagecn.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;
[email protected][email protected]
spring註解使用介紹