当前位置: 首页 > 面试题库 >

Spring @Configuration如何缓存对bean的引用

班凌
2023-03-14
问题内容

使用基于Java的配置时,Spring如何防止再次调用bar()?

我想知道编译时注释处理还是通过代理方法?

@Configuration
public class AppConfig {

  @Bean
  public Foo foo() {
      return new Foo(bar());
  }

  @Bean
  public Foo foo2() {
      return new Foo(bar());
  }

  @Bean
  public Bar bar() {
      return new Bar();
  }
}

问题答案:

假设您创建的上下文有点像

AnnotationConfigApplicationContext context =
    new AnnotationConfigApplicationContext(AppConfig.class);

由于@Configuration,Spring将创建一个类型的bean
AppConfig并对其进行代理,因为它具有@Bean方法。你应该检查出ConfigurationClassEnhancer的实施细则。

这些方法不会直接在对象上调用。显然,它们不能,因为在编译时不知道它们。通过在代理服务器上进行反射来调用它们。

所以当你有

@Bean
public CustomBean foo() {
    return new CustomBean(bar());
}

相当于

@Bean
public CustomBean foo() {
    return new CustomBean(this.bar());
}

this指的是其高速缓存方法调用,并立即如果它之前被调用它返回它的结果的代理。



 类似资料:
  • 我有一个属性类: 我在@Configuration类中启用配置属性,如下所示: 在同一个类(“SomeAutoConfiguration”)中,我想创建另一个bean,具体取决于SomeProperties中的list属性是否为空。我想我可以将@ConditionalExpression与以下SpEl结合使用: SpEl是正确的,但我无法获得包含我的属性的bean。使用上面的表达式,我遇到了 EL

  • 问题内容: 我有一个代码: 我期望一旦启动应用程序BeanSample.getSomeBean(),然后SomeBean将开始由“ someBean”提供。 现在我有一个错误: 没有定义名为“ someBean”的bean 实际上,我有点不明白应该使用哪个应用程序上下文来提取我的豆子? 关于@Configuration : 有什么原因,为什么我应该在这里使用@Configuration注释?(通过

  • 问题内容: 我正在尝试在非Spring代码中获取Spring定义的Hibernate Configuration和SessionFactory对象。以下是我的applicationContext.xml文件中的定义: 码: 如果现在调用getBean(“ sessionFactory”),我将返回一个$ Proxy0对象,该对象似乎是Hibernate SessionFactory对象的代理。但这

  • 我有以下代码: 现在我使我的存储库成为反应性的。我的问题是如何使缓存存储现在单声道和通量。 我遇到了以下Mono和Flux缓存,但这只是为了查找,因为我也是反应式编程的初学者。

  • 我们正在使用@Cacheable和@CacheEvict来实现缓存。 问题是,构建缓存需要3分钟以上。根据应用程序逻辑,首先清除缓存,然后创建缓存。在此期间,如果有任何用户访问我们的应用程序,应用程序将无法发送数据,因为缓存仍在构建中。 是否有任何spring方法可以首先构建缓存,然后用新缓存替换旧缓存(除了@CachePut之外)。 谢谢,斯里坎特。

  • 在尝试部署集成了Spring Security性的jsf项目时,我遇到了以下错误。我今天才开始使用Spring Security性,因为安全领域的javaee安全性太麻烦了。我看了这个教程。所以我不确定这个错误到底意味着什么。我今天也开始了分级,所以我把依赖项包括在内,以防万一。 (我会将错误作为引号放在页面底部)。 应用程序上下文.xml 我的渐变依赖项: 我的web.xml 并promise为