全國環保盃桌球錦標賽基隆登場 41支隊伍以球會友

第一次在基隆市舉辦的「全國第32屆環保盃桌球錦標賽」,自9日起一連三天在體育館熱鬧開打,市長林右昌也以地主台北網頁設計身份歡迎全國各縣市環保單位41支隊伍、近500名桌球好手來到基隆,並期許選手們除了以球會友,也別忘了好好欣新北清潔賞基隆的山海美景。

開幕典禮由基隆市長林右昌及環保署署長張子敬到場勉勵選手,並在台上進行開iphone維修球儀式。林右昌代表基隆市民歡迎全國各縣市選手的到來,希望在大FB行銷會的妥善安排下,能讓選手賓至如歸,展現最佳實力,並提醒選台北網頁設計手們除了透過比賽相互交流切磋球技,也別忘了盡情享受基隆的在地文化。

林右昌表示,這屆的環保盃桌球錦標賽是32年貨運來首度在基隆舉行,過去由於基隆市的運動場館場地環境條件不太好,因此無租車法舉辦全國賽事,這幾年來市府把包括市立體育館的運動空間及游泳池大幅整修,讓大家享受優質的運動環境,除了比賽之外銷售文案也歡迎大家在基隆住宿,並且進行觀光遊程,𣈱遊基隆的好山好水。

環保局指出,市府如何寫文案將安排選手前往有「網頁設計台灣龍珠」美譽的基隆嶼,以及海科館、和平島等地,進行環保網頁設計公司業務交流活動,讓各地的環保夥伴能夠對基隆有更進一步的瞭解。

環保盃桌球錦標賽是從環保署成立之初就開始舉辦,每年由包裝行銷各縣市環保局輪流辦理,今年已邁入第32年,除網頁設計讓各縣市環保人員有聯誼交流機會,也鼓勵大家運動強身,發揮團隊精神,讓工作更有效率。

基市府與法院推出青少年法治教育 培育「國民法官」超前部署

為全面提升學生法治教育素養,基隆市政府與基隆地方法院特別為全市高中學生,安排專業法律素養學習與公民實踐活動,第一批八斗高中的學生11日前往地院參觀,透過真實情境與模擬法庭學習法律知識,為培育「國民法官」超前部署。

這項青少年專業法律素養學習與公民實踐活動,是由林右昌市長與基隆地院李台北網頁設計麗玲院長大力促成,以專業的角度,為本市高中833位學生精心規劃「法FB行銷院設施導覽」、「青少年版模擬法庭」及「與法官有約」等系列學習活動,透過各活動體驗傳達各項法律知識,讓原本抽象的法律用語、知識變得更親近、更有趣。

林右昌在11日下午的開幕新北清潔儀式中指出,民主政治不只是投票選舉,公民才是民iphone維修主政治的基礎,在古代也不是每個人都有網頁設計公民權,身為公民既有權利也有責任,權利與責任之間就是法治的基礎,近年來包括司台北網頁設計法體制跟法院與人民的認知比較疏遠,因此他認為應該要為學生規劃建立法治觀念,讓大家成為負責任的公民。

林右昌說,雖然在學校中有公民跟法治教育,但比較難以引起銷售文案學生的興趣,感謝李院長跟法院同仁在百忙中安排這樣的課程,透過真實情境參觀與模網頁設計公司擬法庭等,希望讓同學建立更正確的法律價值觀念。

在導覽中,學生能近距離認識投標室、公證禮堂、法貨運律服務櫃台等與生活貼近的法院場網頁設計所,更特別安排學生參觀少年法庭與收容室,導覽過程同步進行青少年犯罪防治宣導,接著進行「模擬法庭」,學生必須預先了解法院精心準備的劇本,然後在法庭分別飾演法官、檢察官、書租車記官、法警及律師等,依著劇情完成如何寫文案一次審理程序,擔任證人的同學甚至能體驗變聲設備,過程十分真實!

在最後「與法官有約」的座談中,法官除了為學生解說模擬法庭中的法律知識,更現身說法,讓學生對司法官、檢察官等司法工作有更多認識,由於「國民法官」制度即將在2023年上路,透過這一系列的活動,法院也將逐步推動本市國民參與審判準備工作。

教育處表示,法治教育是社會基礎工程,法治素養是一項重要的公民包裝行銷素養,為了深化法治教育,將持續與法院合作辦理「高中法治教育與公民實踐活動」,規劃每位高中生在畢業前均能到法院參與體驗學習,全面提升本市學生公民與法治素養。

光靠撤資還不夠 外媒:擺脫化石燃料 國際合作有必要

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

