【Spring学习笔记四】-自动装配Bean

上一次博客写到Spring有两种依赖注入的方式,设值注入和构造注入,详情点击这里:http://blog.csdn.net/kevin_zhai/article/details/52184901。上述两种注入方式的例子,都是通过XML配置文件来装配Bean的。除此之外,Spring提供了一种更加方便的装配Bean的方法,即利用@Autowired注解进行自动装配。
一、@Autowired基本使用

还是以上一次博客的代码为例。在上次的博客中,是通过配置文件来装配的。下面换成自动装配Bean。首先,在Person实现类Chinese中去掉axe的set方法,并加上@Autowired标注。代码如下:

public class Chinese implements Person {
	
	@Autowired
	private Axe axe;  
	@Override
	public void useAxe() {
		System.out.println(axe.chop());
	}
}

Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。同时,在XML配置文件中,可以去掉标签。配置文件如下:


 
          
      
       
      
      
    

运行结果:石斧砍柴好慢
那么Spring是怎样去自动装配Bean的呢?原来当Spring容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有@Autowired 注释时就找到和其匹配的 Bean,并注入到对应的地方中去。
二、自动装配查找模式
上面讲到Spring会自动去查找和@Autowired注解匹配的Bean,那么它是按照什么来查找的呢?其实,它是有两种查找模式,分别是按变量类型和按指定名称来查找。在默认的情况下,会按照变量类型来查找。在上面的实例中,spring容器在启动时,会去查找与axe类型相同的Bean。axe的类型是com.ceshi.service.Axe,所以当扫描到id为stoneAxe的Bean时,判断它们类型一致,会自动加载Bean进来。
但是,如果Spring上下文中存在不止一个Axe类型的Bean时,就会出现异常。此时,可以使用@Qualifie注解来给变量指定名称,当Spring容器去扫描Bean时,只有Id和指定名称匹配时,才能够正确装配Bean。
还是以上面例子为例,在Chinese加入@Qualifie注解,代码如下:

public class Chinese implements Person {
	
	@Autowired
	@Qualifier("axe")  //指定名称
	private Axe axe;  
	@Override
	public void useAxe() {
		System.out.println(axe.chop());
	}
}
如果XML文件不做任何修改的话,由于没有与指定名称相匹配的Bean,会出现BeanCreationException异常。对XML文件做以下修改:


 
          
      
       
      
  

    

在没有匹配到对应的Bean时,如果想避免异常的出现,可以将@Autowired的required属性设置为false。对Chinese做如下修改:

public class Chinese implements Person {
	
	@Autowired(required = false)  //设置属性为false
	@Qualifier("axe")
	private Axe axe;  
	@Override
	public void useAxe() {
		System.out.println(axe.chop());
	}
}
将required属性设置为false时,Spring会尝试执行自动装配,但是如果没有匹配的Bean的话,Spring将会让这个Bean处于未装配的状态。但是,如果在代码中没有进行null检出的话,这个处于未装配状态的属性有可能会出现NullPointerException异常。
三、@Autowired和@Component共同使用
虽然用了@Autowired标注之后,省去了setter方法,但是还是需要在XML中声明Bean。那有没有更简单的方法呢,答案是肯定的。我们可以将@Component与@Autowired标注配合使用。@Component的作用是将类自动注册到Spring容器中,相当于配置文件中的
还是上面的例子,在stoneAxe类加上@Component标注,如下:
@Component("stoneAxe")
public class StoneAxe implements Axe{

	@Override
	public String chop() {
		return "石斧砍柴好慢";
	}
}
然后,要修改配置文件。要加入下面配置: ,这个配置是用来引入Spring自动扫描时的包。同时,要把原先声明的Bean去掉。修改后配置文件如下:

 

    
    
    


     
 
这样,当Spring启动时,会扫描整个com.ceshi包,当发现有@Component标注的类时,就会将它自动加入到Spring容器中。这样,@Autowired进行自动装配时,就可以找到对应的Bean了。

你可能感兴趣的:(Spring框架,从零开始学习spring框架)