@Autowired自动装配原理

一、@Autowired自动装配  

        当我们在IDEA中不使用xml配置文件的时候,这时候我们就需要@Autowired注解,该注解的原理如下:

        1.在启动Spring IOC时,容器自动的装配一个AutowiredAnnotationBeanPostProcesspr后置处理器,当容器在扫描中扫描到@Autowired时,就会在IOC容器中自动的查找所需要的Bean对象;

        2.在使用@Autowired时,容器首先会查找对应类型的Bean对象,当查询结果是一个的时候,就直接进行装配。当查询到的结果不是唯一的一个时,@Autowired则会根据名称进行查找,当结果为空时,则会抛出异常。

二、使用方法

        建立一个三层模式,dao层、service层、controller层如下:

dao层:

public interface IUserDao {
    public void save();
}
public class UserDaoImp implements IUserDao{
    public void save() {
        System.out.println("=======dao的新增========");
    }
}

Service层

public interface IUserService {
    public void save();
}

@Autowired的使用分为以下几种:

1.用在字段上
@Autowired用在字段上时,表示Spring会对改字段进行匹配赋值,在Spring容器中查找(byType),找到能匹配到该字段的对象,然后进行赋值;如果未找到就出现异常。

public class UserServiceImp implements IUserService{
    @Autowired
    private IUserDao dao;
    public void save() {
        System.out.println("=========service的新增========");
        dao.save();

    }
}

2.用在set方法上
@Autowired用在字段上时,会找到改set方法对应的字段,然后其过程与其一致。

public class UserServiceImp implements IUserService{

    private IUserDao dao;

    //ByNmae/Bytype自动装配
    public void setDao(IUserDao dao) {
        this.dao = dao;
    }
    public void save() {
        System.out.println("=========service的新增========");
        dao.save();

    }
}

3.用在构造方法上
@Autowired用在构造方法上时,会找到改构造方法对应的所有字段,然后其过程与字段一致。

public class UserServiceImp implements IUserService{

    private IUserDao dao;

    //autowire="constructor" 按照类型自动装配
    public UserServiceImp(IUserDao dao) {
        this.dao = dao;
    }

    public void save() {
        System.out.println("=========service的新增========");
        dao.save();

    }
}

controller层

public interface IUserController {
    public void save();
}
public class UserControllerImp implements IUserController{

    private IUserService service;

    //ByNmae/Bytype自动装配
    public void setService(IUserService service) {
        this.service = service;
    }

    //autowire="constructor" 按照类型自动装配
    public UserControllerImp(IUserService service) {
        this.service = service;
    }

    public void save() {
        System.out.println("=========controller的新增==========");
        service.save();
    }
}

三、@Autowired 的自动装配分为:byType byName

1.byType:当容器内存在一个和指定的属性类型相同的bean时,那么将和这个属性自动的进行装配,当存在多个该类型的bean,将会抛出异常。

2.byName:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配,当我们根据byName进行自动装配时,就需要使用到@Qualifier注解来手动指定一个beanid来进行装配。

所以,@Autowired默认使用的是byType类型,但是对于多个实现类的情况下,@Autowired又支持再次通过byName进行识别。

以上是个人对于@Autowired自动装配的理解,希望对大家有所帮助,一起加油呀!


版权声明:本文为weixin_68286174原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。