1. 程式人生 > >Spring註解驅動開發——自動裝配(1)

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等註解完成自動裝配