科學家齊聲示警 美墨大牆將威脅逾千物種生存

摘錄自2018年07月26日中央社報導

全球2700多名科學家24日連署發信警告,若美國總統川普真如他所言在美墨邊界築牆,逾1000種動物將面臨嚴重的生存威脅。

川普想遏止非法移民入境美國,而擬在綿延3200公里的美墨邊境築牆。這封由保育團體「野生物保衛者」(Defenders of Wildlife)的皮特斯(Robert Peters)主筆,在期刊「生物科學」(BioScience)上登出的信件指出,半島大角羊、墨西哥灰狼及北美叉角羚羊這些已瀕絕的象徵性生物,都將因這道牆而面臨分散隔離所致的生存威脅。

而且當動物族群被迫分散時,牠們更難尋得配偶、食物,水源及安全棲地,面臨更高的滅絕風險。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

有毒藻類大爆發 波蘭關閉數十海灘

摘錄自2018年07月26日自由時報報導

波蘭衛生當局週三(25日)表示,由於熱浪引發大量有毒藻類爆發,已關閉該國波羅的海沿海的數十個海灘。

《法新社》報導,波蘭北部格坦斯克(Gdansk)的衛生官員奧古斯蒂尼亞克(Tomasz Augustyniak)表示,「這種藻類有毒,對健康構成威脅」。他提到,由於長期高溫炎熱的天氣,導致藍藻大爆發。本週,波蘭電視台也從空中拍攝到被大量藻類覆蓋的大海。

奧古斯蒂尼亞克表示,近年來,含有農場肥料和硝酸鹽、磷酸鹽的汙水流入波羅的海,引發藻類大量繁殖。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

比亞迪與戴姆勒合作電動汽車2014年有望面市

比亞迪高級副總裁廉玉波近日表示,比亞迪與奔馳合作的一款高端電動汽車目前已完成研發進入測試階段,預計2014年4月的北京車展就能面市。

據公開資料顯示,2010年5月27日,比亞迪與奔馳母公司戴姆勒簽署合同,在中國成立深圳比亞迪-戴姆勒新技術有限公司,雙方各佔50%股權,注冊資本為6億元人民幣。

與傳統的“市場換技術”中外合資企業模式不同,本著品牌平等和技術平等的合作方式,比亞迪與戴姆勒共同擁有一個新品牌。雙方從零部件、整車性能、整車標准各方面進行研發合作,德國戴姆勒方面隻提供方案,而比亞迪的研發團隊將親自參與具體實踐。

2011年10月31日,新京報曾報道,比亞迪與奔馳合作的電動車樣車設計已接近尾聲,預計售價為50萬元左右,2012年4月將於北京車展面市。但這款高端電動汽車卻遲遲不見上市。

除了這款高端電動汽車之外,比亞迪方面還有兩款新能源車型也處於研發之中。其中 “唐”是一款搭載2.0TID和大電機的混合動力SUV車型,該車的百公裡加速時間將縮短至3.9秒,預計將於2014年上市。另一款e6的升級版車型也在研發之中。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

Daimler 旗下Smart 將進軍中國電動車市場

目前中國不少大城市出現嚴重的空氣污染情況,有人歸咎是大城市汽車很多,排出廢氣所致,若多使用電動車將有望紓緩問題,中國電動汽車市場也受到關注。Daimler 旗下的 Smart 將有望成為首間在中國發售電動汽車的品牌。

Smart 決定在中國推出 Smart Fortwo ED 電動車,Fortwo ED 在德國的銷售情況理想,佔所有電動車銷量 4 成。

Fortwo ED 為短陣版本,擁有 74 匹馬力的電動摩打,最高時速達 125 公里,單次充電後的續航距離約 145 公里。

此外,Smart 的母公司 Daimler與中國的比亞迪合營的汽車品牌 Denza,首部電動車也會在明年夏天推出。量產型號將於明年 4 月在北京車展亮相。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

德KBA調查Model S著火事件 稱未發現製造商缺陷

據BusinessInsider報導,Tesla昨(2)日表示,德國聯邦汽車運輸管理局(KBA)在對近期發生的三起Model S著火事件調查後得出結論,沒有發現「與製造商相關的缺陷」。

Tesla在一份新聞稿中表示,該公司向KBA提供了事故的相關資料,並接到KBA的一封信。KBA在信中稱:「按照德國產品安全法,沒有必要採取進一步措施。」

今年11月,美國國家公路交通安全管理局(NHTSA)對Model S三起著火事件發起調查。雖然NHTSA的調查正在進行中,但至少德國發佈的結果會讓Tesla安心一些。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

Spring如何解決循環依賴?

介紹

先說一下什麼是循環依賴,Spring在初始化A的時候需要注入B,而初始化B的時候需要注入A,在Spring啟動后這2個Bean都要被初始化完成

Spring的循環依賴有兩種場景

  1. 構造器的循環依賴
  2. 屬性的循環依賴

構造器的循環依賴,可以在構造函數中使用@Lazy註解延遲加載。在注入依賴時,先注入代理對象,當首次使用時再創建對象完成注入

屬性的循環依賴主要是通過3個map來解決的

構造器的循環依賴

@Component
public class ConstructorA {

	private ConstructorB constructorB;

	@Autowired
	public ConstructorA(ConstructorB constructorB) {
		this.constructorB = constructorB;
	}
}
@Component
public class ConstructorB {

	private ConstructorA constructorA;

	@Autowired
	public ConstructorB(ConstructorA constructorA) {
		this.constructorA = constructorA;
	}
}
@Configuration
@ComponentScan("com.javashitang.dependency.constructor")
public class ConstructorConfig {
}
public class ConstructorMain {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext(ConstructorConfig.class);
		System.out.println(context.getBean(ConstructorA.class));
		System.out.println(context.getBean(ConstructorB.class));
	}
}

運行ConstructorMain的main方法的時候會在第一行就報異常,說明Spring沒辦法初始化所有的Bean,即上面這種形式的循環依賴Spring無法解決。

我們可以在ConstructorA或者ConstructorB構造函數的參數上加上@Lazy註解就可以解決

@Autowired
public ConstructorB(@Lazy ConstructorA constructorA) {
	this.constructorA = constructorA;
}

因為我們主要關注屬性的循環依賴,構造器的循環依賴就不做過多分析了

屬性的循環依賴

先演示一下什麼是屬性的循環依賴

@Component
public class FieldA {

	@Autowired
	private FieldB fieldB;
}
@Component
public class FieldB {

	@Autowired
	private FieldA fieldA;
}
@Configuration
@ComponentScan("com.javashitang.dependency.field")
public class FieldConfig {
}
public class FieldMain {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext(FieldConfig.class);
		// com.javashitang.dependency.field.FieldA@3aa9e816
		System.out.println(context.getBean(FieldA.class));
		// com.javashitang.dependency.field.FieldB@17d99928
		System.out.println(context.getBean(FieldB.class));
	}
}

Spring容器正常啟動,能獲取到FieldA和FieldB這2個Bean

屬性的循環依賴在面試中還是經常被問到的。總體來說也不複雜,但是涉及到Spring Bean的初始化過程,所以感覺比較複雜,我寫個demo演示一下整個過程

Spring的Bean的初始化過程其實比較複雜,為了方便理解Demo,我就把Spring Bean的初始化過程分為2部分

  1. bean的實例化過程,即調用構造函數將對象創建出來
  2. bean的初始化過程,即填充bean的各種屬性

bean初始化過程完畢,則bean就能被正常創建出來了

下面開始寫Demo,ObjectFactory接口用來生產Bean,和Spring中定義的接口一樣

public interface ObjectFactory<T> {
	T getObject();
}
public class DependencyDemo {

	// 初始化完畢的Bean
	private final Map<String, Object> singletonObjects =
			new ConcurrentHashMap<>(256);

	// 正在初始化的Bean對應的工廠,此時對象已經被實例化
	private final Map<String, ObjectFactory<?>> singletonFactories =
			new HashMap<>(16);

	// 存放正在初始化的Bean,對象還沒有被實例化之前就放進來了
	private final Set<String> singletonsCurrentlyInCreation =
			Collections.newSetFromMap(new ConcurrentHashMap<>(16));

	public  <T> T getBean(Class<T> beanClass) throws Exception {
		// 類名為Bean的名字
		String beanName = beanClass.getSimpleName();
		// 已經初始化好了,或者正在初始化
		Object initObj = getSingleton(beanName, true);
		if (initObj != null) {
			return (T) initObj;
		}
		// bean正在被初始化
		singletonsCurrentlyInCreation.add(beanName);
		// 實例化bean
		Object object = beanClass.getDeclaredConstructor().newInstance();
		singletonFactories.put(beanName, () -> {
			return object;
		});
		// 開始初始化bean,即填充屬性
		Field[] fields = object.getClass().getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);
			// 獲取需要注入字段的class
			Class<?> fieldClass = field.getType();
			field.set(object, getBean(fieldClass));
		}
		// 初始化完畢
		singletonObjects.put(beanName, object);
		singletonsCurrentlyInCreation.remove(beanName);
		return (T) object;
	}

	/**
	 * allowEarlyReference參數的含義是Spring是否允許循環依賴,默認為true
	 * 所以當allowEarlyReference設置為false的時候,當項目存在循環依賴,會啟動失敗
	 */
	public Object getSingleton(String beanName, boolean allowEarlyReference) {
		Object singletonObject = this.singletonObjects.get(beanName);
		if (singletonObject == null 
				&& isSingletonCurrentlyInCreation(beanName)) {
			synchronized (this.singletonObjects) {
				if (singletonObject == null && allowEarlyReference) {
					ObjectFactory<?> singletonFactory =
							this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						singletonObject = singletonFactory.getObject();
					}
				}
			}
		}
		return singletonObject;
	}

	/**
	 * 判斷bean是否正在被初始化
	 */
	public boolean isSingletonCurrentlyInCreation(String beanName) {
		return this.singletonsCurrentlyInCreation.contains(beanName);
	}

}

