所有的春豆都是代理的吗?

问题描述 投票:0回答:1

我想高屋建瓴地了解一下Spring代理的工作原理。为什么我的应用中应该使用 "API接口&Impl Bean "模式还是只使用 "Bean类 "模式。我看了不少SO的答案,但都是很老的答案,大多是有关 Java 7与Spring 3.x 我相信。我想知道在2020年,什么是仍然相关的是 Java 11+与Spring 5.x (Spring Boot 2.x)。. 有没有什么 "最佳实践 "可以遵循?

此外,随着 @FunctionalInterface,如果我的bean实现了类似于 Consumer, Function, Predicate 和类似的,有意义吗?@Autowire/@Inject Consumer<A> 而不是 Foo 哪儿 Foo implements Consumer<A>. 这只是一个例子,我可能也会使用我自己的Functional Interfaces(有或没有Generics)。

考虑到以上所有情况,我还想知道是否每个Spring创建的Bean都会被代理,或者说如果不需要的话,Spring是否会创建Bean而不进行代理。例如,如果一个类只是简单地注解为 @Component 并直接注入,没有其他注释或代理要求,那么spring还会为这个bean创建代理吗?

一些问题,我已经看过了。

2020年5月7日更新。

在阅读了更多的文章、评论和答案之后,我想谈谈我心中的确切问题。让我们考虑一下下面的例子。我有一个类 FooAnotherFoo.

@Component
@RequiredArgsConstructor  // From lombok
class Foo extends Consumer<Bar> {
    // Some private final Fields

    public void accept(Bar bar) {
        // do something
    }

    // Some private methods, no other public method
}

备选方案一:

@Component
@RequiredArgsConstructor  // From lombok
class AnotherFoo {

    private final Foo foo;

    // Use foo only to call foo.accept(bar)
}

方案二:

@Component
@RequiredArgsConstructor  // From lombok
class AnotherFoo {

    private final Consumer<Bar> foo;

    // Use foo only to call foo.accept(bar)
}

在上面的案例中,如果我们用豆子的代理权来谈的话... Foo 到了春天,什么才是最好的写法呢?AnotherFoo - 选择1备选方案2 或者说,这与如何 AnotherFoo 是写的。我没有使用 @EnableAspectJAutoProxy 的任何地方,所以这里的东西都是默认运行的,很可能类似于 本苏题A2的案例3.

额外的问题。 另外,如果CGLib在这里被用于代理,我知道它将操纵字节码来创建代理。在一些文章中,我读到这种方法会带来安全威胁。我想知道这是否真的是一个问题&amp;如果是,这将如何影响应用程序?

java spring spring-boot spring-aop
1个回答
0
投票

如果你想了解Spring代理的工作原理,我有两个来源给你。

  • 我的答案 此处 其中用示例代码从概念上解释了Spring代理的工作原理(但不使用Spring,只是简单的POJOs)。
  • 在Spring手册中,第 "了解Spring代理"
© www.soinside.com 2019 - 2024. All rights reserved.