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

@Bean内部类带有@Configuration,没有它

王宏深
2023-03-14
问题内容

@Bean在Spring 3.0中有一个注释。它允许直接在Java代码中定义Spring
bean。在浏览Spring参考时,我发现了使用此批注的两种不同方法-带注释的内部类@Configuration和没有此注释的内部类。

本节包含以下代码:

@Component
public class FactoryMethodComponent {

   @Bean @Qualifier("public")
   public TestBean publicInstance() {
      return new TestBean("publicInstance");
   }

   // omitted irrelevant method
}

在这里我们可以看到一段非常相似的代码,但是现在@Configuration就在这里:

@Configuration
public class AppConfig {
   @Bean
   public MyService myService() {
      return new MyServiceImpl();
   }
}

参考的前一部分包含以下说明:

Spring组件中的@Bean方法的处理方式与Spring @Configuration类中的@Bean方法不同。
区别在于,使用CGLIB不能增强@Component类,以拦截方法和字段的调用。CGLIB代理是调用@Configuration类@Bean方法中的方法或字段来创建Bean元数据引用以协作对象的方法。方法不是使用常规Java语义调用的。相反,在@Component类中的方法或字段@Bean方法具有标准的Java语义。

但是CGLIB是一种内部的东西,应用程序开发人员不应该知道(当然,在理想的世界中)。据我了解,在这两种情况下,Spring都会调用带有注解的方法@Bean来创建Spring
bean,在这两种情况下,这些实例都会注入到协作者中。

所以我的问题是 ,在这两种情况下,对于我作为应用程序开发人员什么区别


问题答案:

区别在于,@Configuration您可以@Bean从另一个方法调用一个方法并获取完全初始化的实例,如下所示:

public class Foo {
    @Value("Hello, world!")
    public String value;
}

@Configuration
public class Config {
    @Bean
    public Foo createFoo() {
        Foo foo = new Foo();
        System.out.println(foo.value); // Prints null - foo not initialized yet
        return foo;
    }

    @Bean
    public Bar createBar() {
        Foo foo = createFoo();
        System.out.println(foo.value); // Prints Hello, world! - foo have been initialized by the interceptor
        return new Bar(foo);
    }
}


 类似资料:
  • 在使用MapStruct、Lombock和Spring时,我在Tomcat 9中的应用程序部署中遇到以下错误: 我的spring配置类在包层次结构的根目录中设置包扫描。映射器的实现也是在target/generated-sources下生成的: 我的错误表明Spring找不到实现类,我遗漏了什么?我试图将generated-sources文件夹添加到构建路径并将其包含在包扫描中,但没有成功。

  • 从https://projects.spring.io/spring-framework/,我有一个spring framework hellpworld程序。我删除了注释。然而,程序仍然可以像以前一样运行。为什么?这里的角色是什么?

  • 我只是在尝试内部类,遇到了这个想法,即拥有本地但静态的内部类…好吧,我在静态方法中制作了一个内部类…就这么简单…这是我做的例子 这不会给出任何编译错误。 我知道如何访问静态方法m。但是我想知道是否有办法从外部类访问本地类 LocalStatic.好吧,根据我的理解,我们无法访问方法内部的东西,对吧?因此,我无法从类外部访问LocalStatic或该本地类内的任何方法或属性,只想确保..

  • 当试图用包含所有上下文配置的抽象类运行stepdefs时,spring看到2个不同的beans parent和step def 我使用的是Spring Booking版本:2.6.4,JUnit 5和Cucumber版本7.2.3 异常堆栈跟踪: io.cucumber.core.runtime.CucumberExecutionContext.runTestCase:没有可用的“Cucumber

  • 我在调用get请求(modes-calcul)时遇到这个错误,我不明白为什么...我的依赖注入是正确的吗? ModeCalculController: 谢谢你的帮助..

  • 我尝试自动连接我的mapstruct mapper: 这是可行的: 但是为什么我不能使用: 我得到以下错误: 导致原因:org . spring framework . beans . factory . nosuchbeandidefinitionexception:没有类型为“pl . comp . window . application . mapper . windowdtomapper