Spring 常用注解

一、注解的分類

?? 主要分為兩大類:使用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)一下吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容