一、Spring的基本應用
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="//www.springframework.org/schema/beans" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//www.springframework.org/schema/beans //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="//www.springframework.org/schema/beans" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//www.springframework.org/schema/beans //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(); } }