什麼是JavaConfig

AlbenXie發表於2018-09-11

java config是指基於java配置的spring。傳統的Spring一般都是基本xml配置的,後來spring3.0新增了許多java config的註解,特別是spring boot,基本都是清一色的java config。

@Configuration

    在類上打上這一標籤,表示這個類是配置類

@ComponentScan

   相當於xml的<context:componentscan basepakage=>

@Bean

     bean的定義,相當於xml的

     <bean id="objectMapper" class="org.codehaus.jackson.map.ObjectMapper" /> 

@EnableWebMvc

    相當於xml的<mvc:annotation-driven>

@ImportResource

   相當於xml的 <import resource="applicationContext-cache.xml">

@PropertySource

spring 3.1開始引入,它是基於java config的註解,用於讀取properties檔案

 @Profile

spring3.1開始引入,一般用於多環境配置,啟用時可用@ActiveProfiles註解,@ActiveProfiles("dev")

等同於xml配置

<beans profile="dev">
    <bean id="beanname" class="com.pz.demo.ProductRPC"/>
</beans>

啟用該profile spring.profiles.active,也可設定預設值 spring.profiles.default
<context-param>
    <param-name>spring.profiles.default</param-name>
    <param-value>dev</param-value>
</context-param>

 

Spring IOC有一個非常核心的概念——Bean。由Spring容器來負責對Bean的例項化,裝配和管理。XML是用來描述Bean最為流行的配置方式。Spring可以從XML配置檔案中讀取任何型別的後設資料並自動轉換成相應的Java程式碼。Spring改變了java的程式設計模式,Spring的下載已經超過了1億次,可見Spring已經有多流行。

隨著Spring的日益發展,越來越多的人對Spring提出了批評。“Spring專案大量的爛用XML”就是最為嚴勵的一個批評。由於Spring會把幾乎所有的業務類都以Bean的形式配置在XML檔案中,造成了大量的XML檔案。使用XML來配置Bean失去了編譯時的型別安全檢查。大量的XML配置使得整個專案變得更加複雜。Rod Johnson也注意到了這個非常嚴重的問題。

當隨著JAVA EE 5.0的釋出,其中引入了一個非常重要的特性——Annotations(註釋)。註釋是原始碼的標籤,這些標籤可以在原始碼層進行處理或通過編譯器把它熔入到class檔案中。在JAVA EE 5以後的版本中,註釋成為了一個主要的配置選項。Spring使用註釋來描述Bean的配置與採用XML相比,因類註釋是在一個類原始碼中,可以獲得型別安全檢查的好處。可以良好的支援重構。

JavaConfig就是使用註釋來描述Bean配置的元件。JavaConfig 是Spring的一個子專案, 比起Spring,它還是一個非常年青的專案。目前的版本是1.0 M2。使用XML來配置Bean所能實現的功能,通過JavaConfig同樣可以很好的實現。

 

考慮使用JavaConfig替代XML配置

對於總是固執地使用Spring的XML配置方式,同事們總是譏諷我。是的,這看起來太二太過時了,不過XML還是有它的優勢:

1.集中式配置。這樣做不會將不同元件分散的到處都是。你可以在一個地方看到所有Bean的概況和他們的裝配關係。

2.如果你需要分割配置檔案,沒問題,Spring可以做到。它可以在執行時通過<import>標籤或者上Context檔案對分割的檔案進行重新聚合。

3.相對於自動裝配(autowiring),只有XML配置允許顯示裝配(explicit wiring)

4.最後一點並不代表不重要,XML配置完全和JAVA檔案解耦:兩種檔案完全沒有耦合關係,這樣的話,類可以被用作多個不同XML配置檔案。

XML唯一的問題是,只有在執行時環境時你才能發現各種配置及語法錯誤,但是如果使用Spring IDE Plugin(或者STS)的話,它會在編碼時提示這些問題。

在XML配置和直接註解式配置之外還有一種有趣的選擇方式-JavaConfig,它是在Spring 3.0開始從一個獨立的專案併入到Spring中的。它結合了XML的解耦和JAVA編譯時檢查的優點。JavaConfig可以看成一個XML檔案,只不過是使用Java編寫的。相關文件在官方網站是可以找到的,這篇文章只是帶你瞭解JavaConfig。下面的例子,讓我們將從XMl檔案移植到JavaConfig。

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-3.2.xsd">   

        <bean id="button" class="javax.swing.JButton">   
            <constructor-arg value="Hello World" />   
        </bean>   

        <bean id="anotherButton" class="javax.swing.JButton">   
            <property name="icon" ref="icon" />   
        </bean>   

        <bean id="icon" class="javax.swing.ImageIcon">   
            <constructor-arg>   
                <bean class="java.net.URL">   
                  <constructor-arg value="http://morevaadin.com/assets/images/learning_vaadin_cover.png" />   
                </bean>   
            </constructor-arg>   
        </bean>   
    </beans>  
    import java.net.MalformedURLException;  
    import java.net.URL;  
    import javax.swing.Icon;  
    import javax.swing.ImageIcon;  
    import javax.swing.JButton;  
    import org.springframework.context.annotation.Bean;  
    import org.springframework.context.annotation.Configuration;  

    @Configuration  
    public class MigratedConfiguration {  
        @Bean  
        public JButton button() {  
            return new JButton("Hello World");  
        }  

        @Bean  
        public JButton anotherButton(Icon icon) {  
            return new JButton(icon);  
        }  

        @Bean  
        public Icon icon() throws MalformedURLException {  
            URL url = new URL(  
                    "http://morevaadin.com/assets/images/learning_vaadin_cover.png");  
            return new ImageIcon(url);  
        }  
    }  

用法非常簡單:

1.用@Configuration註解JavaConfig類,

2.用每個方法來表示Bean並使用@Bean註解方法。

3.每個方法名代表XML配置檔案中的name

注意在Web環境中,需要在web.xml中加入如下程式碼:

<context-param>  
    <param-name>contextClass</param-name>  
    <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>  
</context-param>  
<context-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>com.packtpub.learnvaadin.springintegration.SpringIntegrationConfiguration</param-value>  
</context-param> 

相關文章