教你學會SSM框架第一步,重要的Spring基礎

1.1 Spring概述

1.1.1 什麼是Spring

Spring是一個以IOC(控制反轉)和AOP爲內核的框架,IOC是Spring的基礎,IOC實現的是一種控制,簡單說就是,以前調用new構造方法來創建對象,現在變成使用了Spring來,DI(依賴注入)與IOC是一樣的含義,從兩個角度來看,DI就是對象的屬性,已經注入了值,直接使用即可。

1.1.2 Spring的下載以及目錄結構

使用Spring框架進行開發需要使用到Spring框架包和第三方依賴包。

1. Spring框架包

下載地址爲Spring下載

選擇最上面一個壓縮包下載,libs目錄下包含60個JAR文件,JAR包分爲三類。
整個Spring框架由20多個模塊組成,libs目錄下Spring爲每個模塊都提供了這三類JAR壓縮包,解壓後如下
在這裏插入圖片描述
在這裏插入圖片描述

在libs目錄中,有四個Spring的基礎包,分別對應Spring核心容器的4個模塊,具體介紹見下
在這裏插入圖片描述

2. 第三方依賴包

使用Spring進行開發,還需要依賴commons.logging的JAR包。
下載地址爲commons-logging

解壓就可以結束

對於初學者,只需要將Spring的4個基礎包以及commons-logging.jar包複製到項目的lib目錄下,並且發佈到類路徑中就可以了。

1.2 控制反轉和依賴注入

1.2.1 什麼是控制反轉

Spring中的IOC方式對象的生命週期由Spring框架提供的IOC容器來管理,直接從IOC容器中獲取一個對象,控制對象的創建不在由程序控制,而是由IOC容器控制了

  • IOC是藉助於第三方實現具有依賴關係對象之間的解耦,如圖,把所有對象類封裝後,通過IOC容器來關聯這些對象類,這樣對象與對象之間就通過IOC容器來聯繫,對象與對象之間無聯繫
    在這裏插入圖片描述
  • 程序在沒有使用IOC之前,對象A依賴對象B,也就是說A對象在實例化或者運行到某一點時,自己必須主動創建對象B或者使用已經創好的B,這樣看來創建對象的控制權都在程序之中,如果引入了IOC容器,對象A和B之間失去了聯繫,那麼當對象A實例化或者運行時,如果到了需要B的地方,IOC容器會自動創建一個B注入到對象A需要B的地方,由此A就獲得依賴對象B的過程,創建B對象由程序主動到被動的接受IOC創建的B對象,控制對象的創建權力顛倒過來了,就叫做控制反轉

1.2.2 依賴注入

由IOC容器在運行期間動態的將B對象(某種依賴關係)注入對象之間,例如,將對象B注入給A的成員變量

  • 依賴注入和控制反轉實際上就是同一件事情的不同描述

IOC和DI的實現爲程序開發帶來了許多方面的便利,最容易想到的就是解耦,降低開發模塊間的聯繫

1.2.3 IOC和DI的實現

Spring框架的主要功能是通過核心容器來實現的.

1. BeanFactory

2. ApplicationContext

IOC和DI有setter注入和構造方法兩種實現方法

  1. Spring核心容器
    Spring框架的兩個最基本和最重要的包是org.springframework.beans.factory(該包中的主要接口是BeanFactory)和org.springframework.context(該包中的主要接口是ApplicationFactory)。
    Spring IoC框架的主要組件有Beans、配置文件applicationContext.xml、BeanFactory接口及其相關類、ApplicationContext接口及其相關類。
    (1)Beans是指項目中提供業務功能的Bean,就是容器管理的Bean.Beans就是一個常見的javaBean類,java類。
    (2)Spring中對Bean的管理在配置文件中進行,Spring容器中內編輯文件管理Bean又叫做Bean的裝配,實際上是說告訴容器需要哪些Bean,以及容器如何使用Ioc將它們配合起來。Bean的配置文件是一個XML文件,命名爲application.xml。
    (3)配置文件中包含Bean的id,類,屬性以及其值,包含一個< beans>元素和好幾個< bean>子元素,Spring IoC框架可根據Bean的id從Bean配置文件中取得該Bean的類,並生成該類的一個實例對象,繼而從配置文件中獲得該對象的屬性和值
    application.xml配置文件圖示

(4)BeanFactory採用了工廠設計模式,即Bean容器模式,負責讀取Bean的配置文件,管理對象的生成、加載,維護Bean對象與Bean對象之間的依賴關係,負責Bean的生命週期。對於簡單的應用程序來說,使用BeanFactory就已經足夠管理Bean了,在對象的管理上可以獲得許多便利性。

org.springframework.beans.factory.BeanFactory是一個頂級接口,包含管理Bean的各種方法。Spring框架也提供了一些實現該接口的類。
org.springframework.beans.factory.xml.XmlBeanFactory是BeanFactory常用的實現類,根據配置文件中的定義裝載Bean。要創建XmlBeanFactory,需要傳遞一個FileInputStream對象,該對象把XML文件提供給工廠。代碼可以寫成:

