天天看点

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)
           

以上!