【问题标题】:How should I use @Configurable to automatically assemble beans into common objects in springbootspring boot中如何使用@Configurable自动将bean组装成常用对象
【发布时间】:2021-02-19 07:35:17
【问题描述】:

我现在需要的是一个普通的抽象类及其子类。这些 bean 需要注入到抽象类中。它们只是普通的对象,但有一些 ioc 管理的 bean 来执行操作。我需要将它们序列化为redis。保存,然后从redis中取出来反序列化,但是取出时这些bean都变成了null。本来想手动一一注入,但可能有嵌套问题。我不能那样做。不递归配置bean很麻烦,所以找了很多解决办法,找到了@Configurable注解,但是想用的时候,没有完整的文档,很难,需要配置aspectJ ,LTW,aspectj-maven -plugin,重启的时候还需要用-javaagent:/path/to/spring-instrument.jar,完全糊涂了,不知道怎么用,太麻烦了,找不到完整的@Configurable用例,我根本不想用-javaagent:/path/to/spring-instrument.jar,发现很多类似的文章,甚至提到了bytebuddy。但是它们不全面,不能使用,这让我很头疼

我想这样使用它

@Data
@NoArgsConstructor
@Slf4j
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
@JsonSubTypes(
        value = {
            @JsonSubTypes.Type(value = SinglePipeLink.class),
            @JsonSubTypes.Type(value = SequencePipeLink.class),
            @JsonSubTypes.Type(value = SplitFlowPipeLink.class),
            @JsonSubTypes.Type(LoopPipeLink.class)
        })
@Accessors(chain = true)
@Configurable(autowire = Autowire.BY_NAME, preConstruction = true)
public abstract class BasePipeLink implements Serializable {
    private static final long serialVersionUID = -5308571029549664750L;
    protected String copyFrom;

    @Resource @JsonIgnore protected transient RedisService redisService;
}

【问题讨论】:

  • 请提供MCVE,最好是 GitHub 上的 Maven 项目。这个问题没有足够的信息来回答它。
  • 友情提示:请按要求提供更多信息。谢谢。
  • 我知道了,谢谢
  • 您在将近一年后才回答,然后答案就很神秘了。有人可以这么懒吗?你得到了什么?
  • 对不起,我换了工作忘记了

标签: spring-boot aspectj aspectj-maven-plugin


【解决方案1】:

我最终通过 Bytebuddy 启用了 LTW

@EnableSpringConfigured
@EnableAspectJAutoProxy
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED)
public class Application {
    public static void main(String[] args) {
        // Get access to an instrumentation instance
        Instrumentation instrumentation = ByteBuddyAgent.install();
        // Activate AspectJ weaver
        Agent.agentmain("", instrumentation);
        // Save instrumentation instance for later use
        InstrumentationSavingAgent.agentmain("", instrumentation);
        SpringApplication.run(Application.class, args);
    }
}

【讨论】:

  • 让我为其他可能无法自动理解的人澄清一下:您在这里使用的不是 Byte Buddy (BB) 本身,而是一个名为 byte-buddy-agent 的小工具库,它完全独立于 BB 并有助于想要在没有-javaagent 的情况下动态附加代理的人这样做,隐藏了复杂性。该库小而有用,但它是您项目的另一个依赖项。
  • 仅供参考,自 1.8.7 以来的 AspectJ 编织器具有动态附加到 JVM 的能力,请参阅 read-me。因为这是我对 AspectJ 的第一个贡献,所以我至今仍记得。 ?顺便说一句,我回答了一个相关问题here。但是,当然,您使用额外工具库的方法也是有效的,并且需要更少的样板代码。
  • 是的,你说的没错,就是使用aspect,但是因为不想在启动命令前使用Java-Agent,所以我通过核心的byte-buddy-agent解决问题还是出在启用的LTW使用上。,结果我给出了简化的aspectj,谢谢你的回答。
猜你喜欢
  • 2011-06-09
  • 1970-01-01
  • 2021-07-02
  • 2012-08-11
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
相关资源
最近更新 更多