java postconstruct_java - 为什么要使用@PostConstruct?

请考虑以下情形:

public class Car {

@Inject

private Engine engine;

public Car() {

engine.initialize();

}

...

}

由于Car必须在字段注入之前进行实例化,因此注入点引擎在构造函数执行期间仍为null,从而导致NullPointerException。

这个问题可以通过Java构造函数注入的JSR-330依赖注入或Java @PostConstruct方法注释的JSR 250 Common Annotations来解决。

@PostConstruct

JSR-250定义了一组通用的注释,这些注释已包含在Java SE 6中。

PostConstruct注释用于需要的方法   在完成依赖注入以执行任何操作之后执行   初始化。 必须在放入类之前调用此方法   投入使用。 所有类都必须支持此注释   支持依赖注入。

JSR-250 Chap。 2.5 javax.annotation.PostConstruct

@PostConstruct注释允许在实例化实例并且已执行所有注入之后定义要执行的方法。

public class Car {

@Inject

private Engine engine;

@PostConstruct

public void postConstruct() {

engine.initialize();

}

...

}

代码不是在构造函数中执行初始化,而是移动到使用@PostConstruct注释的方法。

后构造方法的处理很简单,只需查找使用@PostConstruct注释的所有方法并依次调用它们即可。

private void processPostConstruct(Class type, T targetInstance) {

Method[] declaredMethods = type.getDeclaredMethods();

Arrays.stream(declaredMethods)

.filter(method -> method.getAnnotation(PostConstruct.class) != null)

.forEach(postConstructMethod -> {

try {

postConstructMethod.setAccessible(true);

postConstructMethod.invoke(targetInstance, new Object[]{});

} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {

throw new RuntimeException(ex);

}

});

}

必须在实例化和注入完成后执行后构造方法的处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值