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

Spring框架有多少种配置方式?它们在技术上有什么区别?(不是优点或缺点...)

东方华晖
2023-03-14

我正在学习这本书(我强烈推荐),我对作者如何解释Spring框架的配置方式感到困惑。

您可以在这里看到本书中使用的一些代码示例。(任何人都可以使用。)如果你想看看的话,我指的代码将是第2章的代码。

本书指出有3种方法可以配置Spring容器。

基于XML的配置

这将需要一个类似于以下内容的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ...>

    <bean id="accountService" class="com.wiley.beginningspring.ch2.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"/>
    </bean>
    
    <bean id="accountDao" class="com.wiley.beginningspring.ch2.AccountDaoInMemoryImpl">
    </bean>

</beans>

然后,为了引导Spring,将使用以下代码:

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/com/wiley/beginningspring/ch2/ch2-beans.xml");

此刻我没有任何困惑。

基于Java的配置

在此配置方法中,将有一个用于配置的类,如下所示:

@Configuration
public class Ch2BeanConfiguration {

    @Bean
    public AccountService accountService() {
        AccountServiceImpl bean = new AccountServiceImpl();
        bean.setAccountDao(accountDao());
        return bean;
    }
    
    @Bean
    public AccountDao accountDao() {
        AccountDaoInMemoryImpl bean = new AccountDaoInMemoryImpl();
        return bean;
    }
}

负责引导Spring的代码如下所示:

ApplicationContext applicationContext
            = new AnnotationConfigApplicationContext(Ch2BeanConfiguration.class);

到目前为止,我都很清楚。(种类……)我还想指出,这里我们实际上有一个注释,叫做@Configuration。。。

基于注释的配置

本书中解释的最后一种可用的配置方法是基于注释的配置。

有一个xml文件,就像我们在基于xml的配置中使用的一样,但它要小得多:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ...>
    <context:component-scan base-package="com.wiley.beginningspring.ch2"/>
</beans>

所有bean都有注释,例如:

@Component, @Service

所有依赖项都有注释:

@Autowired

这样豆子就可以注射了。

此配置方法中Spring framework的引导方式如下:

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/ch2-beans.xml");

以下是我的问题:

为什么(所谓的)基于注释的配置实际上使用ClassPathXmlApplicationContext,而不是上面的AnnotationConfigApplicationContext?后者似乎更适合用于包含“基于注释”的配置中,不是吗?

书中解释的基于Java的配置似乎应该被称为基于注释的配置。?

在我看来,这本书中解释的基于注释的配置方式实际上类似于:使用自动连线bean的基于XML的配置。它甚至没有“基于Java的配置”所具有的@配置注释。。

有多少种方法可以配置Spring框架?

共有3个答案

洪俊能
2023-03-14

首先,我想感谢肯·贝科夫更足智多谋的回答。我试图即兴创作他的答案,以便任何人都可以在这方面了解更多。

配置定义:

Spring 4包含3种定义其配置的方法。他们是

注释的优点:

