依赖注入@autowired注解的花样玩法

1、发现DelegatingWebMvcConfiguration源码中方法上有使用@autowired(required = false),今天针对@Autowired在方法上的作用,做下研究。

@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
    private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

    @Autowired(required = false)
    public void setConfigurers(List<WebMvcConfigurer> configurers) {
        if (!CollectionUtils.isEmpty(configurers)) {
            this.configurers.addWebMvcConfigurers(configurers);
        }
    }
}

2、先说结论

2.1、@Autowired用在属性上

@RestController
public class TestController {
    @Autowired
    private Person person;
}

   2.2、@Autowired用在构造方法上,有如下方式

@Component
public class Person {
    private Dog dog;

    public Person() {
    }
    //当有多个构造函数时,可以使用Autowired注入参数
    @Autowired
    public Person(Dog dog) {
        this.dog = dog;
    }
}
@Component
public class Person {
    private Dog dog;
    //当只有一个有参构造函数时,Autowired可以省略
    public Person(Dog dog) {
        this.dog = dog;
    }
}

2.3、Autowired用在普通方法

@Component
public class Person {
    private String name;
    private Dog dog;
    public Person() {
    }
    //Autowired可以放在普通方法,实现依赖注入
    @Autowired
    public void setMyDog(Dog dog) {
        this.dog = dog;
    }
}

2.4、@Autowired和@Bean同时使用在方法上

@Configuration
public class AutoWiredConfig {
    //Autowired和@Bean同时使用实现容器bean注入到方法参数中
    @Bean
    public Person person(@Autowired Dog dog){
        return new Person(dog);
    }
    @Bean
    public Dog dog(){
        return new Dog();
    }
}
@Configuration
public class AutoWiredConfig {
    //Autowired和@Bean同时使用实现容器bean注入到方法参数中
    @Bean
    @Autowired
    public Person person(Dog dog){
        return new Person(dog);
    }
    @Bean
    public Dog dog(){
        return new Dog();
    }
}
@Configuration
public class AutoWiredConfig {
    //@Bean实现容器bean注入到方法参数中
    @Bean
    public Person person(Dog dog){
        return new Person(dog);
    }
    @Bean
    public Dog dog(){
        return new Dog();
    }
}

  2.5、@Autowire在方法上时

  如果方法没有参数,则容器会在类加载完之后执行一次这个方法。

  如果方法有参数,还会从容器中自动注入这个方法的参数,然后执行一次这个方法

  2.6、@autowired(required = false)在方法上时

  如果方法没有参数,则容器会在类加载完之后执行一次这个方法。

  如果方法有参数,并且IOC容器存在方法的参数对象,那么会自动注入并执行方法一次,如果IOC容器中没有方法的参数对象,那么这个方法不会被执行。

posted @ 2022-10-24 18:02  西风51668  阅读(194)  评论(0)    收藏  举报