Spring是一種輕量級的開發框架,它主要的功能有IOC和AOP,能夠實現組件之間的解耦。例如: 有兩個組件(對象/bean),一個A組件,一個B組件,若是A組件想要包含B組件的屬性,就必須在A組件中定義一個B組件對象的屬性。然而在Spring框架中,Spring容器會自動幫你判斷,兩個組件之間是否有聯繫,會自動將B組件注入A組件中,而不須要手動建立,以此來達到組件之間解耦的目的。spring
我舉得作屢次數例子,就是你想買房,各處跑,很累,因此你找到了中介,spring就是中介,有了中介之後,你和房子的主人之間的關係變淡(耦合度下降),你更可能是在和中介(spring)交互apache
在給你們舉一個栗子,就是如今不少家庭都是經過京東到家上面購買蔬菜,這樣就下降了你和蔬菜店的強關係,要是你常常買的一家店倒閉了,不要緊你能夠在京東上面的其餘店上面在買其餘的菜菜編程
Spring的優點緩存
1.非侵入式設計tomcat
Spring是一種非侵入式(non-invasive)框架,它可使應用程序代碼對框架的依賴最小化。安全
對你的代碼侵入比較低在aop裏面提現的很充分,侵入比較高服務器
2.方便解耦、簡化開發app
Spring就是一個大工廠,能夠將全部對象的建立和依賴關係的維護工做都交給Spring容器的管理,大大的下降了組件之間的耦合性。框架
3.支持AOPmaven
Spring提供了對AOP的支持,它容許將一些通用任務,如安全、事物、日誌等進行集中式處理,從而提升了程序的複用性。
4.支持聲明式事務處理
只須要經過配置就能夠完成對事物的管理,而無須手動編程。
5.方便程序的測試
Spring提供了對Junit等測試方式的支持,能夠經過註解方便的測試Spring程序。
6.方便集成各類優秀框架
Spring不排斥各類優秀的開源框架,其內部提供了對各類優秀框架(如Struts、Hibernate、MyBatis、Quartz等)的直接支持。
7.下降Jave EE API的使用難度。
Spring對Java EE開發中很是難用的一些API(如JDBC、JavaMail等),都提供了封裝,使這些API應用難度大大下降。
低侵入式設計(對你的代碼侵入比較低,在aop裏面體現的很充分,異常加強、環繞加強)
獨立於各類應用服務器(spring項目各類服務器均可以部署,tomcat,jetty,apache,jboss都行)
依賴注入特性將組件關係透明化,下降了耦合度
面向切面編程特性容許將通用任務(日誌收集,事務管理)進行集中式處理(aop來處理)
與第三方框架的良好整合(spring就跟一個主板同樣,主流的框架均可以無縫集成)
Spring 最認同的技術是控制反轉的依賴注入(DI)模式。控制反轉(IoC)是一個通用的概念,它能夠用許多不一樣的方式去表達,依賴注入僅僅是控制反轉的一個具體的例子。
當編寫一個複雜的 Java 應用程序時,應用程序類應該儘量的獨立於其餘的 Java 類來增長這些類可重用可能性,當進行單元測試時,可使它們獨立於其餘類進行測試。依賴注入(或者有時被稱爲配線)有助於將這些類粘合在一塊兒,而且在同一時間讓它們保持獨立。
到底什麼是依賴注入?讓咱們將這兩個詞分開來看一看。這裏將依賴關係部分轉化爲兩個類之間的關聯。例如,類 A 依賴於類 B。如今,讓咱們看一看第二部分,注入。全部這一切都意味着類 B 將經過 IoC 被注入到類 A 中。
依賴注入能夠以向構造函數傳遞參數的方式發生,或者經過使用 setter 方法 post-construction。因爲依賴注入是 Spring 框架的核心部分,因此我將在一個單獨的章節中利用很好的例子去解釋這一律念。
Spring 框架的一個關鍵組件是面向方面的程序設計(AOP)框架。一個程序中跨越多個點的功能被稱爲橫切關注點,這些橫切關注點在概念上獨立於應用程序的業務邏輯。有各類各樣常見的很好的關於方面的例子,好比日誌記錄、聲明性事務、安全性,和緩存等等。
在 OOP 中模塊化的關鍵單元是類,而在 AOP 中模塊化的關鍵單元是方面。AOP 幫助你將橫切關注點從它們所影響的對象中分離出來,然而依賴注入幫助你將你的應用程序對象從彼此中分離出來。
Spring 框架的 AOP 模塊提供了面向方面的程序設計實現,能夠定義諸如方法攔截器和切入點等,從而使實現功能的代碼完全的解耦出來。
Core Container是Spring的核心容器,Spring Core是框架最基礎的部分,提供了IoC特性
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.5.RELEASE</version> </dependency>
配置文件:你能夠在網上找,須要頭部的beans約束 <?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 1.獲取class全類名,經過反射建立一個Student類的空對象 2.經過property獲取到Student類的屬性name,而且調用 setName()方法將張三賦值給name屬性 因此Student類裏面必須提供set方法,不然報錯 --> <bean id="student" class="com.bdqn.zmj.entity.Student"> <property name="name" value="張三"/> </bean> </beans>
public class Student { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } } public class Main { /* spring ioc實質: 是一個map,裏面裝了全部被spring管理的(bean)對象 因此就是一個容器 spring ioc功能:管理組件(bean/對象) 管理指的是:建立,初始化,銷燬等等生命週期 因此下面我用spring建立一個Student對象 */ public static void main(String[] args) { //1.加載核心配置文件(初始化ioc容器) //初始化ioc容器後,學生對象已經爆保存到ioc裏面去了 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.從ioc容器裏面獲取Student對象 Student student = ctx.getBean("student", Student.class); System.out.println(student.getName()); } }