繁体   English   中英

Java AOP在构造对象时设置字段值

[英]Java AOP set field value while constructing object

我正在使用 Spring 和 Java 8。我想创建一个方面或类似的东西,在对象构造期间设置我的字段的值,构造函数 itsleft 验证该字段是否为空,因此必须相应地设置该值,是方面可能吗?

protected MyObject(TimeProvider timeProvider) {
        this.timeProvider = requireNonNull(timeProvider, " cannot be null");
        requireNonNull(someField, "someFieldcannot be null");

在这里你可以看到 someField 在创建过程中是必需的,并且没有在构造函数的字段列表中指定。 那是我的具体情况。

问题中有些东西听起来不对,我会解释...

Spring AOP 确实允许创建将包装 Spring bean 的方面。 它们与非 spring 管理的对象完全无关。

现在如果你在谈论 Spring Bean: MyObject那么 spring 将创建这个对象的实例并注入TimeProvider - 另一个 bean。 如果此TimeProvider不存在,则 spring 上下文将无法启动,这正是您要实现的目标。 您已经在使用构造函数注入,所以只要MyObject是一个 spring bean,这应该可以工作。 显然,在这种情况下,您不需要任何方面,spring 将为您完成所有工作。

或者,如果MyObject不是 spring bean,那么 spring-aop 就如我所解释的那样完全无关紧要。

可以更深入地分析 Spring AOP 的真正工作原理,您会意识到它们并没有完全像这样进行验证,但是同样,这是比回答这个问题所需的更高级的讨论

您可以使用BeanFactory

  1. 创建给定类的新(非单例)实例 - 将为您完成注入
  2. 对已经存在的对象执行注入。

在这两种情况下,setter/field 上的@Autowire + @NotNull都可以解决问题。

检查https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/config/AutowireCapableBeanFactory.html#autowireBean-java.lang.Object-例如或任何其他变种。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM