什麼是JavaConfig
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>
相關文章
- 什麼是cookie,什麼是sessionCookieSession
- 什麼是DNS,什麼是HostsDNS
- 什麼是模式? 什麼是框架?模式框架
- 這是什麼這是什麼
- 什麼是WebAuthn、FIDO 是什麼?Web
- ITIL是什麼意思?ITIL是什麼?
- 什麼是跨域,什麼是同源跨域
- 什麼是.NET平臺、什麼是c#、什麼是ASP.NET。C#ASP.NET
- ftp是什麼,ftp是什麼東西?FTP
- Java是什麼_Java是做什麼的?Java
- 什麼是正向代理?什麼是反向代理?
- NLA是什麼?NLA的原理是什麼?
- ###什麼是Linux核心###什麼是MMULinux
- 為什麼要有 Servlet ,什麼是 Servlet 容器,什麼是 Web 容器?ServletWeb
- 什麼是塊元素?什麼是行內元素?
- 什麼是API介面,具體是什麼意思?API
- 什麼是框架?為什麼說 Angular 是框架?框架Angular
- 什麼是Unicode,什麼是UTF-8Unicode
- 什麼是藍海?什麼是紅海?什麼是網際網路思維?
- nginx 是什麼,能幹什麼?Nginx
- 什麼是Django?有什麼用途?Django
- AI三重問:什麼是AI?什麼是AI模型?什麼是AI大模型?AI大模型
- 什麼是重繪repaint?什麼是迴流reflow?AI
- DHCP是什麼?DHCP伺服器是什麼意思?伺服器
- 什麼是CDN?CDN的技術原理是什麼?
- 交換機是什麼,它的工作原理是什麼
- GNU是什麼?和Linux是什麼關係?Linux
- 域名是什麼?申請域名的流程是什麼?
- 什麼是雲端計算?什麼是公司網盤?
- 什麼是eval()?eval是用來幹什麼的?
- 什麼是 Nginx?Nginx
- 什麼是PHPPHP
- 什麼是PodcastAST
- 什麼是Flutter?Flutter
- 敏捷是什麼?敏捷
- SQL是什麼?SQL
- 什麼是Docker?Docker
- 什麼是反射?反射