@Autowired的用法

560 阅读2分钟

@Autowired日常我们用来修饰成员变量进行依赖注入,但除此之外还有许多用法

@Autowired的用法

- 修饰成员变量进行DI
- 标注在实例方法(或者入参上都可以)
- 标注在setter方法上
- 标注在有参构造方法上
- 标注在有参构造方法入参上,可以省略

标注在实例方法(或者入参上都可以)

当@Autowired注解标注在方法上时,Spring容器在创建对象的时候,就会调用相应的@Autowired修饰的方法。如果标注的方法存在参数时,则方法使用的参数和自定义类型的值,需要从IOC容器中获取。

当我们标注在setter方法中,则可以进行依赖注入

@Autowired修饰testPig(),在实例化Pig的时候,会调用@Autowired修饰的方法,并且会从IOC中找出cat1的实例注入

@Component
public class Pig {
    private Cat1 cat1;

    public Cat1 getCat1() {
        return cat1;
    }

   
    public Pig setCat1(Cat1 cat1) {
        this.cat1 = cat1;
        return this;
    }
    @Autowired
    public void testPig(Cat1 cat1) {
         System.out.println("get cat1 name:" + cat1.getName());
        System.out.println("execute testPig......");
    }

    @Override
    public String toString() {
        System.out.println("execute Pig toString");
        return null;
        //return cat1.toString();
    }

}

标注在有参构造方法上

@Autowired修饰setCat1方法进行依赖注入cat1

@Component
public class Pig {
    private Cat1 cat1;

    public Cat1 getCat1() {
        return cat1;
    }
    
    @Autowired
    public Pig setCat1(Cat1 cat1) {
        System.out.println("execute setCat1......");
        this.cat1 = cat1;
        return this;
    }
    

    @Override
    public String toString() {
        System.out.println("execute Pig toString");
        return null;
        //return cat1.toString();
    }

}

标注在有参构造方法上

使用@Autowired注解标注在构造方法上时,构造方法中的参数对象也都是从IOC容器中获取的

@Component
public class Pig {
    private Cat1 cat1;

    public Cat1 getCat1() {
        return cat1;
    }

    @Autowired
    public Pig(Cat1 cat1){
        this.cat1 = cat1;
        System.out.println("调用了Pig的有参构造方法");
    }


    public Pig setCat1(Cat1 cat1) {
        System.out.println("execute setCat1......");
        this.cat1 = cat1;
        return this;
    }
    

    @Override
    public String toString() {
        System.out.println("execute Pig toString");
        return null;
        //return cat1.toString();
    }

}

标注在有参构造方法入参上,可以省略

如果Spring的bean只有一个有参构造方法,并且这个有参构造方法只有一个参数,并且这个参数是IOC容器中的对象,当@Autowired注解标注在这个构造方法的参数上时,我们可以将@Autowired注解省略。

@Component
public class Pig {
    private Cat1 cat1;

    public Cat1 getCat1() {
        return cat1;
    }

    public Pig(@Autowired Cat1 cat1){
        this.cat1 = cat1;
        System.out.println("调用了Pig的有参构造方法");
    }


    public Pig setCat1(Cat1 cat1) {
        System.out.println("execute setCat1......");
        this.cat1 = cat1;
        return this;
    }
    /*@Autowired
    public void testPig(Cat1 cat1) {
         System.out.println("get cat1 name:" + cat1.getName());
        System.out.println("execute testPig......");
    }*/

    @Override
    public String toString() {
        System.out.println("execute Pig toString");
        return null;
        //return cat1.toString();
    }

}

如何选择

image.png