環境:Spring6.1.2
@Qualifier是 Spring 框架中的一個注解,它用于消除自動裝配(autowiring)時的歧義。在 Spring 應用程序中,當存在多個相同類型的 bean 時,自動裝配可能會產生歧義,因為 Spring 容器不知道該選擇哪個 bean 進行注入。這時,我們可以使用 @Qualifier 注解來明確指定要注入的 bean。
假設你有兩個 CommonDAO bean,每個都需要在不同的環境中使用。這時,你可以使用 @Qualifier 來指定具體的 bean。
public class CommonService { @Resource @Qualifier private CommonDAO dao ;}@Configurationpublic class AppConfig { @Bean @Qualifier public TeacherDAO teacherDAO() { return new TeacherDAO() ; } @Bean public StudentDAO studentDAO() { return new StudentDAO() ; } @Bean public CommonService commonService() { return new CommonService() ; }}
上面示例中如果注入的CommonDAO字段上沒有添加@Qualifier注解,那么程序將會報錯,這里通過@Qualifier注解來限定注入的值;該注解也可以設置value屬性。
上面直接通過使用@Qualifier注解來限定注入值,接下來將介紹其它的使用方法。
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Qualifierpublic @interface Pack { String value();}
自定義限定注解,該注解上使用了@Qualifier注解。接下來我們就可以使用該注解。
public class CommonService { @Resource @Pack private CommonDAO dao ;}@Bean@Packpublic TeacherDAO teacherDAO() { return new TeacherDAO() ;}
這時候你就可以自定義不同的注解分別標準你要注入的值。
有如下接口定義,該接口是泛型接口:
public class Teacher {}public class Student {}public interface CommonDAO<T> {}public class TeacherDAO implements CommonDAO<Teacher> {}public class StudentDAO implements CommonDAO<Student> {}public class CommonService { @Resource private CommonDAO<Student> dao ; @Override public String toString() { return "CommonService [dao=" + dao + "]"; }}
在上面CommonDAO的注入中如果你泛型使用的Student那么注入的將是StudentDAO,如果是Teacher類型,那么注入的將是TeacherDAO。
泛型限定符也可用于List、Map 實例和數組。如下使用List示例:
@Resourceprivate List<CommonDAO<Student>> daos ;
這將注入容器中所有泛型是Student類型的CommonDAO實例對象。
有如下注解,我們完全可以不依賴任何Spring相關的注解實現限定的注入值。
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface Pack { String value() default "" ;}
該自定義注解并沒有使用Spring的@Qualifier注解。要使得上面注解生效你還需要配置如下類:
@Beanpublic CustomAutowireConfigurer customAutowireConfigurer() { CustomAutowireConfigurer autowireConfigurer = new CustomAutowireConfigurer() ; // 指定我們自定義的注解 autowireConfigurer.setCustomQualifierTypes(Set.of(Pack.class)) ; return autowireConfigurer ;}
CustomAutowireConfigurer是BeanFactoryPostProcessor,這會幫助我們注冊自定義的限定注解。
除了上面的方式限定注入的值,我們還可以自定義注解,指定更多的屬性值去匹配bean對象,只有bean對象具有相同的屬性值(元數據信息)才能匹配。
public enum Format { JSON, CSV, PLAIN}@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Qualifierpublic @interface Pack { String value() default "" ; // 指定格式 Format format() ;}// Bean定義指定每一種bean對應的格式format@Pack(format = Format.CSV)public class CSVDAO implements CommonDAO {}@Pack(format = Format.JSON)public class JSONDAO implements CommonDAO {}
接下來在注冊上面兩個*DAO bean時就不能通過注解的方式了,只能通過xml或者BeanDefinition的方式注冊,如下示例:
ApplicationContext context = ... ;// 分別設置他們的元數據信息。context.registerBean(CSVDAO.class, bd -> { bd.setAttribute("format", "CSV") ;});context.registerBean(JSONDAO.class, bd -> { bd.setAttribute("format", "JSON") ;});
注入配置:
@Resource@Pack(format = Format.JSON)private CommonDAO dao ;
通過上面指定format屬性,以確定需要注入對象的明確要求。
本文鏈接:http://www.tebozhan.com/showinfo-26-88932-0.htmlSpring注入還可以這樣玩!漲知識了
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 精通Python單元測試:掌握Unittest模塊的終極指南
下一篇: 聊聊樂觀鎖與悲觀鎖