BeanFactory factory=new XmlBeanFactory(new 
FileInputStream("application.xml");

Beanfactory常見的方法如下

  • getBean(String name)根據id生成該Bean的對象
  • getBean(String name,Class requiredType)根據id和相關的類生成該Bean的對象

(5) ApplicationContext接口提供高級功能的容器,基本功能與BeanFactory很相似。

  1. 可以發佈事件,對事件感興趣的Bean可以接收到這些事件。
  2. ApplicationContext接口的常用實現類有以下3個。
      FileSystemXmlApplicationContext:從文件系統中的XML文件加載上下文中定義的信息。
      ClassPathXmlApplicationContext:從類路徑中的XML文件加載上下文中定義的信息,把上下文定義的文件當成類路徑資源。
      XmlWebApplicationContext:從Web系統中的XML文件加載上下文中定義的信息。
    其中,FileSystemXmlApplicationContext和ClassPathXmlApplicationContext的代碼編寫如下:
ApplicationContext context=new
 FileSystemXmlApplicationContext("d:/applicationContext.xml
");

ApplicationContext context=new 
ClassPathXmlApplicationContext("applicationContext.xml ");

第1種使用文件系統的方式來查詢配置文件,此時applicationContext.xml文件位於D盤下。第2種使用類路徑來查詢配置文件,此時applicationContext.xml文件位於項目的src目錄底下。
FileSystemXmlApplicationContext和ClassPathXmlApplicationContext的區別是:FileSystemXmlApplicationContext只能在指定的路徑中查詢applicationContext.xml配置文件,而ClassPathXmlApplicationContext可以在整個類路徑中查applicationContext.xml。

  1. IOC和DI實現
    依賴注入的作用是在使用Spring框架創建對象時,動態地將其所依賴的對象注入Bean組件中,其實現方式通常有兩種:一種是屬性setter()方法注入;另一種是構造方法注入。具體介紹如下:
  • 屬性setter()方法注入:IoC容器使用setter()方法注入被依賴的實例。通過調用無參構造器或無參靜態工廠方法實例化Bean後,調用該Bean的setter()方法即可實現基於setter()方法的依賴注入。該方式簡單、直觀,而且容易理解,所以Spring的設置注入被大量使用。
  • 構造方法注入:IoC容器使用構造方法注入被依賴的實例。基於構造方法的依賴注入通過調用帶參數的構造方法來實現,每個參數代表着一個依賴。

實例演示

1. setter()方法實現依賴注入

  1. 創建項目,引入jar包,發佈到類路徑下

在這裏插入圖片描述

  1. 在src目錄下創建接口,定義方法,注意包名,自己創建
package com.ssm.ioc_di;

public interface UserDao {
	public void login();
}

3 創建接口的實現類,實現接口中的方法

package com.ssm.ioc_di;

public class UserDaoImpl implements UserDao{

	@Override
	public void login() {
		// TODO Auto-generated method stub
		System.out.println("用戶登錄");
	}

}

  1. 創建Spring的配置文件,並在其中配置一個id爲UserDao的Bean
<?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-4.3.xsd">
        		<!-- 將指定類配置給Spring,讓Spring創建其對象的實例  -->
		<bean id="userDao" class="com.ssm.ioc_di.UserDaoImpl">
</beans>

表示在Spring容器中創建一個id等於userDao的Bean實例,也就是對象嘛。

  1. 創建測試類
package com.ssm.ioc_di;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;



public class IoC {

		public static void main(String [] args)
		{
			ApplicationContext applicationcontext=new ClassPathXmlApplicationContext("applicationContext.xml");
			
			UserDao userDao=(UserDao)applicationcontext.getBean("userDao");
			userDao.login();
		}
}

applicationcontext.getBean(“userDao”)方法獲取Spring容器中創建的實例,傳入的參數是Bean的id。

  1. 在創建一個接口UserService
package com.ssm.ioc_di;

public interface UserService {
	public void login();
}

  1. 重點,創建UserService接口的實現類,並在類中聲明userDao屬性,並添加屬性的setter方法;同時實現login方法
package com.ssm.ioc_di;

public class UserServiceImpl implements UserService {
	private UserDao userDao;
	
	public void setUserDao(UserDao userDao)
	{
		this.userDao=userDao;
	}
	@Override
	public void login() {
		// TODO Auto-generated method stub
		this.userDao.login();
		System.out.println("userService login");
	}

}

  1. 在配置文件中創建一個id爲userService的Bean,用於實例化UserServiceImpl類的信息,並將name爲userDao的實例注入userService中
<?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-4.3.xsd">
        		<!-- 將指定類配置給Spring,讓Spring創建其對象的實例  -->
		<bean id="userDao" class="com.ssm.ioc_di.UserDaoImpl">
		</bean>
		<bean id="userService" class="com.ssm.ioc_di.UserServiceImpl">
		<property name="userDao" ref="userDao">
		</property>
		</bean>
</beans>

< property>元素負責調用Bean實例中的setUserDao方法完成屬性賦值,實現依賴注入,name屬性表示Bean實例中的相應屬性名,ref用於指定其屬性值,對應的id=userDao這個對象。

  1. 創建依賴注入測試類DI
package com.ssm.ioc_di;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DI {
	public static void main(String[] args) {
		// 1.初始化Spring容器,加載配置文件
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		// 2.通過容器獲取userService實例
		UserService userService = (UserService) applicationContext.getBean("userService");
		// 3.調用實例中的login()方法
		userService.login();
	}
}

好啦,小小實例到這裏就結束啦

本博客來源於《Spring+Spring MVC+MyBatis從零學起》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章