一、注解的分類
?? 主要分為兩大類:使用Bean注解、注冊Bean注解。
使用Bean的注解
?? @Autowired 、 @Resource
@Autowired
??可以對類的成員變量、方法、構(gòu)造函數(shù)等進行標(biāo)注,DI會自動完成裝配工作,可以通過@Autowired來消除get、set方法。
??@Autowired注解可用于為類的屬性、構(gòu)造器、方法進行注值。默認(rèn)情況下,其依賴的對象必須存在(bean可用)如果容器中包含多個同一類型的Bean,那么啟動容器時會報找不到指定類型bean的異常,解決辦法是結(jié)合@Qualifier注解進行限定,指定注入的bean名稱。
例子
@Component("fooFormatter")
public class FooFormatter implements Formatter {
public String format() {
return "foo";
}
}
@Component("barFormatter")
public class BarFormatter implements Formatter {
public String format() {
return "bar";
}
}
// 使用----------------------------------------------------
@Component
public class FooService {
@Autowired
private Formatter formatter;
//todo
}
使用 @Qualifier
@Component
public class FooService {
@Autowired
@Qualifier("fooFormatter")
private Formatter formatter;
//todo
}
??如果我們嘗試將 FooService 加載到我們的上下文中,Spring 框架將拋出 NoUniqueBeanDefinitionException。這是因為 Spring 不知道要注入哪個 bean。為了避免這個問題,有幾種解決方案。那么我們本文要講解的 @Qualifier 注解就是其中之一。
??通過使用 @Qualifier 注解,我們可以消除需要注入哪個 bean 的問題。
@Resource
??@Resource注解和@Autowired注解都是進行依賴注入的注解。@Resource注解是byName注入,@Autowired注解是byType注入。
@Resource依賴注入時查找bean的規(guī)則:
??1.既不指定name屬性,也不指定type屬性,則自動按byName方式進行查找。如果沒有找到符合的bean,則回退為一個原始類型進行進行查找,如果找到就注入。
??2.只指定了name屬性,按照byName的方式注入,如果找到與之相匹配的bean就返回注入,沒有找到就報錯。
??3.只指定了type屬性,就從上下文去找到匹配的類型,如果找到就返回,沒有找到就報錯。
??4.name屬性type屬性,兩者都指定 ,會從bean工廠的上下文找到唯一匹配的對象返回,如果沒有找到就報錯。
還有很多的其他的注解, 就不一一詳細(xì)介紹了。
注冊Bean的注解
??@Component、@ ComponentScan、@Repository、@Controller、@Service、@Configration、
@Component
??用法是pojo實例化到spring容器中,相當(dāng)于配置文件中的
<bean id="" class=""/>泛指各種組件,就是說當(dāng)我們的類不屬于其他歸類的時候(不屬于@Controller、@Services等的時候),
我們就可以使用@Component來標(biāo)注這個類。
其實@Controller、@Services 也是繼承了 @Component,在Spring層面他們之間是沒有任何區(qū)別的,只是用于歸類罷了。
@ComponentScan
??用于告訴Spring那些包路徑下的類是需要被Spring掃描裝入IOC容器的。
例如,如果你有個類用@Controller注解標(biāo)識了,如果不在@ComponentScan配置的包路徑下,那么該Controller就不會被Spring掃描到,更不會裝入Spring容器中。
@Repository
??用于標(biāo)注數(shù)據(jù)訪問組件,即DAO組件。@Repository和@Mapper用法是一樣的。
??@Repository需要在Spring中配置掃描地址,然后生成Dao層的Bean才能被注入到Service層中。
??@Mapper不需要配置掃描地址,通過xml里面的namespace里面的接口地址,生成了Bean后注入到Service層中。
@Controller
??當(dāng)組件屬于控制層時,則使用@Controller注解。將Controller注冊到實例化到SpringIOC容器中。用來創(chuàng)建處理http請求的對象。
@Service
??當(dāng)組件屬于業(yè)務(wù)層時,則使用@Service,同理注冊和實例化到SpringIOC容器中。
@Configuration
??@Configuration用于定義配置類,可替換xml配置文件,被注解的類內(nèi)部包含有一個或多個被@Bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,并用于構(gòu)建bean定義,初始化Spring容器
需要注意的是:
@Configuration不可以是final類型;
@Configuration不可以是匿名類;
嵌套的configuration必須是靜態(tài)類。
小結(jié)
??Bean注解主要用于接口和方法上,有點類似于工廠方法,當(dāng)使用了@Bean注解,我們可以連續(xù)使用多種定義bean時用到的注解,譬如用@Qualifier注解定義工廠方法的名稱,用@Scope注解定義該bean的作用域范圍,譬如是singleton還是prototype等。
當(dāng)然還有很多很多注解,大家去發(fā)現(xiàn)一下吧。