一、Spring的基本應用

6ovo6發表於2020-08-12

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

  1. 介面

    public interface UserDao {
        void say();
    }
    
  2. 介面的實現類

    public class UserDaoImpl implements UserDao {
        public void say() {
            System.out.println("UserDao 層");
        }
    }
    
  3. 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>
    
  4. 測試

    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注入為例

  1. service層 介面

    public interface UserService {
        void say();
    }
    
  2. 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 層");
        }
    }
    
  3. 配置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>
    
  4. 測試

    public class TestIOC {
        public static void main(String[] args){
    
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    
            UserService userService = (UserService) context.getBean("userService");
            userService.say();
        }
    }
    

相關文章