/**
@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>
*/