不理解 ioc java 行为

don't understand ioc java behavior

我尝试在没有 xml 的情况下使用 IoC。但我不明白为什么@Autowired 在第一种情况下工作,而在第二种情况下不起作用: 我有 3 个 classes:

@Configuration 
public class DataSourceBean{
    @Bean
    public DataSource dataSource(){
        DataSource ds = new DataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://192.168.1.99:3306/somethink");
        ds.setUsername("devusr");
        ds.setPassword("root");
        ds.setInitialSize(5);
        ds.setMaxActive(10);
        ds.setMaxIdle(5);
        ds.setMinIdle(2);
        return ds;
    }
}


public class AbstractDao {
@Autowired
private DataSource dataSource;

    @Autowired
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public AbstractDao(){
        System.out.println("dataSource = " + dataSource);
    }
}

@RestController
public class PageController {
    @Autowired
    private DataSource dataSource;
    private AbstractDao dao;

    @RequestMapping(value = "/test" , method = RequestMethod.GET)
    public String homePage(){
//        System.out.println("$$ dataSource = " + dataSource);
        AbstractDao dao = new AbstractDao();
        return "";
    }
}

并且在 PageControllers 自动装配中正常工作,我看到它不为空。当我创建新的 AbstractDao 时,自动装配不起作用并且 dataSourse == null 。我尝试向 class AbstractDao 添加一些注释,但它不起作用。我究竟做错了什么?以及我必须如何正确地做到这一点?谢谢

在您的 PageController 中,您必须注入 AbstractDao。使用 new 运算符实例化对象时,自动装配不起作用。在您的 PageController 中试试这个:

@RestController
public class PageController {
    @Autowired
    private DataSource dataSource;
    @Autowired
    private AbstractDao dao;

    @RequestMapping(value = "/test" , method = RequestMethod.GET)
    public String homePage(){
//        System.out.println("$$ dataSource = " + dataSource);
        return "";
    }

}