簡體   English   中英

我如何在構造函數中為未經過Spring修飾的對象使用autowired參數?

[英]How can I use autowired parameter in a constructor for an object that isn't Spring-ified?

我有一個問題,我的某些代碼使用Spring Bean,而某些常規的POJO。

我試圖將一個bean(數據源)注入到POJO的構造函數中(POJO是一個dao)。

代碼大致如下所示:

public class MyAppClass {
    public static void main(String[] args) {
        // xxx
                AnnotationConfigApplicationContext context = loadSpringConfiguration();
        SetupDaos setupDaosInstance = new SetupDAOs();
        setupDaosInstance.setupDAOs(); // This is where DAO constructors live
    }

public class SetupDAOs {
    public static DaoType dao1; 
    // There is a reason why dao1 isn't a bean, that aren't obvious from minimal example
    // Please don't post answers saying 
    // "you have an X-Y problem, convert dao1 into a bean"

    public void setupDAOs() {
        dao1 = new DaoType(); // We don't pass datasource here, 
    }
}

public class DaoType extends JdbcTemplate {
    // This is where trouble starts
    @Autowired ComboPooledDataSource dataSource;

    // PROBLEM! Inside the constructor, "dataSource" isn't autowired yet!
    public DaoType() {
        super();
        setDataSource(dataSource);
    }
}       

// And in one of the Bean config classes
    @Bean
    public ComboPooledDataSource loadDataSource() throws Exception {

上面的代碼不起作用(dataSource為null ),因為根據此問答

自動裝配(沙丘評論的鏈接)在構造對象之后發生。

如果“ dao1”必須保留為POJO而不是Spring創建的bean,我是否可以通過某種方式正確地將自動裝配的bean“ dataSource”注入其構造函數?

這樣傳遞DataSource應該可以:

public static void main(String[] args) {
    AnnotationConfigApplicationContext context = loadSpringConfiguration();
    Datasource dataSource = context.getBean(DataSource.class);
    SetupDaos setupDaosInstance = new SetupDAOs(dataSource);
    setupDaosInstance.setupDAOs();
}

參見https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/support/AbstractApplicationContext.html#getBean-java.lang.Class-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM