一起學Spring之基礎篇

来源:https://www.cnblogs.com/hsiang/archive/2019/10/09/11612320.html
-Advertisement-
Play Games

本文主要講解Spring的基礎環境搭建以及演變由來,僅供學習分享使用,如有不足之處,還請指正。 ...


本文主要講解Spring的基礎環境搭建以及演變由來,僅供學習分享使用,如有不足之處,還請指正。

什麼是Spring ?

Spring是一個開源框架,用來處理業務邏輯層和其他層之間的耦合問題。因此Spring將面向介面開發的思想貫穿整個系統應用,且Spring是一個輕量級框架,所以在誕生之初,便風靡Java開發市場,得到了廣泛的認可與響應。

Spring基礎概念

依賴註入(DI:Dependency Injection)又叫控制反轉(IoC:Inversion of Control):將組件對象的控制權從代碼本身,轉移到外部容器。Spring容器也是一個IoC容器,用來管理所有的Java Bean,主要是通過BeanFactory來進行產生和管理Bean。

Spring框架搭建

1. 建立一個Java Project

Spring框架是即支持Java Project,又支持Dynamic Web Project,如下所示:

2. 導入Spring框架需要的Jar包

Spring框架搭建需要的包共6個,如下所示:

1 //日誌包
2 commons-logging-1.1.1.jar
3 //spring核心包
4 spring-aop-4.0.6.RELEASE.jar
5 spring-beans-4.0.6.RELEASE.jar
6 spring-context-4.0.6.RELEASE.jar
7 spring-core-4.0.6.RELEASE.jar
8 spring-expression-4.0.6.RELEASE.jar

3. 配置Spring配置文件

對於Java Project來說,applicationContext.xml必須放在src目錄,如下所示:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4 xsi:schemaLocation="http://www.springframework.org/schema/beans
 5  http://www.springframework.org/schema/beans/spring-beans.xsd">
 6      <!-- 此文件預設放置在src目錄 -->
 7      <!-- id表示唯一標識,class表示類型,必須為全路徑 -->
 8     <bean id="student" class="com.hex.first.Student">
 9         <property name="id" value="1"></property>
10         <property name="name" value="hex"></property>
11         <property name="age" value="20"></property>
12     </bean>
13 </beans>

對於配置文件中的Student類,定義如下:

 1 package com.hex.first;
 2 
 3 /**
 4  * 定義一個學生類
 5  * @author Administrator
 6  *
 7  */
 8 public class Student {
 9     
10     /*
11      * 學生ID
12      */
13     private int id;
14 
15     /*
16      * 學生姓名
17      */
18     private String name;
19     
20     /**
21      * 年齡
22      */
23     private int age;
24     
25     public int getId() {
26         return id;
27     }
28     public void setId(int id) {
29         this.id = id;
30     }
31     public String getName() {
32         return name;
33     }
34     public void setName(String name) {
35         this.name = name;
36     }
37     public int getAge() {
38         return age;
39     }
40     public void setAge(int age) {
41         this.age = age;
42     }
43     
44     @Override
45     public String toString() {
46         // TODO Auto-generated method stub
47         return "ID="+id+",Name="+name+",Age="+age;
48     }
49 }
View Code

4. 聲明對象

對於常規聲明對象和採用Spring獲取對象的方式如下:

 1 //常規New對象方法聲明一個對象
 2 Student student=new Student();
 3 student.setId(1);
 4 student.setName("hex");
 5 student.setAge(20);
 6 System.out.println(student);
 7 //通過Spring進行註入,Spring上下文對象
 8 ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
 9 //從Spring的IOC容器中獲取id為student的bean對象
10 Student student01=(Student) context.getBean("student");
11 System.out.println(student01);
View Code

5. 測試結果

如下所示:

採用Spring方式和傳統方式的區別有哪些

傳統方式全部採用硬編碼的方式,一旦有變動,就需要修改代碼,而Spring採用註入的方式,將可變的東西放在配置文件中,便於修改。

1. 首先假設一種場景,學生有一個學習課程的需求

關於課程的介面(ICourse),定義如下:

 1 /**
 2  * 定義一個課程介面
 3  * @author Administrator
 4  *
 5  */
 6 public interface ICourse {
 7     
 8     /**
 9      * 學習
10      */
11     void learn();
12 }
View Code

分別有兩個實現類:JavaCourse和HtmlCourse,代碼如下:

 1 package com.hex.first;
 2 
 3 /**
 4  * 學習Java課程
 5  * @author Administrator
 6  *
 7  */
 8 public class JavaCourse implements ICourse {
 9 
10     @Override
11     public void learn() {
12         System.out.println("學習Java課程。。。");
13 
14     }
15 
16 }
View Code

 1 package com.hex.first;
 2 
 3 /**
 4  * 學習Html課程
 5  * @author Administrator
 6  *
 7  */
 8 public class HtmlCourse implements ICourse {
 9 
10     @Override
11     public void learn() {
12         System.out.println("學習Html課程。。。");
13 
14     }
15 
16 }
View Code

如果一個學生要學習這兩門課程,有以下三種實現方案:

1. 第一種:原始的多態方法

在Student類中增加兩個方法,分別用來學習Java和Html,如下所示:

 1     /**
 2      * 學習Java
 3      */
 4     public void learnJava(){
 5         ICourse course=new JavaCourse();
 6         course.learn();
 7     }
 8     
 9     /**
10      * 學習Html
11      */
12     public void learnHtml(){
13         ICourse course=new HtmlCourse();
14         course.learn();
15     }
View Code

