Spring关于@required注解

xiaoxiao2021-02-28  5

/**  @Required注解 适用于bean属性的setter方法   这个注解仅仅表示,受影响的bean属性必须在配置的时候被填充,通过在bean定义或通过自动装配一个明确的属性值   public class SimpleMovierListener{   private MovieFinder movieFinder;   @required   public void setMovieFinder(MovieFinder movieFinder){   this.movieFinder=movieFinder;   }   }  @Autowired 注解为“传统” 的setter方法   private MovieFinder movieFinder;   @Autowired   public void setMovieFinder(MovieFinder movieFinder){   this.movieFinder=movieFinder;   }     可用于构造器或成员变量   @Autowired   private MovieCatalog movieCatalog;   private CustomerPerferenceDao customerPerferenceDao;   @Autowired   public MovieRecommender(CustomerPerferenceDao customerPerferenceDao){   this.customerPerferenceDao=customerPerferenceDao;   }     默认情况下,如果因为找不到合适的bean将会导致autowiring失败抛出异常,可以通过下面的方式避免   public class SimpleMovierListener{   private MovieFinder movieFinder;   @Autowired(required=false)   public void setMovieFinder(MovieFinder movieFinder){   this.movieFinder=movieFinder;   }   }每个类只能有一个构造器被标记为required=true(每个类有很多的构造器,默认的required=false)   @Autowired 的必要属性,建议使用@Required注解   ***在service的实现类和dao的实现类上加上@Service和@Repository注解   测试方法   public void test(){   InjectionService service = super.getBean("injectionServiceImpl")因为没有指定bean的名称,所以默认的名称是实现类的首字母小写   }   注入方式1:只有一个@Autowired注解   @Autowired   private InjectionDAO injectionDAO;   public void save(String a){   injectionDAO.save(a);   }     注入方式2:把@Autowired注解放在set方法上   private InjectionDAO injectionDAO;   @Autowired   public void setInjectionDAO(InjectionDAO injectionDAO){   THIS.injectionDAO=injectionDAO;   }     注入方式3:把@Autowired注解放在构造方法上   private InjectionDAO injectionDAO;   @Autowired   public InjectionServiceImpl(InjectionDAO injectionDAO){   this.injectionDAO=injectionDAO;   }       可以使用@Autowired注解那些中所周知的解析依赖性接口,比如BeanFactory,ApplicationContext,Environment,ResourceLoader,   ApplicationEventPublisher,and MessageSource   public class MovieRecommender{   @Autowired   private ApplicationContext context; 标注完可以直接使用了     public MovieRecommender(){     }   }   可以通过添加注解给需要该类型的数组(set,list)的字段或方法,以提供ApplicationContext中的所有特定类型的bean   public Set<MovieCatalog> movieCatalogs;   @Autowired   public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs){   所有set的泛型中声明的这种bean,也包括这个泛型的子类,都放到了这个集合中去了   this.movieCatalogs=movieCatalogs;   }   可以用于装配key为String的Map   public Map<String,MovieCatalog> movieCatalogs;   @Autowired   public void setMovieCatalogs(Map<String,MovieCatalog> movieCatalogs){   这个key,即String表示的内容是所有的bean的id,value就是bean的对象   this.movieCatalogs=movieCatalogs;   }   如果希望(放在set,list或mao)数组有序,可以让bean实现org.springframework.core.Ordered接口或使用@Order注解     @Autowired 是由Spring BeanPostProcessor处理的,所以不能再自己的BeanPostProcessor或BeanFactoryPostProcessor类型   应用这些注解,这些类型必须通过XML或者Spring的@Bean注解加载;这样会产生循环依赖     数据及Map的自动注入   创建一个接口,两个实现类,在两个接口上面加上@Component注解;然后创建一个测试类,这个测试类也用@Component注解   然后在这个测试类里面写上下面的方法,在junit测试即可,打印了两个实现类的名字   @Autowiried 这个东西确实能把接口的两个实现类放到list里面   private List<BeanInterface> list;   public void say(){   if(null!=list&&list.size()!=0){   for(BeanInterface bean:list){   System.out.println(bean.getClass().getName());   }   }else{   System.out.println("空的");   }   }   @Autowiried   private Map<String,BeanInterface> map; 这个String是bean的id   if(map!=null&&map.size()!=0){   for(Map.Entry<String,BeanInterface> entry:map.entrySet()){   System.out.println(entry.getKey()+" "+entry.getValue().getClass().getName());   }   }else{   System.out.println("空的");   }   如果需要排序,则在两个实现类上面再加一个@Order(1),也可以写成@Order(value=1),因为是两个实现类,所以这两个实现类在list里面是有顺序的,若第一个实现类加上@Order(1)则表示第一个实现类   是list的第一个元素,若@Order(2)则表示这是list的第二个元素,但是这个order只对数组(set,list)有效,对map无效,即map的顺序不会变       @Qualifier 注解    1:按类型自动装配可能多个bean实例的情况,也可以使用Spring的@Qualifier注解缩小范围(或指定唯一),也可以用于指定单独的构造器参数或方法参数   2:可用于注解集合类型变量     public class MovieRecommender{     @Autowiried   @Qualifier("main") 可以用在成员变量和方法上   private MovieCatalog movieCatalog;如果有多个MovieCatalog,指定使用bean的id为main的这个类   }   用在方法上   public class MovieRecommender{     private MovieCatalog movieCatalog;   private CamerDao CamerDao;   @Autowiried  指定要注入bean的id为main的这个类   public void prepare(@Qualifier("main")MovieCatalog MmovieCatalog,CamerDao CamerDao){   this.movieCatalog=movieCatalog;   this.CamerDao=CamerDao;   }   }   也可以在配置文件中使用Qualifier,即在xml中配置   <bean class="com.zir.XXXXX">   <qualifer value="main"/>   </bean>   1:如果通过名字进行注入,主要使用的不是@Autowired(即使在技术上能够通过@Qualifier指定bean的名字),替代方式是使用JSP-250标准的@Resource注解,她是通过其独特的名称来   定义来识别特定的目标(这是一个与所声明的类型是无关的匹配过程)   2:因语义差异,集合或Map类型的bean无法通过@Autowired来注入,因为没有类型匹配到这样的bean,为这些bean使用@Resource注解,通过唯一名称引用集合或Map的bean   3:@Autowired适用于fields(字段),constructors(构造器),multi-argument methods(多参数的方法)这些允许在参数级别使用@Qualifier注解缩小范围的情况   4:@Resource适用于成员变量,只有一个参数的setter方法,所以在目标是构造器或一个多参数方法时,最好的方法时使用qualifiers   定义自己的qualifier注解并使用   @Qualifier   public @interface Gers{   String value();   }   使用   public class MovierUser{   @Autowiried   @Gers("Action")   private MovieCatalog MmovieCatalog;   private MovieCatalog two;     @Autowiried    public void prepare(@Gers("main")MovieCatalog two){   this.two=two;   }   }   在xml中也可自定义注解   <bean class="com.zir.AA">   <qualifer type="Gener" value="main"/>   </bean>   <bean class="com.zir.AA">   <qualifer type="com.Gener" value="comdy"/>   </bean>  */
转载请注明原文地址: https://www.6miu.com/read-1150420.html

最新回复(0)