一、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

  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="//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>
    
  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="//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>
    
  4. 測試

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