天天看點

Java | kotlin 手動注入bean,解決lateinit property loginService has not been initialized異常

kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized

注解類加載延遲導緻的異常

解決方法一:工廠模式

建一個工廠類,如UserServiceFactory,使用該方法
  • java版:
public abstract class UserServiceFactory {

    private static UserService userService = new UserServiceMemoryImpl();

    public static UserService getUserService() {
        return userService;
    }
}
           
  • kotlin版:
abstract class ServiceFactory {
    companion object {
        private val loginService: LoginService = LoginService()

        open fun getUserService(): LoginService {
            return loginService
        }
    }
}
           

解決方法二:手動注入Spring上下文,擷取bean

實作ApplicationContextAware接口
建立一個實體類并實作

ApplicationContextAware

接口,重寫接口内的

setApplicationContext

方法來完成擷取

ApplicationContext

執行個體的方法
  • java版:
private ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  this.applicationContext = applicationContext;
}

// 使用
Person person = getApplicationContext().getBean(Person.class)
           
  • kotlin版:
private lateinit var ctx: ApplicationContext
override fun setApplicationContext(applicationContext: ApplicationContext) {
   this.ctx = applicationContext
}

// 使用
val person = ctx.getBean(Person::class.java)
           

以上!