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)
以上!