簡體   English   中英

如何在Spring中使用setter注入和java配置?

[英]How do I use setter injection with java configuration in Spring?

我試圖在SpringMVC Web應用程序中學習setter注入,我可以找到的所有示例,使用xml顯示。 但是,我被告知不推薦使用xml,並且所有新應用程序都應該使用java配置完成。 這是錯的,我應該使用xml來配置我的應用程序嗎?

我應該在哪里宣布豆子,我該怎么做?

這是我見過的一個例子,但它是用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配置,以了解基本的東西(如注入)是如何工作的。 如果你設法在Spring中獲得它,那么Spring MVC / Spring Boot /中的進程將非常相似。 就個人而言,我發現嘗試同時處理多個概念(查看解析器,不同的配置文件,視圖,存儲庫,多個注釋,多種配置方式等)非常令人沮喪,因此我傾向於從最簡單的概念開始並構建我的一路攀升。 一旦您對注射的工作方式感到滿意,您就可以輕松地將這些知識應用到其

至於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應用程序會有所不同,但基本的注​​入思想是一樣的。 首先,您需要聲明bean(通過使用@Bean@ Component或任何其他注釋:請參閱此處此處的差異)。 您使用@Autowired注釋setter或構造函數(甚至是字段),指定參數(不一定需要具體類 - 接口,抽象類也可以),將它們分配給適當的字段。 創建一個負責bean實例化的配置類。 您不需要將組件與config類放在同一文件夾中,因為您始終可以指定查找組件的位置。 最后,如果您想要更細粒度的控件,您始終可以在配置類中顯式聲明bean(所謂的JavaConfig,而基於@ComponentScan的配置有時可能稱為autoconfig)。 這應該足以讓你開始並為你提供詞匯來搜索更高級的東西。

當然,使用Spring Boot,一切都更加抽象/更快。

但是,我被告知不推薦使用xml,並且所有新應用程序都應該使用java配置完成

不推薦使用XML,但注釋會使生活變得簡單。 那么為什么要使用普通的舊XML。 記住“約定優於配置”

我應該在哪里宣布豆子,我該怎么做?

我認為你應該在谷歌搜索@Component,@ Configuration,@ Bean等注釋。 閱讀他們會理解的內容

這是我見過的一個例子,但它是用xml實現的。

您會發現許多使用XML實現的示例,因為XML在Spring的早期廣泛使用。 現在隨着Spring 4和Spring Boot的出現。 大多數開發人員不會大規模使用XML。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM