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

了解spring@Configuration类

曾苗宣
2023-03-14

在了解Spring@AutoWired用法这个问题之后,我想为Spring布线的另一个选项@configuration类创建一个完整的知识库。

假设我有一个spring XML文件,它如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

  <import resource="another-application-context.xml"/>

  <bean id="someBean" class="stack.overflow.spring.configuration.SomeClassImpl">
    <constructor-arg value="${some.interesting.property}" />
  </bean>

  <bean id="anotherBean" class="stack.overflow.spring.configuration.AnotherClassImpl">
    <constructor-arg ref="someBean"/>
    <constructor-arg ref="beanFromSomewhereElse"/>
  </bean>
</beans>

共有1个答案

车胤运
2023-03-14

可以通过以下几个步骤将xml迁移到@configuration:

>

  • 创建@configuration带注释的类:

    @Configuration
    public class MyApplicationContext {
    
    }
    

    为每个 标记创建一个用@bean注释的方法:

    @Configuration
    public class MyApplicationContext {
    
      @Bean(name = "someBean")
      public SomeClass getSomeClass() {
        return new SomeClassImpl(someInterestingProperty); // We still need to inject someInterestingProperty
      }
    
      @Bean(name = "anotherBean")
      public AnotherClass getAnotherClass() {
        return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse); // We still need to inject beanFromSomewhereElse
      }
    }
    
    @ImportResource("another-application-context.xml")
    @Configuration
    public class MyApplicationContext {
      ...  
    }
    

    如果bean是在另一个@configuration类中定义的,我们可以使用@import注释:

    @Import(OtherConfiguration.class)
    @Configuration
    public class MyApplicationContext {
      ...
    }
    

    导入其他XML或@configuration类之后,我们可以通过向@configuration类声明一个私有成员来使用它们在上下文中声明的bean,如下所示:

    @Autowired
    @Qualifier(value = "beanFromSomewhereElse")
    private final StrangeBean beanFromSomewhereElse;
    

    或者直接在定义依赖于此beanfromsomewhereelse的bean的方法中使用@qualifier的参数,如下所示:

    @Bean(name = "anotherBean")
    public AnotherClass getAnotherClass(@Qualifier (value = "beanFromSomewhereElse") final StrangeBean beanFromSomewhereElse) {
      return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse);
    }
    

    导入属性非常类似于从另一个xml或@configuration类导入bean。我们不使用@qualifier,而是使用@value和以下属性:

    @Autowired
    @Value("${some.interesting.property}")
    private final String someInterestingProperty;
    

    这也可以与SpEL表达式一起使用。

    为了允许spring将此类类作为bean容器来处理,我们需要将这个标记放在上下文中,从而在主xml中对其进行标记:

    <context:annotation-config/>
    
    <bean class="some.package.MyApplicationContext"/>
    

    基本上,我发现这种声明bean的方法比使用XMLs要舒服得多,因为我看到了以下几个优点:

    1. 错别字-@configuration类已编译,而错别字不允许编译
    2. fail fast(编译时)-如果您忘记注入bean,您将在编译时失败,而不是像XMLS
    3. 那样在运行时失败
    4. 易于在IDE中导航--在html" target="_blank">bean的构造函数之间导航,以理解依赖关系树。
    5. 可以轻松调试配置启动

    缺点并不是我所看到的那么多,但我能想到的有几个:

      null

    底线:在应用程序上下文中组合XML、@configuration和注释是非常好的。Spring并不关心bean声明时使用的方法。

  •  类似资料:
    • 问题内容: 在理解“ Spring @Autowired用法”这个问题之后,我想为弹簧接线的另一个选项(类)创建一个完整的知识库。 假设我有一个看起来像这样的spring XML文件: 我该如何使用呢?它对代码本身有影响吗? 问题答案: 将XML迁移到 只需几个步骤即可将xml迁移到: 创建一个带注释的类: 为每个标签创建一个方法,其注释为: 为了导入,我们需要导入它的定义。可以用XML定义它,我

    • 某些应用程序可能需要可能需要更改的配置属性,开发人员可能需要将其关闭或重新启动应用程序才能执行此操作。 但是,这可能会导致生产停机并需要重新启动应用程序。 Spring Cloud Configuration Server允许开发人员加载新的配置属性,而无需重新启动应用程序,也不会出现任何停机。 使用Spring Cloud Configuration Server 首先,从https://sta

    • Spring Cloud Configuration Server是一个集中式应用程序,可管理所有与应用程序相关的配置属性。 在本章中,您将详细了解如何创建Spring Cloud Configuration服务器。 创建Spring Cloud配置服务器 首先,从Spring Initializer页面下载Spring Boot项目,然后选择Spring Cloud Config Server依

    • 我试图弄清楚spring的反应性终点,这让我感到困惑。 我有一个endpoint,它返回一个映射的Mono,这个想法只是呈现一些任意的JSON。 作为请求的一部分,我做了一个mono.zip(mono.fromrunnable{...}),在这里我调用API获取数据。 在zip之后,我对结果执行一个.Map操作,并最终返回我希望看到呈现的地图。 当我到达endpoint时,不会呈现任何JSON,但

    • 问题内容: 我正在阅读spring 3.0.x参考文档以了解Spring Autowired注释: 3.9.2 @Autowired和@Inject 我无法理解以下示例。我们需要在XML中做一些工作才能使其工作吗? 例1 例子2 如何自动装配两个类以实现相同的接口并使用相同的类? 例: 将调用哪种设计方法?如何确保Red类的设计方法被调用而不是Blue? 问题答案: TL; DR @Autowir

    • 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架(不