天天看點

@autowired、@autowired(required = false)注解放在方法上的作用詳解

@autowired

用于測試的實體類User,并将這個類注入到Spring容器中,為@autowired注解放在方法做前提工作

@Component
public class User {

    private String name = "張三";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
           

這是一個配置類,SpringBoot啟動後會加載這個配置類,把@autowired放在方法上

// 測試一
@Configuration
public class UserConfig {

    @Autowired
    public void getName(User user){
        System.out.println("主動注入的User:"+user.getName());
    }
}
           

啟動SpringBoot後控制台列印(測試一):

@autowired、@autowired(required = false)注解放在方法上的作用詳解
// 測試二
@Configuration
public class UserConfig {

    @Autowired
    public void getName(){
        System.out.println("主動注入的User:.......");
    }
}
           

啟動SpringBoot後控制台列印(測試二):

@autowired、@autowired(required = false)注解放在方法上的作用詳解

結論:@autowired注解放在方法上,如果方法沒有參數,spring容器會在類加載完後執行一次這個方法;如果方法中有參數的話,還會從容器中自動注入這個方法的參數,然後執行一次這個方法。

@autowired(required = false)

測試一

@Component
public class User {

    private String name = "張三";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
           
// 測試一
@Configuration
public class UserConfig {

    @Autowired(required = false)
    public void getName(User user){
        System.out.println("主動注入的User:"+user.getName());
    }
}
           

測試一結果:

@autowired、@autowired(required = false)注解放在方法上的作用詳解

測試二

不将User注入到容器中

public class User {

    private String name = "張三";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
           
@Configuration
public class UserConfig {

    @Autowired(required = false)
    public void getName(User user){
        System.out.println("主動注入的User:"+user.getName());
    }
}
           

測試二結果:

沒有執行getName方法

@autowired、@autowired(required = false)注解放在方法上的作用詳解

結論:@autowired(required = false)作用在方法上,當方法有參數時,如果IOC容器中有方法參數的對象,那麼會自動注入并執行方法一次;如果IOC容器中沒有方法的參數對象,那麼這個方法不會被執行,不管這個方法上有多少個參數,隻要有一個參數對象是IOC容器中沒有的,這個方法便不會被執行。如果方法沒有參數,那麼會被執行一次。

繼續閱讀