有的class在創(chuàng)建的時候,需要一些外來的參數(shù)當(dāng)做構(gòu)造函數(shù)的參數(shù)。
在類上加@Component或者其他注解時,該類會交給spring來管理,自動創(chuàng)建對象。自己new出來的 Bean 是不會被spring托管的,包括new的Bean里面又需要注入其他對象或者需要注入配置文件中的屬性的時候,會出現(xiàn)空指針。
要解決問題,有兩種不一樣的思路。
- 不使用 new,而都是用spring來創(chuàng)建 Bean。
- 找到 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);
....其他代碼省略
}