>

  • 所有信息都在一个文件中(无需打开两个文件即可配置给定行为)

    当类更改时,无需修改xml文件

    在重新分解应用程序代码时,注释通常被认为更加直观和健壮。此外,他们还受益于guise提供的更好的IDE指导。但他们将应用程序代码与DI问题混为一谈。应用程序依赖于框架。完全分离几乎是不可能的<当根据其他情况(如机器人腿问题)在同一位置(构造器、字段)描述不同的注入行为时,代码>注释也受到限制

    xml文件的优点:

    >

  • POJO与其行为之间的明确分离

    当您不知道哪个POJO对该行为负责时,更容易找到那个POJO(在文件子集而不是所有源代码中搜索)

    XML具有声明式风格的唯一好处,声明式风格是与应用程序代码本身明确分开定义的。这与DI关注点无关。缺点是冗长、重分解能力差、鲁棒性差以及运行时的一般故障行为。与IDE支持(例如Java)相比,只有一种通用(XML)工具支持,几乎没有什么好处。此外,这种XML还带来了性能开销,因此它通常比代码解决方案慢。

    基于XML和注释的链接:

    1. http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-注释配置

    基于Groovy的链接:

    1. https://objectpartners.com/2016/01/12/using-groovy-based-spring-configuration/
    2. http://blog.andresteingress.com/2014/02/14/grails-java-based-spring-config/

    Bean定义:

    正在扫描类路径:

    对于xml-config,它将是

    依赖注入:

    在基于xml的配置中,依赖项注入可以在xml中手动完成,也可以使用注释(Autowire、Required等)完成。在这种情况下,需要定义<代码>

    问题

    问题1:为什么(所谓的)基于注释的配置实际上使用的是ClassPathXmlApplicationContext,而不是上面的AnnotationConfigApplicationContext?

    Ans:它是一种基于xml的配置,具有基于注释的bean定义。

    应用程序上下文:

    1. http://docs.spring.io/spring/docs/4.2.0.RELEASE/javadoc-api/org/springframework/context/ApplicationContext.html

    注释ConfigApplicationContext:

    1.AnnotationConfigApplicationContext和父上下文

    类路径Xml应用程序上下文:

    1. http://www.tutorialspoint.com/spring/spring_applicationcontext_container.htm
    2. http://www.mkyong.com/spring3/spring-3-hello-world-example/

    Q2:书中解释的基于Java的配置似乎应该被称为基于注释的配置。?

    答:你说得对。基于Java配置使用注释,称为基于注释的配置。但是注释是Java的一部分,没有别的。

    但是仔细地说,我们需要了解这种层次结构是如何从xml到基于注释的,最后是基于groovy的?

    基于注释的配置提供了XML设置的替代方案,它依赖于字节码元数据来连接组件,而不是角括号声明。开发人员没有使用XML来描述bean连接,而是通过使用相关类、方法或字段声明上的注释将配置移动到组件类本身。正如“示例:必需的注释BeanPostProcess”一节中提到的那样,将BeanPostProcess与注释结合使用是扩展Spring IoC容器的常用方法。例如,Spring 2.0引入了使用@必需的注释强制执行必需属性的可能性。

    Spring 2.5使遵循相同的通用方法来驱动Spring的依赖注入成为可能。从本质上讲,@Autow的注释提供了与第6.4.5节“Autowire合作者”中描述的相同的功能,但具有更细粒度的控制和更广泛的适用性。

    Spring 2.5还添加了对JSR-250注释的支持,例如,PostConstruct和PreDestroy。

    Spring 3.0增加了对javax中包含的JSR-330(Java依赖注入)注释的支持。注入包,如注入和命名。有关这些注释的详细信息,请参见相关章节。

    问题3:有多少种方法可以配置Spring框架?

    Ans:

    理论上,3种描述配置的方式,2种定义bean的方式。它变成了3*2=6种配置Spring框架的方式(默认情况下)。所有这些方式都可以相互结合使用。

    但实际上,在一个单词中,我们可以通过使用XML注释来配置Spring框架。

  • 弘康安
    2023-03-14

    理解这一点的最简单方法是研究框架的悠久历史,它是如何开发的。

    >

    基于注释的配置-在Spring 2.5中-这是对Java EE 5的一种反应,引入了新的注释,如@Autowired,XML文件中仍然有一些上下文配置-通常您会定义要扫描哪些包,其余部分根据注释自动完成-因此得名。

    Spring 3附带了基于Java的配置,在以后的版本中得到了改进。这就是AnnotationConfigApplicationContext和Configuration annotation被引入的时候——您可以完全删除XML-

    除了这3个(2实际上与1和2使用相同的Application Context类)之外,还有其他创建上下文的方法:

    • 查看ApplicationContext接口的所有实现类
    • 用于junit测试的SpringJUnit4ClassRunner
    • 我打赌还有其他我不知道的方法
    红弘盛
    2023-03-14

    为了避免混淆,我们应该理解,配置定义和bean定义是两回事。有三种方法可以定义配置,默认情况下在Spring 4中可用:

    • 基于xml的配置,当您在xml文件中描述配置时

    有两种方法可以将bean定义添加到应用程序中:

    >

  • 当您通过在配置中的声明手动添加bean时,在bean定义中进行配置。

    在这种情况下,定义将基于配置类型。对于xml配置,它将是<代码>

    基于注释的bean定义,当您使用特定注释(如组件、服务、控制器等)标记bean类时。这种类型的配置使用类路径扫描。

    在这种情况下,您必须指定用于扫描类路径的指令。对于xml-config,它将是

    如您所见,您可以在不同的组合中使用配置和bean定义。

    请注意,如果使用基于xml的配置,则可以选择驱动依赖项注入的方法:在xml中手动,或使用注释(@Autowire@Required等)。在后一种情况下,您必须定义<代码>

    现在,基于这一观点,让我们尝试回答您的问题:

    为什么(所谓的)基于注释的配置实际上使用ClassPathXmlApplicationContext,而不是上面的AnnotationConfigApplicationContext?

    这本书的作者混淆了概念。实际上,这是一种基于xml的配置,具有基于注释的bean定义。

    书中解释的基于Java的配置似乎应该被称为基于注释的配置。?

    您是对的-基于Java的配置确实积极地使用注释,可以称为基于注释的配置。但是注释是Java的一部分。此外,这是文件中规定的传统术语。

    有多少种方法可以配置Spring框架?

    因此,默认情况下,我们有三种方式来描述配置,两种方式来定义bean。这变成了配置Spring框架的六种方式(默认情况下)。但是,当然,所有这些方式都可以相互结合使用。

  •  类似资料:
    • 问题内容: 我学习这本书(我会强烈建议),我感到困惑的作者是如何解释的方式Spring框架可以配置。 您可以在此处看到本书中使用的一些代码示例。(任何人都可以使用。)如果您想看一看,我所引用的代码将是第2章中的代码。 本书指出有 3种配置Spring容器的方法 。 基于XML的配置 这将需要一个类似于以下内容的xml文件: 然后,为了引导Spring,将使用的代码为: 目前,我没有任何混乱。 基于

    • 本文向大家介绍Spring Boot 的配置文件有哪几种格式?它们有什么区别?相关面试题,主要包含被问及Spring Boot 的配置文件有哪几种格式?它们有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 v.properties 和 .yml,它们的区别主要是书写格式不同。 1 , properties 2, yml  

    • 问题内容: 正在考虑使用Java创建自己的网站,并试图决定使用哪种框架。但是,快速搜索Java框架会返回50多种选择! 我的网站只是出于我自己的兴趣,一开始便会对其进行构建,但是,如果它变得流行,那么它具有一定的可伸缩性,或者至少能够为此进行重新设计,将是一件好事。 较流行的框架之间的主要区别是什么?在某些情况下是否有一个明显优于其他情况?例如,高流量的企业应用程序与低流量的小型应用程序。我也想知

    • 本文向大家介绍什么是函数式编程?它有什么优缺点?相关面试题,主要包含被问及什么是函数式编程?它有什么优缺点?时的应答技巧和注意事项,需要的朋友参考一下 函数式编程是一种编程范式,关心数据的映射 函数式编程的函数是引用透明的,无副作用,函数的返回值只与函数的参数有关,容易测试和维护 函数式编程的函数的参数是不可变的,会导致,运行时占用资源较多。 参考文章

    • 本文向大家介绍什么是ajax和json,它们的优缺点相关面试题,主要包含被问及什么是ajax和json,它们的优缺点时的应答技巧和注意事项,需要的朋友参考一下 ajax的全称:Asynchronous Javascript And XML。 异步传输+js+xml。实现无刷新状态更新页面和异步提交 所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,

    • 本文向大家介绍npm是干什么用的?它有什么优缺点?有没有类似的方案?相关面试题,主要包含被问及npm是干什么用的?它有什么优缺点?有没有类似的方案?时的应答技巧和注意事项,需要的朋友参考一下 npm是node包管理工具 优点:通过npm命令下载第三方包,实现代码的共享,下载的第三方包会在node_modules中。无需再去对应网站下载js文件。 缺点:当第三方包所需依赖过大时,需要安装的包的数量也