gpt4 book ai didi

java - 如何在 Spring 中使用 setter 注入(inject)和 java 配置?

转载 作者:数据小太阳 更新时间:2023-10-29 02:03:34 25 4
gpt4 key购买 nike

我正在尝试了解 SpringMVC Web 应用程序中的 setter 注入(inject),我可以找到的所有示例都使用 xml 进行展示。但是,我被告知 xml 已被弃用,所有新应用程序都应使用 java 配置来完成。这是错误的吗,我应该使用 xml 来配置我的应用程序吗?

我应该在哪里声明 bean 以及我将如何做?

这是我见过的例子之一,但它是用 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.xsd">

<bean id="message"
class="org.springbyexample.di.xml.SetterMessage">
<property name="message" value="Spring is fun." />
</bean>

</beans>

最佳答案

我建议首先研究普通的 Spring 配置,以了解基本的东西(如注入(inject))是如何工作的。如果你设法在 Spring 中掌握它,那么这个过程在 Spring MVC/Spring Boot/etc 中将非常相似。就个人而言,我发现尝试同时处理多个概念( View 解析器、不同的配置文件、 View 、存储库、多个注释、多种配置方式等)非常令人沮丧,所以我倾向于从最简单的概念开始构建我的一路攀升。一旦您熟悉了注入(inject)的工作原理,您就可以轻松地将这些知识应用到其他地方。

至于 java 配置和注释,它们确实允许更快、更清晰的开发。 XML 非常冗长、难以维护并且很容易出错,部分原因是在使用基于 Java 的配置时,IDE 通常更有帮助。也许这就是您读到 XML 正在被弃用的原因。我建议使用 java/auto 配置而不是 XML 配置,除非你真的需要(或对它感兴趣)。

现在介绍如何操作。一个完整的(但最小的)工作 Spring 示例:

/* Bean definition

@Component tells Spring that this is a bean. There are a few similar annotations.
It will be discovered during the component scan, as it has @Component annotation */

package main.java.org.example;
import org.springframework.stereotype.Component;

@Component
public class Greeting {
private String greeting = "Hello";

public String getGreeting() {
return this.greeting;
}

public void setGreeting(String greeting) {
this.greeting = greeting;
}
}


/* Another bean definition.
It has another bean as a dependency, which we inject with a setter. */

package main.java.org.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class GreetingCollector {
private Greeting greeting;

/* This is how you do setter injection */
@Autowired
public void setGreeting(Greeting greeting) {
this.greeting = greeting;
}

public String getGreeting() {
return greeting.getGreeting();
}
}


/* This is a minimal config class.
@ComponentScan instructs to look for classes that are
annotated with @Component annotation (in other words, beans) */

package main.java.org.example;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@ComponentScan
@Configuration
public class Config {}

如果你想明确地这样做:

package main.java.org.example;  
import main.java.org.example.GreetingCollector;
import main.java.org.example.Greeting;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Config {
@Bean
public Greeting greeting() {
return new Greeting();
}

@Bean
public GreetingCollector greetingCollector(Greeting greeting) {
return new GreetingCollector(greeting);
}
}

如果你想运行它只是为了看看它是如何工作的:

import main.java.org.example.Config;
import main.java.org.example.GreetingCollector;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppContext {
public static void main(String args[]) {
System.out.println("Configuring application context...");
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
GreetingCollector collector = (GreetingCollector) context.getBean("greetingCollector");
System.out.println(collector.getGreeting());
}
}

当然,Spring web application 会有点不同,但是基本的注入(inject)思想是一样的。首先,您需要声明 bean(使用 @Bean@Component 或任何其他注解:请参阅 herehere 以了解差异)。您可以使用 @Autowired 注释 setter 或构造函数(甚至字段) ,指定参数(不一定需要是具体类——接口(interface)、抽象类也可以),将它们分配给适当的字段。创建一个负责 bean 实例化的配置类。您不需要将组件与配置类放在同一文件夹中,因为您始终可以指定在哪里查找组件。最后,如果您想要更细粒度的控制,您始终可以在配置类中显式声明 bean(所谓的 JavaConfig,而基于 @ComponentScan 的配置有时可能称为 autoconfig)。这应该足以让您入门并为您提供词汇来搜索更高级的东西。

当然,有了 Spring Boot,一切都更加抽象/更快。

关于java - 如何在 Spring 中使用 setter 注入(inject)和 java 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42560953/

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