spring 注解@Resource 和 @Autowired

来源:互联网 发布:淘宝上的桃胶是真的吗 编辑:程序博客网 时间:2024/05/16 17:56

1.@Resource有一个‘name’属性,缺省时,Spring 将这个值解释为要注射的 bean 的名字。换句话说,如果遵循by-name的语法,如下例:

 

Java代码  收藏代码
  1. <span>public class SimpleMovieLister {  
  2.   
  3.     private MovieFinder movieFinder;  
  4.   
  5.     @Resource(name="myMovieFinder")  
  6.     public void setMovieFinder(MovieFinder movieFinder) {  
  7.         this.movieFinder = movieFinder;  
  8.     }  
  9. }</span>  

 

 如果没有显式地给出名字,缺省的名字将继承于字段名或者 setter 方法名:如果是字段名,它将简化或者等价于字段名;如果是 setter 方法名,它将等价于 bean 属性名。下面这个例子使用名字 "movieFinder" 注射到它的 setter 方法:

 

Java代码  收藏代码
  1. <span>public class SimpleMovieLister {  
  2.   
  3.     private MovieFinder movieFinder;  
  4.   
  5.     @Resource  
  6.     public void setMovieFinder(MovieFinder movieFinder) {  
  7.         this.movieFinder = movieFinder;  
  8.     }  
  9. }</span>  

 

 重要的是他还可以在前面几种情况不满足的时候按类型来找:@Resource可以回退为与标准 bean 类型匹配


下面的例子有一个customerPreferenceDao字段,首先要查找一个名叫 “customerPreferenceDao” 的 bean,然后回退为一个原始类型以匹配类型CustomerPreferenceDao。"context" 字段将基于已知解决的依赖类型ApplicationContext而被注入。


 

Java代码  收藏代码
  1. <span>public class MovieRecommender {  
  2.   
  3.     @Resource  
  4.     private CustomerPreferenceDao customerPreferenceDao;  
  5.   
  6.     @Resource  
  7.     private ApplicationContext context;  
  8.   
  9.     public MovieRecommender() {  
  10.     }  
  11.   
  12.     // ...  
  13. }</span>  

 

 

 2.@Autowired默认是按byType的,然后才会退到按byName,和@Resource类似

 

@Autowired 注解可以用于“传统的”setter 方法,如下例:

 

Java代码  收藏代码
  1. public class SimpleMovieLister {  
  2.   
  3.     private MovieFinder movieFinder;  
  4.   
  5.     @Autowired  
  6.     public void setMovieFinder(MovieFinder movieFinder) {  
  7.         this.movieFinder = movieFinder;  
  8.     }  
  9.   
  10.     // ...  
  11. }  
 

这个注解也可以用于以属性为参数/多个参数的方法

Java代码  收藏代码
  1. public class MovieRecommender {  
  2.   
  3.     private MovieCatalog movieCatalog;  
  4.       
  5.     private CustomerPreferenceDao customerPreferenceDao;  
  6.   
  7.     @Autowired  
  8.     public void prepare(MovieCatalog movieCatalog, CustomerPreferenceDao customerPreferenceDao) {  
  9.         this.movieCatalog = movieCatalog;  
  10.         this.customerPreferenceDao = customerPreferenceDao;  
  11.     }  
  12.   
  13.     // ...  
  14. }  
 

@Autowired注解甚至可以用于构造器与字段:

 

Java代码  收藏代码
  1. public class MovieRecommender {  
  2.   
  3.     @Autowired  
  4.     private MovieCatalog movieCatalog;  
  5.       
  6.     private CustomerPreferenceDao customerPreferenceDao;  
  7.   
  8.     @Autowired  
  9.     public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {  
  10.         this.customerPreferenceDao = customerPreferenceDao;  
  11.     }  
  12.   
  13.     // ...  
  14. }  
 

也可以一种提供来自ApplicationContext的特殊类型的所有 beans,注解字段或者方法,例如:

 

Java代码  收藏代码
  1. public class MovieRecommender {  
  2.   
  3.     @Autowired  
  4.     private MovieCatalog[] movieCatalogs;  
  5.   
  6.     // ...  
  7. }  
 

这同样适用于集合类型:

Java代码  收藏代码
  1. public class MovieRecommender {  
  2.   
  3.     private Set<MovieCatalog> movieCatalogs;  
  4.       
  5.     @Autowired  
  6.     public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {  
  7.         this.movieCatalogs = movieCatalogs;  
  8.     }  
  9.   
  10.     // ...  
  11. }  
 

甚至是 Maps 也可以这样注解,只要这个 Map 的 key 类型为 String。这个 Map 的 values 应该是已知的类型,并且 keys 应该包含符合 bean 的命名: 

 

Java代码  收藏代码
  1. public class MovieRecommender {  
  2.   
  3.     private Map<String, MovieCatalog> movieCatalogs;  
  4.       
  5.     @Autowired  
  6.     public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {  
  7.         this.movieCatalogs = movieCatalogs;  
  8.     }  
  9.   
  10.     // ...  
  11. }  
 

 

在缺省情况下,当出现0个候选的 beans时自动连接将失败;缺省行为把连接方法,构造器,字段假设为 required 的依赖。这样的行为如下所示:

Java代码  收藏代码
  1. public class SimpleMovieLister {  
  2.   
  3.     private MovieFinder movieFinder;  
  4.   
  5.     @Autowired(required=false)  
  6.     public void setMovieFinder(MovieFinder movieFinder) {  
  7.         this.movieFinder = movieFinder;  
  8.     }  
  9.   
  10.     // ...  
  11. }  
 

@Autowired也能用于总所周知的“可解决的依赖”:BeanFactory接口,ApplicationContext接口,ResourceLoader接口,ApplicationEventPublisher接口,还有MessageSource接口。这些接口(还有它们的扩展,例如ConfigurableApplicationContext或者ResourcePatternResolver)将可以自动解决依赖,没有任何特殊必须的其它步骤需要。

 

Java代码  收藏代码
  1. public class MovieRecommender {  
  2.   
  3.     @Autowired  
  4.     private ApplicationContext context;  
  5.   
  6.     public MovieRecommender() {  
  7.     }  
  8.   
  9.     // ...  
  10. }  

原创粉丝点击