我想高屋建瓴地了解一下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日更新。
在阅读了更多的文章、评论和答案之后,我想谈谈我心中的确切问题。让我们考虑一下下面的例子。我有一个类 Foo
和 AnotherFoo
.
@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在这里被用于代理,我知道它将操纵字节码来创建代理。在一些文章中,我读到这种方法会带来安全威胁。我想知道这是否真的是一个问题&;如果是,这将如何影响应用程序?
如果你想了解Spring代理的工作原理,我有两个来源给你。