public ICommonDao commonDao = null;
public List getAllDbTableName() {
return commonDao.getAllDbTableName(); // 運行時不報 NPE
}
ICommonDao 是接口,commonDao 在聲明處為 null,但運行時容器(Spring、Guice、Dagger 等)會在 Bean 初始化階段,通過反射或字節碼增強將具體實現類(如 CommonDaoImpl)的實例注入到該字段。
@Component/@Service 等註解的類。CommonDaoImpl 實例。@Autowired 或 @Inject 的 ICommonDao commonDao 字段,將實例賦值。「字段是 null 就不能調用」 —— 這是靜態視角。運行時容器已完成注入,實際引用指向真實對象。若在 main 方法或未托管容器的類中直接調用,確會拋 NPE。
final 字段、不可變、易測試),而非字段注入。I 前綴,現代風格直接用 CommonDao,實現類加 Impl 後綴。@RequiredArgsConstructor(onConstructor_ = @Autowired) (Lombok) 簡化構造器注入樣板代碼。