目錄
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注入和構造方法兩種實現方法
- 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很相似。
- 可以發佈事件,對事件感興趣的Bean可以接收到這些事件。
- 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。
- IOC和DI實現
依賴注入的作用是在使用Spring框架創建對象時,動態地將其所依賴的對象注入Bean組件中,其實現方式通常有兩種:一種是屬性setter()方法注入;另一種是構造方法注入。具體介紹如下:
- 屬性setter()方法注入:IoC容器使用setter()方法注入被依賴的實例。通過調用無參構造器或無參靜態工廠方法實例化Bean後,調用該Bean的setter()方法即可實現基於setter()方法的依賴注入。該方式簡單、直觀,而且容易理解,所以Spring的設置注入被大量使用。
- 構造方法注入:IoC容器使用構造方法注入被依賴的實例。基於構造方法的依賴注入通過調用帶參數的構造方法來實現,每個參數代表着一個依賴。
實例演示
1. setter()方法實現依賴注入
- 創建項目,引入jar包,發佈到類路徑下
- 在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("用戶登錄");
}
}
- 創建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實例,也就是對象嘛。
- 創建測試類
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。
- 在創建一個接口UserService
package com.ssm.ioc_di;
public interface UserService {
public void login();
}
- 重點,創建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");
}
}
- 在配置文件中創建一個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這個對象。
- 創建依賴注入測試類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從零學起》