簡單回顧
1、什麼是Spring框架?
Spring是一個開放源代碼的設計層面框架,他解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向接口的編程思想貫穿整個系統應用。
Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson創建。簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式) 輕量級開源框架。
2、Spring框架有哪些特徵?
(1)輕量:完整的Spring框架可以在1MB多的JAR文件發佈,而且是非侵入式的:Spring應用中的對象不依賴於Spring的特定類。
(2)控制反轉(Inversion of Control ):促進低耦合,當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象。你可以認爲IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
JNDI http://blog.csdn.net/zhaosg198312/article/details/3979435
(3)面向切面(Aspect Oriented Program):Spring提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務進行內聚性的開發。應用對象只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支持。
(4)容器:Spring**包含並管理應用對象的配置和生命週期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創建——基於一個可配置原型(prototype)**,你的bean可以創建一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是如何相互關聯的。
(5)框架:Spring可以將簡單的組件配置、組合成爲複雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件裏。Spring也提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發留給了你。
環境初步搭建
開發環境:idea
1、選擇左側箭頭Create New Project,出現右側彈框後,選擇Spring,記得在右側箭頭處打鉤,然後就可以Next。
2、Iidea會自動幫你下好Spring的jar包(所以上步操作需要聯網)和spring-config.xml文件
舉個例子介紹框架
普通寫法:
1、創建一個實體類HelloJoiner,有三個屬性name,grade,department,以及對應的set方法,爲了輸出重寫了tostring方法。
2、創建一個TestHelloJoiner類,要輸出HelloJoiner的實例化對象需要三步(如圖)。
開啓debug測試,發現在(1、創建對象時)初始化構造器,之後的set方法逐步調用。
框架寫法
1、第一步實體類不用動,在spring-config裏面加上(如下圖)
<?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 id="helloJoiner" class="com.entity.HelloJoiner">
<property name="name" value="卓小音"></property>
<property name="grade" value="2015級"></property>
<property name="department" value="產品部"></property>
</bean>
</beans>
2、配置好HelloJoiner的信息後,要輸出HelloJoiner的實例化對象也需要三步(如圖)。
開啓Debug,發現在(1、創建Spring的IOC對象時)就已經調用了初始化,和所有的set方法。
IOC和DI
IOC控制反轉
應用程序不再負責依賴對象的創建和維護,而是由外部容器負責創建和維護。
舉一個例子:
在我們卓音工作室,每位部門成員都有一件屬於自己部門的文化衫。
定義一個文化衫接口類
其中,前端,後端,產品部分別實現這個文化衫接口類
package com.entity.goods.impl;
import com.entity.goods.CultureClothes;
/**
* FrontClothesImpl前端文化衫的實現類
*
* @author zhaiaxin
* @time: 2017/9/24 18:29.
*/
public class FrontClothesImpl implements CultureClothes{
@Override
public void printClothes() {
System.out.println("my clothes has a cute lion");
}
}
package com.entity.goods.impl;
import com.entity.goods.CultureClothes;
/**
* BackClothesImpl後端文化衫的實現類
*
* @author zhaiaxin
* @time: 2017/9/24 18:26.
*/
public class BackClothesImpl implements CultureClothes{
@Override
public void printClothes() {
System.out.println("my clothes has a cute orang");
}
}
package com.entity.goods.impl;
import com.entity.goods.CultureClothes;
/**
* ProductClothesImpl產品文化衫的實現類
*
* @author zhaiaxin
* @time: 2017/9/24 18:30.
*/
public class ProductClothesImpl implements CultureClothes{
@Override
public void printClothes() {
System.out.println("my clothes has a cute dog");
}
}
剛開始,身爲一個正式的成員,必須在new自己的同時new自己部門的文化衫(找一件白短袖自己去畫上自己部門的logo)
後來,由於潮流的改變,大家不滿足於過去文化衫陳舊的款式,每年都想要最新樣式的文化衫,但是每個人按照之前的方式再去自己new,這樣做太過麻煩,於是把文化衫製作的任務交給服裝廠。
大家只需要給服裝廠說出自己的部門logo,就可以撒手不管了,很省事。
直到今天,卓音的成員已成爲懶癌患者,連自己去聯繫服裝廠做文化衫都懶得動,於是將全部的任務都交給一個負責人,負責人統一管理各個部門的文化衫。
當自己需要自己部門的文化衫時,給負責人說一下,負責人就分發給你。(負責人的作用就相當於IOC容器)
上述例子簡要介紹了下IOC是怎麼產生的。
首先就是當joiner需要一個cultureClothes對象的時候,這時候就產生了依賴關係,各種文化衫就是joiner的依賴對象,剛開始的時候,joiner需要依賴對象的時候,需要自己去new一個對象,這時候joiner和依賴對象的耦合度是最高的。
在依賴對象類型多的時候,joiner來管理就變得很麻煩,所以後來就產生了工廠,採用工廠設計模式,把依賴對象的創建過程交給工廠去管理,我們只需要管理一個工廠就好,這時候person和依賴對象的耦合程度就降低了。
後來又產生了使用IOC容器去管理我們的依賴對象,這時候在我們的代碼不會看到new依賴對象,只需要配置文件就好,通過IOC達到鬆耦合的目的,讓Spring管理應用對象的配置和生命週期,而我們不需要去new對象。
DI依賴注入
構造注入
就是通過構造方法把依賴對象傳入,在Spring配置文件這麼寫就好。 (圖中Joiner的構造方法是有參方法,且參數是一個引用類型,若爲基本類型,則把 <constructor-arg type="com.entity.goods.CultureClothes" ref="backClothes">
中的ref屬性改爲value即可)
</constructor-arg>
設值注入
設值注入就是通過setter方法把依賴的對象傳入,在Spring中做如下配置即可。
IOC容器
IOC容器的基礎
org.springframework.beans
和org.springframework.context
這兩個包是IOC容器的基礎,要使用Spring的IOC功能,需要導入這兩個jars。
IOC容器的作用
IOC容器的主要作用就是管理我們beans,只需要我們把配置文件寫好,IOC容器就會根據配置信息提供給我們想要的beans,在需要對象的時候可以直接和IOC容器去要,不需要手動去new一個對象。
IOC容器的實現
Spring提供了兩種類型的IOC容器的實現:
BeanFactory:IOC容器的基本實現。他是訪問bean的頂層接口,提供了能夠管理任何類型的對象的高級配置機制,就是提供了配置bean的框架和一些基本的功能。
ApplicationContext 提供了更多高級特性,是BeanFactory的子接口,在BeanFactory的基礎上添加了 許多企業專用的功能,它是BeanFactory的超集,所以大多數情況下org.springframework.context.ApplicationContext
這個接口代表着IOC容器,它負責對象的實例化配置和裝配。這是他們的繼承關係:
ApplicationContext的兩個主要實現類:
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//從ClassPath中加載XML配置文件
ApplicationContext context1 = new FileSystemXmlApplicationContext("F:\\workSpace\\axin\\Spring\\src\\spring-config.xml");//從文件系統中加載XML配置文件
Bean作用域
默認作用域:單例模式scope="singleton"
1、 prototype:允許Bean的定義可以被實例化多次。每次調用都創建一個新的實例。
2、request:在一次http請求中,每個Bean對應一個實例。僅在基於web的Spring上下文中才有效。
3、 session:在一個HTTP Session中,每個Bean對應一個實例。僅在基於web的Spring上下文中才有效。
4、global-session:在一個全局的HTTP Session中,每個Bean對應一個實例。僅在Portlet上下文中才有效。
參考
Spring系列http://blog.csdn.net/cflys/article/category/6882976
Spring官方文檔:https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-introduction