調用代碼如下:

1 //第1種,最原始的多態方法
2 System.out.println("第1種,最原始的多態方法:");
3 student.learnJava();
4 student.learnHtml();
View Code

備註:此方案導致學生和課程之間形成強耦合關係,假如需要增加一種學習Python語言的課程,需要增加介面的實現類(PythonCourse),修改Student類,增加learnPython方法,改動較大,或者有些學生只學其中一門課程,而另一些學生學兩門課程,採用此方案會比較麻煩。

2. 第二種:採用簡單工廠方法,將課程的創建抽離出來,由工廠統一管理。

在Student中增加一個學習(learn)方法:

1         /**
2      * 學習通過參數區分
3      * @param name
4      */
5     public void learn(String name){
6         ICourse course=CourseFactory.getCourse(name);
7         course.learn();
8     }
View Code

增加工廠類(CourseFactory)

 1 package com.hex.first;
 2 
 3 /**
 4  * 課程工廠
 5  * @author Administrator
 6  *
 7  */
 8 public class CourseFactory {
 9     
10     /**
11      * 獲取課程對象
12      * @param name
13      * @return
14      */
15     public static ICourse getCourse(String name){
16         if(name.equals("java")){
17             return new JavaCourse();
18         }else{
19             return new HtmlCourse();
20         }
21     }
22 }
View Code

然後客戶端調用時只需要傳字元串就行。如下所示:

1 //第2種,簡單工廠方法
2 System.out.println("第2種,簡單工廠方法:");
3 student.learn("java");
4 student.learn("html");
View Code

備註:此方案雖然將對象的創建剝離出來,由工廠進行管理,但是課程的類型還是硬編碼的,還是不夠完善。

3. 第三種:採用Spring的方式,實現對象的動態註入

在學生類中增加學習方法,參數是ICourse介面:

1         /**
2      * 傳遞介面
3      * @param course
4      */
5     public void learn(ICourse course){
6         course.learn();
7     }
8     
View Code

在Spring配置文件中,配置要註入的對象:

1 <!-- 兩個對象,沒有屬性,不需要賦值 -->
2 <bean id="java" class="com.hex.first.JavaCourse"></bean>
3 <bean id="html" class="com.hex.first.HtmlCourse"></bean>

通過Spring來獲取對象,實現動態控制:

1 //第3種,通過SpringIOC實現
2 System.out.println("第3種,通過SpringIOC實現:");
3 ICourse course=(ICourse)context.getBean("java");
4 student.learn(course);
5 ICourse course2=(ICourse)context.getBean("html");
6 student.learn(course2);
View Code

以上三種方式,均可以實現需求,至於採用哪種方案,可以依據具體實際場景而定。

備註

沒有傘的孩子,必須努力奔跑!

期待一樹花開,願你葉落歸來。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫里查看 https://github.com/h2pl/Java Tutorial 喜歡的話麻煩點下Star哈 文章首發於我的個人博客: www.how2playlife.com <! more 本文參考 htt ...
  • 本文的記憶體模型只寫虛擬機記憶體模型,物理機的不予描述。 Java記憶體模型 在Java中,虛擬機將運行時區域分成6中,如下圖: 由於類和方法的信息難以確定,不好設定大小,太大則影響年老代,太小容易記憶體溢出。 GC不好處理,回收效率低下,調優困難。 在上面的6種類型中,前三種是線程私有的,也就是說裡面存放 ...
  • 本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫里查看 https://github.com/h2pl/Java Tutorial 喜歡的話麻煩點下Star哈 文章首發於我的個人博客: www.how2playlife.com <! more 這是一個Java ...
  • 類型關係 Scala 支持在泛型類上使用型變註釋,用來表示覆雜類型、組合類型的子類型關係間的相關性 協變 ,變化方向相同,通常用在生產 假設 , 對於 ,則 也可看做 由於 Scala 標準庫中不可變 的定義為 ,因此 是 的子類型, 也是 的子類型,所以可直接將他們當作 使用。 逆變 ,變化方向相 ...
  • 前言 說真的,平常看源碼都是自己看完自己懂,很少有寫出來的衝動。 但是在寫演算法的時候,經常用到java中各種集合,其中也比較常用到remove方法。 remove有重載函數,分別傳入參數是索引index或者數據Object(指定泛型後自動轉換),如果指定泛型是其他數據類型還好,但是指定的是Integ ...
  • 前些天幫一個朋友做網站,全站都是靜態頁面,唯一需要用到後端開發的是他需要一個留言板。傳統的留言板一般都是提交後保存到資料庫,然後提供一個後臺的留言列表給管理人員看,我嫌麻煩,就決定留言提交到後臺直接發郵件出去,這樣就不用開發後臺頁面了,他也不需要登錄一個什麼後臺才能看留言,兩全其美,豈不美哉。 1、 ...
  • 方法一:修改pom.xml文件 方法二:在Terminal執行命令 mvn install -DskipTests 方法三:在Terminal執行命令 mvn install -Dmaven.test.skip=true 轉載於:https://blog.csdn.net/so_geili/arti ...
  • 小文:今天面試又搞砸了? 小 k:怎麼了? 小文:又一個大小寫轉換的題目感覺答錯了。 小 k:說來聽聽。 小文:將"hello world"轉換為首字母大寫"Hello World" 小 k:你的答案是什麼? 小文:用 capitalize 方法啊。 小 k:capitalize 方法只能將第一個單 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...