測試一波

public static void main(String[] args) throws Exception {
	DependencyDemo dependencyDemo = new DependencyDemo();
	// 假裝掃描出來的對象
	Class[] classes = {A.class, B.class};
	// 假裝項目初始化所有bean
	for (Class aClass : classes) {
		dependencyDemo.getBean(aClass);
	}
	// true
	System.out.println(
			dependencyDemo.getBean(B.class).getA() == dependencyDemo.getBean(A.class));
	// true
	System.out.println(
			dependencyDemo.getBean(A.class).getB() == dependencyDemo.getBean(B.class));
}

是不是很簡單?我們只用了2個map就搞定了Spring的循環依賴

2個Map就能搞定循環依賴,那為什麼Spring要用3個Map呢?

原因其實也很簡單,當我們從singletonFactories中根據BeanName獲取相應的ObjectFactory,然後調用getObject()這個方法返回對應的Bean。在我們的例子中
ObjectFactory的實現很簡單哈,就是將實例化好的對象直接返回,但是在Spring中就沒有這麼簡單了,執行過程比較複雜,為了避免每次拿到ObjectFactory然後調用getObject(),我們直接把ObjectFactory創建的對象緩存起來不就行了,這樣就能提高效率了

比如A依賴B和C,B和C又依賴A,如果不做緩存那麼初始化B和C都會調用A對應的ObjectFactory的getObject()方法。如果做緩存只需要B或者C調用一次即可。

知道了思路,我們把上面的代碼改一波,加個緩存。

public class DependencyDemo {

	// 初始化完畢的Bean
	private final Map<String, Object> singletonObjects =
			new ConcurrentHashMap<>(256);

	// 正在初始化的Bean對應的工廠,此時對象已經被實例化
	private final Map<String, ObjectFactory<?>> singletonFactories =
			new HashMap<>(16);

	// 緩存Bean對應的工廠生產好的Bean
	private final Map<String, Object> earlySingletonObjects =
			new HashMap<>(16);

	// 存放正在初始化的Bean,對象還沒有被實例化之前就放進來了
	private final Set<String> singletonsCurrentlyInCreation =
			Collections.newSetFromMap(new ConcurrentHashMap<>(16));

