当前位置: 首页 > 知识库问答 >
问题:

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

梁丘成和
2023-03-14

我试图获得一个关于Spring代理如何工作的高级视图。为什么我应该在我的应用程序中使用“API接口&Impl bean”模式或者只使用“bean类”模式。我读了不少这样的答案,但它们都很古老,我相信大多数与Java7和Spring3.x相关。我想知道在2020年,Java11+与Spring5.x(Spring Boot2.x)仍然有什么关系。是否有“最佳做法”可循?

此外,由于@functionalinterface的可用性,如果我有实现consumerfunctionpredicate等接口的bean,那么使用@autowire/@injectconsumer代替foo是否有意义,因为foo实现consumer。这只是一个例子,我也可能使用我自己的函数接口(带或不带泛型)。

考虑到上述所有内容,我还想知道Spring创建的每个bean是否都是代理的,或者如果实际上不需要的话Spring创建bean而不代理它们。为了前任。如果一个类只是用@component注释并直接注入,没有其他注释或代理要求,那么spring还会为这个bean创建代理吗?

我已经看过的一些问题:

2020年5月7日更新:

@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)
}

附加问题:另外,如果CGLib在这里/任何地方用于代理,我理解它会操纵字节代码来创建代理。在一些文章中,我可以读到这种方法会带来安全威胁。我想知道这是否真的是一个问题&如果是的话,这会对应用程序产生怎样的影响?


共有1个答案

束敏学
2023-03-14

如果您想了解Spring代理是如何工作的,我有两个来源供您参考:

  • 这里是我的答案,它用示例代码(但不使用Spring,只是简单的POJO)从概念上解释了Spring代理是如何工作的。
  • Spring手册,“了解Spring代理”一章
 类似资料:
  • 问题内容: 春季版 :3.2.4.RELEASE和3.2.9.RELEASE Mockito版本 :1.8.5 我一直在尝试将H2测试引入一个用于集成测试的旧项目,并且遇到了一些问题。由于事务传播的方式,我需要模拟一个自动装配的类。我以前做过,但是现在遇到了严重的问题。初始化测试时将引发以下错误消息: org.springframework.beans.factory.BeanCreationEx

  • 我不明白为什么我所有的bean在控制器中都是空的。我知道这是一个常见的问题,但我不是用实例化对象。 控制器: 当我请求我在上收到一个NullPointerException。 我的服务 网络配置 主要的 启动应用程序时,我可以在日志中看到bean实际上正在自动连接到控制器: 所以我不明白为什么当我试图访问控制器中的时,它是空的。我不会在任何地方用实例化控制器。 裁剪异常 编辑: 我已经删除了网页。

  • 默认情况下,Spring创建的Bean是singleton。它们是线程安全的,因为它们是无状态的。当我们希望Spring创建有状态Bean时,我们需要为Bean定义使用原型范围。我们需要为他们解决线程安全问题。当原型Bean注入所有无状态Bean时,它们都会受到污染。所以,我无法想象我们可以在哪里使用原型范围。你能给出一些我们可以/需要使用springbean原型的典型场景吗?还有,我们如何避免对

  • 问题内容: 更新:添加Maven依赖关系 * 更新:通过添加 Maven依赖关系 解决了该错误* 美好的一天。我有AplicationContext.xml的这一部分 Maven Dep春季和冬眠 但是,当我启动我的应用程序时,它告诉我这个错误 但是我正在使用hibernate4。这是什么魔术?=)我已经尝试过重新部署应用程序,但是结果是一样的 问题答案: 您已经错过了Spring-ORM模块:

  • 我知道这个问题听起来很幼稚,但我对web应用程序中bean的范围感到困惑。我知道,对于每个请求,容器都会生成一个新线程,类似地,对于spring web应用程序,每个请求都会生成一个新线程,那么为什么建议将我的控制器、服务定义为singleton,这些bean的范围不应该是prototype吗,因为每个请求(即线程)都有其自己的控制器实例和要使用的服务。 请开导我。

  • Java-Spring-骆驼 我想用服务列表发起骆驼路线。 想做下面的事情,但是< code>from方法似乎不是一个生产者。如何定义动态生产者?