gpt4 book ai didi

java - Spring框架有几种配置方式?它们在技术上有何区别? (不是优点或缺点..)

转载 作者:IT老高 更新时间:2023-10-28 13:04:56 24 4
gpt4 key购买 nike

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

您可以看到本书here中使用的一些代码示例. (任何人都可以使用它们。)我所指的代码将是第 2 章中的代码,如果您想看一下。

书中指出有3种配置Spring Container的方法


基于 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方法中,会有一个配置类如下:

@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都有Annotations,例如:

@Component, @Service

等等。

并且所有的依赖都有注解:

@Autowired

这样可以注入(inject)bean。

该配置方式中Spring框架的自举方式如下:

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

这是我的问题:

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

书中解释的Java Based Configuration似乎应该叫做Annotation Based Configuration。?

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

Spring框架有几种配置方式?

最佳答案

为避免混淆,我们应该理解,配置定义bean定义是两个不同的东西。 Spring 4默认提供三种定义配置的方式:

  • 基于xml的配置,当你在xml文件中描述配置时;
  • 基于java的配置,当配置为Java类时,标注具体注解;
  • 基于groovy的配置,当配置是带有Groovy代码的文件时;

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

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

    在这种情况下,定义将基于配置类型。对于 xml-config,它将是 <bean/>标记,用于基于 java 的配置 - 带有 @Bean 的方法注释和 beans {...} Groovy 的构造。

  • 基于注释 bean 定义,当您使用特定注释标记 bean 类时(如 @Component@Service@Controller 等)。这种类型的配置使用 classpath scanning .

在这种情况下,您必须指定扫描类路径的指令。对于 xml-config,它将是 <context:component-scan base-package="..."/> , 对于 java-config - @ComponentScan注释,用于 Groovy ctx.'component-scan'(...)调用。

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

注意,如果您使用基于 xml 的配置,您可以选择驱动依赖注入(inject)的方法:手动在 xml 中,或使用注释(@Autowire@Required 等)。在后期情况下,您必须定义 <context:annotation-config/> .但不要混淆 bean 定义和依赖注入(inject)控制。

现在基于这个观点让我们试着回答你的问题:

Why is the (so-called) Annotation Based Configuration actually usingClassPathXmlApplicationContext but notAnnotationConfigApplicationContext above?

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

The Java Based Configuration explained in the book seems like whatshould be called Annotation Based Configuration.?

你说得对——基于 Java 的配置确实积极地使用注解,并且可以称为基于注解。但是注解是 Java 的一部分。此外,这是一个传统术语,specified in documentation .

How many ways are there to configure Spring framework?

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

关于java - Spring框架有几种配置方式?它们在技术上有何区别? (不是优点或缺点..),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35807056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com