不明白ioc java的行为

时间:2016-05-03 14:50:24

标签: spring inversion-of-control

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

@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 autowired不起作用和dataSourse == null。我尝试在AbstractDao类中添加一些注释,但它不起作用。我究竟做错了什么?以及我必须如何正确地做到这一点?感谢

1 个答案:

答案 0 :(得分:1)

在你的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 "";
    }

}