javascript
Spring依赖注入:注解注入总结
更多11 spring 依賴注入 注解 java
注解注入顧名思義就是通過(guò)注解來(lái)實(shí)現(xiàn)注入,Spring和注入相關(guān)的常見注解有Autowired、Resource、Qualifier、Service、Controller、Repository、Component。
- Autowired是自動(dòng)注入,自動(dòng)從spring的上下文找到合適的bean來(lái)注入
- Resource用來(lái)指定名稱注入
- Qualifier和Autowired配合使用,指定bean的名稱
- Service,Controller,Repository分別標(biāo)記類是Service層類,Controller層類,數(shù)據(jù)存儲(chǔ)層的類,spring掃描注解配置時(shí),會(huì)標(biāo)記這些類要生成bean。
- Component是一種泛指,標(biāo)記類是組件,spring掃描注解配置時(shí),會(huì)標(biāo)記這些類要生成bean。
上面的Autowired和Resource是用來(lái)修飾字段,構(gòu)造函數(shù),或者設(shè)置方法,并做注入的。而Service,Controller,Repository,Component則是用來(lái)修飾類,標(biāo)記這些類要生成bean。
下面我們通過(guò)實(shí)例項(xiàng)目來(lái)看下spring注解注入的使用。
首先新建一個(gè)maven項(xiàng)目,并在pom中添加spring相關(guān)的依賴,如果不知道添加那些依賴,請(qǐng)參照上一篇文章。
然后新建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類,并給該類標(biāo)注@Service注解,在這個(gè)類中定義CarDao的字段,并通過(guò)Autowired來(lái)修飾此字段,這樣上面定義的CarDao類的實(shí)例就會(huì)自動(dòng)注入到CarService的實(shí)例中了。
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注解有一個(gè)可以為空的屬性required,可以用來(lái)指定字段是否是必須的,如果是必需的,則在找不到合適的實(shí)例注入時(shí)會(huì)拋出異常。
下面我們?cè)贏pp.java中使用上面測(cè)試下注解注入:
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,它的構(gòu)造函數(shù)接受一個(gè)package的名稱,來(lái)限定要掃描的package。然后就可以通過(guò)appContext的getBean方法獲得CarService的實(shí)例了。
上面的例子非常簡(jiǎn)單,單純的使用AnnotationConfigApplicationContext就可以了,但是在實(shí)際項(xiàng)目中情況往往沒(méi)有這么簡(jiǎn)單,還是需要spring配置文件的。在spring配置文件中也可以通過(guò)下面的配置讓spring自動(dòng)掃描注解配置。
<!-- bean annotation driven --><context:annotation-config /> <context:component-scan base-package="cn.outofmemory.helloannotation" > </context:component-scan>下面我們看下混合使用spring配置和注解的例子,首先在項(xiàng)目中添加source folder,src/main/resources,并添加spring.xml, 其內(nèi)容如下:
<?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>在上面的配置文件中,我們通過(guò)context:annotation-config和context:component-sacn節(jié)點(diǎn)來(lái)指定要掃描注解注入,然后又定義了一個(gè)id為sqliteCarDao的bean,它的構(gòu)造函數(shù)的driver值為sqlite。
我們修改下App.java使用xml配置文件,再運(yùn)行下App看下會(huì)怎樣。
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("寶馬"); } }運(yùn)行程序發(fā)現(xiàn)輸出為:inserting car 寶馬 into mysql,顯然CarService自動(dòng)注入的CarDao使用了默認(rèn)構(gòu)造函數(shù)構(gòu)造的實(shí)例。是否可以通過(guò)注解指定使用spring.xml中配置的sqliteCarDao呢?
我們可以修改下CarService類,通過(guò)Qualifier注解來(lái)指定要使用的bean的名字。
如下,在指定Autowired注解時(shí),同時(shí)指定Qualifier注解指定bean的名字
@Autowired@Qualifier("sqliteCarDao") private CarDao carDao;重新運(yùn)行下App.java 這次輸出的是inserting car 寶馬 into sqlite,這次使用了spring.xml中配置的bean了。
在文中開頭我們還提到了Resouce注解,這個(gè)注解可以指定名字注入,我們?cè)俅涡薷南翪arService類:
@Resource(name="sqliteCarDao") private CarDao carDao;javax.annotation.Resource注解實(shí)現(xiàn)的效果和@Autowired+@Qualifier的效果是一樣的。
轉(zhuǎn)載于:https://www.cnblogs.com/diegodu/p/5918858.html
總結(jié)
以上是生活随笔為你收集整理的Spring依赖注入:注解注入总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在线小词典(mysql扩展库操作)
- 下一篇: SpringMVC请求处理流程