1、spring導包
匯入maven包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
在 External Libraries 中可以看到
- spring-core:包含Spring框架基本的核心工具類,Spring其他元件都要用到這個包裡面的類,是其他元件的基本核心。
- spring-beans:所有應用都要用到的 jar 包,它包含訪問配置檔案、建立和管理Bean 以及進行 ioc 或Di操作相關的所有類
- spring-context:Spring提供了在基礎Ioc功能上的擴充套件服務,還提供了許多企業級服務的支援
- spring-expression:定義了Spring的表示式語言‘
2、spring的核心容器
spring框架的兩大核心:BeanFactory(bean工廠) 和 ApplicationContext(配置上下文)
-
BeanFactory:它提供了完整的IoC服務支援。簡單來說,BeanFactory就是一個管理Bean的工廠,他主要負責初始化各種Bean,並呼叫他們的生命週期方法
-
applicationContext: 他是BeanFactory 的子介面,也被稱為應用上下文,有springframework.content.ApplicationContext 介面定義,不僅包含了BeanFactory的所有功能,還新增了對國際化、資源訪問、事件傳播等方面的支援。
通過ClassPathXmlApplicationContext建立
ClassPathXmlApplicationContext會從類路徑classPath中尋找指定的XML配置檔案,找到並裝載完成ApplicationContext的例項化工作,其使用語法
ApplicationContext context = new ClassPathXmlApplicationContext(String configLocation);
建立Spring容器後,就可以獲得Spring容器中的Bean。Spring獲取Bean的例項通常採用以下兩種方式
- Object getBean(String name): 根據Bean的id或者name
T getBean(Class requriedType) 根據class類獲取Bean的例項
3.Hello World
-
介面
public interface UserDao { void say(); }
-
介面的實現類
public class UserDaoImpl implements UserDao { public void say() { System.out.println("UserDao 層"); } }
-
applicationContext.xml
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 將指定類配置給Spring,讓Spring建立其物件的例項 --> <!-- 現在UserDaoImpl 已經託管到 spring配置檔案中,直接調即可--> <bean id="userDao" class="com.bm.dao.UserDaoImpl"/> </beans>
-
測試
public class TestIOC { public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) context.getBean("userDao"); userDao.say(); } }
4、依賴注入
依賴注入(DI)和控制反轉(IOC)的含義相同,只不過這兩個稱呼是從兩個角度描述的同一個概念。
當某個Java物件(呼叫者)需要呼叫另一個Java物件(被呼叫者,即被依賴物件)時,在傳統模式下,呼叫者通常會採用“new 被呼叫者” 的程式碼方式來建立物件,這種方式會導致呼叫者與被呼叫者之間的耦合性增加,不利於後期專案的升級和維護。
在使用Spring框架之後,物件的例項不再由呼叫者來建立,而是由Spring容器來建立,Spring容器會負責控制程式之間的關係,而不是由呼叫者的程式程式碼直接控制。這樣,控制權由應用程式碼轉移到了Spring容器,控制權發生了反轉,這就是Spring的控制反轉。
從Spring容器的角度來看,Spring容器負責將被依賴物件賦值給呼叫者的成員變數,這相當於為呼叫者注入了它依賴例項,這就是Spring的依賴注入.
依賴注入的實現方式==
- 屬性setter方式注入:指Spring容器使用setter方法注入被依賴的例項
- 構造方法注入:指Spring容器使用構造方法注入被依賴的例項。基於構造方法的依賴注入通過呼叫帶引數的構造方法來實現,每個引數代表著一個依賴。
已setter注入為例
-
service層 介面
public interface UserService { void say(); }
-
service層 實現類
public class UserServiceImpl implements UserService { //宣告UserDao屬性 private UserDao userDao; //新增UserDao屬性的setter 方法,用於實現依賴注入 public void setUserDao(UserDao userDao) { this.userDao = userDao; } //實現介面中的say方法 public void say() { userDao.say(); System.out.println("UserService 層"); } }
-
配置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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userDao" class="com.bm.dao.UserDaoImpl"/> <bean id="userService" class="com.bm.service.UserServiceImpl"> <!-- 將id為userDao的Bean例項注入到userService例項中--> <property name="userDao" ref="userDao"/> </bean> </beans>
-
測試
public class TestIOC { public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService) context.getBean("userService"); userService.say(); } }