Spring註解驅動開發——自動裝配(1)
自動裝配:Spring利用依賴注入(DI),完成對IOC容器中各個元件的依賴賦值
1、@Autowired:
預設先按照型別去容器中找相應的元件(applicationContext.getBean(Xxx.class)),若只找到一個則進行裝配,若找到多個則再按照屬性的名稱作為id找對應的元件(applicationContext.getBean("beanId"));另外可使用@Qualifier指定屬性Bean的id進行裝配,如果沒有找到指定的屬性bean,則會報NoSuchBeanDefinitionException的異常,如果想在找不到屬性bean的時候不讓程式出錯,則可以設定@Autowired的required屬性為false:@Autowired(required=false),此時則在容器中有該屬性bean時裝配,無則不裝配
@Service
public class BookService {
@Autowired
@Qualifier("bookDao")
private BookDao bookDao;
}
看下面程式碼:
@Configuration
@ComponentScan({"com.bdm.service","com.bdm.dao"})
public class MyAutowireConfig {
@Bean
public BookDao bookDao2(){
return new BookDao();
}
}
com.bdm.dao"})
public class MyAutowireConfig {
@Bean
public BookDao bookDao2(){
return new BookDao();
}
}
此時該配置類容器中會有兩個BookDao例項,一個是通過自動掃描建立的,一個是通過@Bean註解建立的,通過自動掃描建立的bean的id預設為類名的首字母小寫,通過@Bean註解建立的id則為方法名
使用Spring提供的@Primary註解指定首選裝配的Bean:在容器中有多個該型別的bean時,優先裝配該bean
@Configuration @ComponentScan({"com.bdm.service","com.bdm.dao"}) public class MyAutowireConfig { @Bean @Primary public BookDao bookDao2(){ return new BookDao(); } }
@Primary public BookDao bookDao2(){ return new BookDao(); } }
此時在容器中有多個BookDao型別的bean時會優先裝配這個由@Primary註解的bean,除非使用@Qualifier明確制定了要裝配的bean的id
2、@Resource(JSR250規範)和@Inject(JSR330規範):這兩個是Java規範的註解,而@Autowired是Spring自己的註解
@Resource預設是按照元件的名稱(屬性名作為id)裝配,而不像@Autowired是預設先按照型別裝配,使用@Resource時@Primary註解會失效,也可以使用@Resource註解的name屬性指定元件,類似於@Autowired結合@Qualifier,但是@Resource不支援required=false,也就是說使用@Resource時必須裝配成功,否則會報錯:NoSuchBeanDefinitionException
@Service
public class BookService {
//@Autowired(required=false)
//@Qualifier("bookDao3")
@Resource(name="bookDao2")
private BookDao bookDao;
}
使用@Inject時需要匯入依賴:javax.inject
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
@Inject的功能和@Autowired的功能一樣,也支援@Primary註解,只是少了required=false的屬性
@Service
public class BookService {
//@Autowired(required=false)
//@Qualifier("bookDao3")
//@Resource(name="bookDao2")
@Inject
private BookDao bookDao;
}
這三個註解的區別在於:@Autowired是Spring的註解,脫離不了Spring的支援,@Resource和@Inject是java的規範,其他的框架也會支援,但是@Autowired的功能稍微強大一些
這些註解之所以能完成自動裝配的功能,是因為Spring提供的後置處理器AutowiredAnnotationBeanPostProcessor,該後置處理器通過解析@Autowired、@Resource、@Inject等註解完成自動裝配