【问题标题】:Are we not encouraged to write XML configuration using Maven + Spring?我们不鼓励使用 Maven + Spring 编写 XML 配置吗?
【发布时间】:2021-08-10 18:31:20
【问题描述】:

目前正在学习构建 Spring 应用程序。目前我已经相当成功地部署了模拟应用程序,但有一件事让我很烦恼,那就是不了解我们添加到代码中的众多注释背后的机制。听着,我并不是说我不知道​​他们的目的是什么,他们在哪里行动,我也不是在质疑他们的帮助。

我的观点是,我觉得跳过应该在 XML 文件中进行的更改(或正在进行的更改?)实际上让我觉得在一天结束时我不知道我真正在写什么。让我更具体一些,以便您可以就以下示例回答我。这是来自 Spring 手册。

假设我们有以下配置,将 firstMovieCatalog 定义为主 MovieCatalog

@Configuration
public class MovieConfiguration {
@Bean
@Primary
public MovieCatalog firstMovieCatalog() { ... }
@Bean
public MovieCatalog secondMovieCatalog() { ... }
// ...
}

通过这样的配置,以下 MovieRecommender 将与 firstMovieCatalog。

public class MovieRecommender {
@Autowired
private MovieCatalog movieCatalog;
// ...
}

对应的bean定义如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean class="example.SimpleMovieCatalog" primary="true">
<!-- inject any dependencies required by this bean -->
</bean>
<bean class="example.SimpleMovieCatalog">
<!-- inject any dependencies required by this bean -->
</bean>
<bean id="movieRecommender" class="example.MovieRecommender"/>
</beans>

好的,所以,我想如果你能回答我关于这个例子的 2 个问题,就会清楚我在这里缺乏的理解。

  1. 我不清楚的第一件事:注释过程是与 XML 配置分离的过程,还是以某种隐藏的方式生成这个等效的 XML 配置?

  2. 这个 XML 配置文件到底在哪里?我通过 Initializr 生成的所有 spring 应用程序都只是生成 pom.xml 文件,它不包含配置。如果我不使用注解,我是否必须在 pom 中手动编写等效配置?

【问题讨论】:

  • XML 配置是旧式的。忽略它。
  • 所以注解实际上不会生成 XML,而只会生成 Java 代码本身?
  • 是的,没错。
  • 注解也不生成代码
  • 我相信他们展示 XML 配置和 Java 配置的原因是为了帮助那些理解或仍在使用 XML 配置的人迁移到 Java 配置。 Java config 的一大好处是它提供了编译时类型安全。我个人认为一个或多个 @Configuration 文件比一个或多个 XML 配置文件更易于维护。

标签: java spring spring-boot maven


【解决方案1】:

注释过程是从 XML 配置中分离出来的过程,还是以某种隐藏的方式生成这个等效的 XML 配置?

在任何情况下,Spring 都不会生成任何 XML 或注释。 Spring 使用 XML 和注释处理来获取有关哪些组件(类)可供使用以及哪些 bean(实例)要创建、注入和用于处理的信息。然后,所有这些 bean 都可以通过应用程序上下文来检索(不要与同名的 xml 混淆)。

这个 XML 配置文件到底在哪里?

Spring 第一个版本使用 XML 来配置您的应用程序。后来(从 Spring 3 开始),Spring 为 ease 应用程序配置添加了注解支持和处理。注释只是配置组件和 bean 的另一种方式,无需维护大型 XML 文件(超过 1000 行甚至更多),或者完全避免处理 XML。当前的 Spring 版本支持这两种配置,您也可以混合使用:使用 XML 和使用注释。

请注意,Spring 的 ApplicationContext 有几个实现,具有不同的配置入口点:

  • AnnotationConfigApplicationContext 接受用 @Configuration 装饰的类。
  • ClassPathXmlApplicationContext 接受应用程序类路径中可用的 XML 文件的路径。

如果我不使用注解,是否必须在 pom 中手动编写等效配置?

第一件事:POM 文件用于 maven 处理,而不是用于 Spring。由于您使用的是 Maven,并且您想尝试使用没有注释的 Spring Boot 应用程序,那么您可以拥有这样的项目结构:

- src
  - main
    - java
      /* your Java packages and files */
      - com.example
        + App   <--- Main entry point
      - com.example.service
        + Car    <--- Component 1
        + Engine <--- Component 2
    - resources
      + my-beans.xml <--- XML configuration. Name can be anything

应用类:

package com.example;

import com.example.service.Car;

import org.springframework.boot.SpringApplication;
import org.springframework.context.ApplicationContext;

@Configuration
@ImportResource("classpath:my-beans.xml")
public class App {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(App.class, args);
        Car car = ctx.getBean(Car.class);
        car.move();
    }
}

汽车类:

package com.example.service;

public class Car {

    private Engine engine;

    public void move() {
        engine.start();
    }
}

Engine.class:

package com.example.service;

public class Engine {

    public void start() {
        System.out.println("engine starts");
    }
}

my-beans.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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
    <bean class="com.example.service.Engine" />

    <bean class="com.example.service.Car" />
        <property name="engine" ref="engine"></property>
    </bean>
</beans>

【讨论】:

  • 非常感谢您的回复。这确实很有价值。只要您解释 .xml 配置应该写在 Resources 中,就为我澄清了世界。我不明白为什么人们在解释 Spring 时不提这些基本的东西。
  • 非常感谢您的回答。这让我明白了很多。这些东西现在学习起来变得非常复杂,因为大多数教授 MVC 概念的人都完全专注于教你“让事情工作”。因此,至少我发现很难找到有关以教学方式解释机制的知识来源。
【解决方案2】:

注释过程是从 XML 配置中分离出来的过程,还是以某种隐藏的方式生成这个等效的 XML 配置

当您初始化 Spring 应用程序时,您会实例化一个 ApplicationContext:它负责加载所有上下文定义(bean、服务...)。

ApplicationContext 实际上是一个接口,它有多个实现,具体取决于您的上下文的定义方式:

  • ClassPathXmlApplicationContext 读取一个 XML 文件
  • AnnotationConfigApplicationContext 用于基于注释的方法
  • ...

因此,您可以将其视为一个独特的过程,只是数据源不同:XML 或注释。但它们描述的是同一件事:上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多