	public  <T> T getBean(Class<T> beanClass) throws Exception {
		// 類名為Bean的名字
		String beanName = beanClass.getSimpleName();
		// 已經初始化好了,或者正在初始化
		Object initObj = getSingleton(beanName, true);
		if (initObj != null) {
			return (T) initObj;
		}
		// bean正在被初始化
		singletonsCurrentlyInCreation.add(beanName);
		// 實例化bean
		Object object = beanClass.getDeclaredConstructor().newInstance();
		singletonFactories.put(beanName, () -> {
			return object;
		});
		// 開始初始化bean,即填充屬性
		Field[] fields = object.getClass().getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);
			// 獲取需要注入字段的class
			Class<?> fieldClass = field.getType();
			field.set(object, getBean(fieldClass));
		}
		singletonObjects.put(beanName, object);
		singletonsCurrentlyInCreation.remove(beanName);
		earlySingletonObjects.remove(beanName);
		return (T) object;
	}

	/**
	 * allowEarlyReference參數的含義是Spring是否允許循環依賴,默認為true
	 */
	public Object getSingleton(String beanName, boolean allowEarlyReference) {
		Object singletonObject = this.singletonObjects.get(beanName);
		if (singletonObject == null
				&& isSingletonCurrentlyInCreation(beanName)) {
			synchronized (this.singletonObjects) {
				singletonObject = this.earlySingletonObjects.get(beanName);
				if (singletonObject == null && allowEarlyReference) {
					ObjectFactory<?> singletonFactory =
							this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						singletonObject = singletonFactory.getObject();
						this.earlySingletonObjects.put(beanName, singletonObject);
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return singletonObject;
	}
}

我們寫的getSingleton的實現和org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)的實現一模一樣,這個方法幾乎所有分析Spring循環依賴的文章都會提到,這次你明白工作原理是什麼了把

總結一波

  1. 拿bean的時候先從singletonObjects(一級緩存)中獲取
  2. 如果獲取不到,並且對象正在創建中,就從earlySingletonObjects(二級緩存)中獲取
  3. 如果還是獲取不到就從singletonFactories(三級緩存)中獲取,然後將獲取到的對象放到earlySingletonObjects(二級緩存)中,並且將bean對應的singletonFactories(三級緩存)清除
  4. bean初始化完畢,放到singletonObjects(一級緩存)中,將bean對應的earlySingletonObjects(二級緩存)清除

歡迎關注

參考博客

[1]https://mp.weixin.qq.com/s/gBr3UfC1HRcw4U-ZMmtRaQ
[2]https://mp.weixin.qq.com/s/5mwkgJB7GyLdKDgzijyvXw
比較詳細
[1]https://zhuanlan.zhihu.com/p/84267654
[2]https://juejin.im/post/5c98a7b4f265da60ee12e9b2

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

一起玩轉微服務(10)——spring boot介紹

對於Spring,相信大家都非常熟悉,從出現開始,一直是企業級開發的主流。但是隨着軟件的發展和應用開發的不斷演化,它的一些缺點也逐漸胡暴露了出來,下面,我們就一起看一下Spring的發展歷程並且認識一下Spring Boot。

由來

在Spring 1.x的時候,所有的配置都通過XML,隨着項目的擴大,需要頻繁的在java和XML之間切換。 在Spring 2.x的時候,已經開始逐步替換掉XML配置。在Spring 3.x的時候,已經開始提供java的配置方式,在4.x的時候,已經全部推薦使用java配置的方式。隨着動態語言的流行,java的開發顯得格外的繁瑣,體現在配置的複雜、開發效率低下、部署以及與第三方的集成繁雜,這個時候Spring Boot應運而生。

 

 

 Spring Boot 是由 Pivotal 團隊提供的全新框架,其設計目的是用來簡化新 Spring 應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。簡化了基於 Spring 的應用開發,通過少量的代碼就能創建一個獨立的、產品級別的 Spring 應用。Spring Boot 為 Spring 平台及第三方庫提供開箱即用的設置,減少與第三方庫集成的複雜度。 Spring Boot 的核心思想就是約定大於配置,多數 Spring Boot 應用只需要很少的 Spring 配置。採用 Spring Boot 可以大大的簡化你的開發模式,所有你想集成的常用框架,它都有對應的組件支持。

 

特性

1.方便地創建獨立的Spring應用,為基於Spring的開發提供更快的入門體驗。2.內置嵌入tomcat,無需生成war文件。3.簡化maven配置。4.自動配置Spring,更快、更方便的與第三方應用整合,比如消息隊列、緩存等在企業級開發中常用的組件。5.提供大型項目中的非功能特性。如:指標、安全、健康檢查及外部配置。6.開箱即用,無需代碼生成,也無需XML配置,同時也能夠通過修改默認值來滿足待定的需求。

四大神器

自動配置

Spring Boot 的自動配置功能可基於類路徑檢測自動為運行中的應用配置依賴關係,不需要提供額外的XML配置。

Starters

Spring Boot 可提供一系列稱為 POM Starters 的精細依賴關係。Spring Boot 熟知如何配置這些依賴關係,同時讓組織能夠擴展 Spring Boot 來配置自定義的依賴關係。

Actuator

Actuator 可提供運行狀況檢查和指標等生產就緒型功能。這些功能通過 Spring Boot 應用內的 REST 終端提供。只需要簡單的配置就可以實現強大的監控和檢查。

開發工具

這些工具旨在縮短開發和測試周期,其中包括一個可在資源變更時觸發瀏覽器刷新的嵌入式 LiveReload 服務器。這些工具還提供了應用自動重啟功能,只要類路徑上的文件發生更改,該功能更即可啟動。重啟技術使用兩種類加載器。未更改的分類(例如來自第三方 JAR 的類)被加載到基礎類加載器,而開發中的分類則被加載到重啟類加載器。當應用重啟時,重啟類加載器會被丟棄,同時創建一個新的類加載器。這種方法意味着應用重啟的速度通常要比“冷啟動”的速度快得多,因為基礎類加載器已準備就緒且已填充完畢。從而快速實現應用的熱部署,對於簡單的修改這種場景能夠非常有效的提高效率。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心