springboot中,new無法注入的問題

有的class在創(chuàng)建的時候,需要一些外來的參數(shù)當(dāng)做構(gòu)造函數(shù)的參數(shù)。
在類上加@Component或者其他注解時,該類會交給spring來管理,自動創(chuàng)建對象。自己new出來的 Bean 是不會被spring托管的,包括new的Bean里面又需要注入其他對象或者需要注入配置文件中的屬性的時候,會出現(xiàn)空指針。

要解決問題,有兩種不一樣的思路。

  1. 不使用 new,而都是用spring來創(chuàng)建 Bean。
  2. 找到 Bean 并加載。

1 是比較容易理解,應(yīng)該也是較為推薦的方式。需要解決的問題其實是怎么規(guī)避自己new的問題。Spring的方式是使用
@Configuration 和 @Bean 注解來解決傳參的問題。

package SpringStudy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import SpringStudy.Model.Counter;
import SpringStudy.Model.Piano;
 
@Configuration
public class SpringConfig {
 
    @Bean
    public Piano piano(){
        return new Piano();
    }
    @Bean(name = "counter") 
    public Counter counter(){
        return  new Counter(12,"Shake it Off",piano());
    }
}

譬如就可以上面的Bean里面,就可以注入 Counter 這個 Bean 的對象了。
這樣就解決了沒有無參構(gòu)造函數(shù)的問題。

另一個方式就更為初級,就是如果有使用java的build模式創(chuàng)建的對象,需要怎么注入。對于有些框架,可以將參數(shù)寫入properties文件里面,然后就可以直接注入了。
(如果死活不對可以嘗試mvn清空緩存,重啟idea之類的……)

2 就是參考enjoy_Day@csdn的解決方案,自己實現(xiàn) ApplicationContextAware 的方法。自己根據(jù)類的類型手動獲得加載后的bean即可。

@Component
public class GetBeanUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;
 
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (GetBeanUtil.applicationContext == null) {
            GetBeanUtil.applicationContext = applicationContext;
        }
    }
 
    /**
     * 返回ApplicationContext
     *
     * @return ApplicationContext
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
 
    /**
     * 返回bean
     *
     * @param beanName beanName
     * @return bean
     */
    public static Object getBean(String beanName) {
        return applicationContext.getBean(beanName);
    }
 
    /**
     * 獲取bean
     *
     * @param c c
     * @param <T> 泛型
     * @return bean
     */
    public static <T> T getBean(Class<T> c) {
        return applicationContext.getBean(c);
    }
 
    /**
     * 獲取bean
     * @param c c
     * @param  name 名稱
     * @param <T> 泛型
     * @return T 泛型
     */
    public static <T> T getBean(String name, Class<T> c) {
        return getApplicationContext().getBean(name, c);
    }
}

使用的時候

public class AreaInvadeAnalyzer extends Analyzer {
 
    private AreaInvadeMapper areaInvadeMapper =GetBeanUtil.getBean(AreaInvadeMapper.class);

    ....其他代碼省略

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容