2017-03-02 48 views
3

我想了解SpringMVC Web應用程序中的setter注入,我可以找到的所有示例使用xml顯示。不過,我被告知xml已被棄用,所有新的應用程序都應該使用java配置完成。這是錯誤的,我應該使用XML來配置我的應用程序?如何在Spring中對java配置使用setter注入?

我應該在哪裏聲明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> 

回答

2

我會建議先看看普通的Spring配置,以瞭解基本事物(如注入)的工作原理。如果你設法在Spring中獲得它的懸掛,這個過程在Spring MVC/Spring Boot /等中將非常類似。就我個人而言,我發現它試圖一次性處理多個概念(視圖解析器,不同的配置文件,視圖,存儲庫,多個註釋,多種配置方式等),所以我傾向於從最簡單的概念開始並構建我的一路攀升。一旦您對注射的工作方式感到滿意,您可以在其他地方輕鬆應用這些知識。

至於java配置和註釋,它們允許更快更清潔的開發。 XML非常冗長,很難維護,並且很容易出錯,部分原因是IDE在處理基於Java的配置時通常更有幫助。也許這就是爲什麼你閱讀XML已被棄用。我會推薦去java/auto配置而不是XML,除非你真的需要(或者對它感興趣)。

現在談談如何做到這一點。一個完整的(但最少)工作彈簧例如:

/* 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或任何其他註釋:有關差異,請參閱herehere)。你用@Autowired註解一個setter或構造函數(或者甚至是一個字段),指定參數(不一定需要具體類 - 接口,抽象類也可以),將它們分配到適當的字段。創建一個需要處理bean實例化的配置類。您不需要將組件放在與config類相同的文件夾中,因爲您始終可以指定在哪裏查找組件。最後,如果你想要一個更細粒度的控件,你總是可以在配置類中明確聲明bean(所謂的JavaConfig,而基於@ComponentScan的配置有時可能被稱爲autoconfig)。這應該足以讓你開始,並給你詞彙搜索更先進的東西。

當然,使用Spring Boot時,所有東西都會更加抽象/更快。

1

然而,有人告訴我,XML已被廢棄,所有新的應用,Java應該配置

XML不會被棄用做,但註釋是有它讓生活變得簡單。那麼爲什麼要使用普通的舊XML。記住「Convention over Configuration」

我應該在哪裏聲明bean,我該如何做?

我想你應該搜索谷歌的@Component,@Configuration,@Bean等註釋。閱讀他們你會明白

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

您會發現很多使用XML實現的示例,因爲XML在Spring早期被廣泛使用。 現在隨着Spring 4和Spring Boot的問世。大多數開發人員不大規模地使用XML。

相關問題