1. 程式人生 > 實用技巧 >Spring入門01

Spring入門01

一、Spring簡單案例

1、搭建Spring基本專案

https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring/5.1.3.RELEASE/spring-framework-5.1.3.RELEASE-dist.zip

匯入基本jar包:context core beans expression

與apache的logging,老版本還需要匯入log4j

建立spring配置檔案

<?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.xsd"> <!-- 將User物件交給Spring管理 --> <!-- Bean元素:使用該元素描述需要Spring容器管理的物件 class屬性:被管理物件的完整類名 name屬性:給被管理的物件起名字,獲得物件時根據該名稱獲得物件,名稱可以重複,可以使用特殊字元 id:與name屬性一模一樣(名稱不可重複,不能使用特殊字元) 結論:儘量使用name屬性
--> <bean name="user" class="domain.User"></bean> </beans>

配置查詢約束:\spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html

建立測試案例

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import domain.User; public class Demo1 { /** * IOC:Inverse of Control 反轉控制 * 將我們建立物件的方式反轉了 * 以前物件的建立是由我們開發人員自己維護,包括依賴關係也是自己注入 * 使用了spring之後,物件建立以及依賴關係可以由spring完成建立以及注入 * 反轉控制就是反轉了物件的建立方式,從我們自己建立反轉給了程式(spring) * * DI:Dependency Injection 依賴注入 * 實現IOC思想需要DI做支援 * 注入方式:set方法注入 * 構造方法注入 * 欄位注入 * 注入型別: * 值型別注入 8大基本資料型別 * 引用型別注入 將依賴的物件注入 * * ApplicationContext&BeanFactory(過時) * * BeanFactory介面:spring原始介面,針對原始介面實現類功能較為單一 * BeanFactory介面實現類的容器:每次在獲得物件時才會建立物件 * * ApplicationContext * 每次容器啟動時就會建立容器中配置的所有物件,提供更多功能 * web開發中使用ApplicationContext完成 * 在資源匱乏的環境可以使用BeanFactory * 從類路徑下載入配置檔案:ClassPathXmlApplicationContext * 從硬碟絕對路徑下載入配置檔案:FileSystemXmlApplicationContext("d:/xx.xx") * */ @Test public void func1() { //1、建立容器物件 ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); //2、向容器要user User user = (User) context.getBean("user"); //列印一下User System.out.println(user); } @Test public void func2() { } }

2、Bean元素進階配置

scpoe屬性:

    singleton(預設值):單例物件,被標識為單例的物件在spring容器中只存在一個例項

    prototype:多例原型,被標識為多例的物件,每次在獲得才會建立。每次建立都是新的物件。

    request:web環境下,物件與request生命週期一致

    session:web環境下,物件與session生命週期一致

 <bean name="user" class="domain.User" scope="prototype"></bean>
 <bean name="user" class="domain.User" scope="singleton"></bean>

生命週期屬性:

    init-method 初始化方法:配置一個方法作為物件生命週期初始化方法,spring會在物件建立後立即呼叫

    destory-method銷燬方法:配置一個方法作為生命週期的銷燬方法,spring容器在關閉並銷燬所有容器中的物件之前呼叫

<bean name="user" class="domain.User" init-method="init" destroy-method="destory"></bean>

3、spring建立物件的方式

方式一、

  空參構造(主要方式)

<!-- 建立方式1:空參構造建立   (主要方式) -->
    <bean name="user" class="domain.User"></bean>

方式二、靜態工廠

public class UserFactory {

    public static User Create() {
        
        System.out.println("靜態工廠方式");
        return new User();
    }
}
    <!-- 建立方式2:靜態工廠建立
        呼叫UserFactory的Create方法建立user2物件,放入容器
     -->
     <bean name="user2" class="domain.UserFactory" factory-method="Create"></bean>

方式三、例項工廠

public User Create2() {
        
        System.out.println("例項工廠工廠方式");
        return new User();
    }
<!-- 方式3:例項工廠
        呼叫UserFactory物件的Create2方法建立名為user3的物件,放入容器
     -->
     <bean name="user3" factory-bean="userFactory" factory-method="Create2"></bean>
     
     <bean name="userFactory" class="domain.UserFactory"></bean>

Spring的分模組配置

<!-- 匯入其他配置檔案 -->
    <import resource="CreateObjDemo/applicationContext.xml"/>

3、spring的屬性注入

一、set方式注入

<!-- set注入方式 -->
    <bean name="user" class="domain.User">
        <!-- 值型別注入 -->
        <property name="name" value="zhangsan"></property>
        <property name="age" value="20"></property>
        <!-- 引用型別注入,注入的是下面配置的car物件 -->
        <property name="Mycar" ref="car"></property>
        
    </bean>
    
    <!-- car物件 -->
    <bean name="car" class="domain.Car">
        <property name="name" value="蘭博基尼"></property>
        <property name="color" value="紅色"></property>
    </bean>

二、建構函式注入

    <!--建構函式注入  -->
    <bean name="user2" class="domain.User">
        <!-- 
        name屬性:建構函式的引數名
        index屬性:建構函式的引數索引
        type屬性:建構函式的引數型別
         -->
        <constructor-arg name="name" index="0" type="java.lang.String" value="李四"></constructor-arg>
        <constructor-arg name="age" index="1" type="java.lang.Integer" value="25"></constructor-arg>
        <constructor-arg name="car" index="2" ref="car"></constructor-arg>
    </bean>

三、p名稱空間注入

<!-- p名稱空間,走set方法
        1、匯入p名稱空間  xmlns:p="http://www.springframework.org/schema/p"
        2、使用p:屬性完成注入
     -->
     <bean name="user3" class="domain.User" p:name="王五" p:age="22" p:Mycar-ref="car"></bean>

四、spel注入

 <!-- spel注入:Spring Expression Language (Spring表示式語言) -->
     <bean name="user4" class="domain.User">
         <property name="name" value="#{user.name}"></property>
         <property name="age" value="#{user.age}"></property>
         <property name="Mycar" ref="car"></property>
     </bean>

五、複雜型別注入(array、list、map、Properties)

<!-- 複雜型別注入 -->
        <bean name="lmp" class="domain.Lmp">
            <!--Array陣列注入 -->
            <property name="arr">            
                <array>
                    <value>tom</value>
                    <value>jack</value>
                    <ref bean="user2"/>
                </array>            
            </property>
            <!-- list集合注入 -->
            <property name="list">            
                <list>
                    <value>zhangsan</value>
                    <value>lisi</value>
                    <ref bean="user3"/>
                </list>
            </property>
            <!-- map集合注入 -->
            <property name="map">
                <map>                    
                    <entry key="school" value="清華"></entry>
                    <entry key-ref="user" value-ref="car"></entry>
                </map>
            </property>
            <!-- Properties型別注入 -->
            <property name="pro">
                <props>
                    <prop key="school">北大</prop>
                    <prop key="name">張三</prop>
                </props>
            </property>
        </bean>
public class Lmp 
{
    private Object arr[];
    private List list;
    private Map map;
    private Properties pro;
    public Object[] getArr() {
        return arr;
    }
    public void setArr(Object[] arr) {
        this.arr = arr;
    }
    public List getList() {
        return list;
    }
    public void setList(List list) {
        this.list = list;
    }
    public Map getMap() {
        return map;
    }
    public void setMap(Map map) {
        this.map = map;
    }
    public Properties getPro() {
        return pro;
    }
    public void setPro(Properties pro) {
        this.pro = pro;
    }
    @Override
    public String toString() {
        return "Lmp [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", pro=" + pro + "]";
    }
}

一二三四五案例全部配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        
    <!-- set注入方式 -->
    <bean name="user" class="domain.User">
        <!-- 值型別注入 -->
        <property name="name" value="zhangsan"></property>
        <property name="age" value="20"></property>
        <!-- 引用型別注入,注入的是下面配置的car物件 -->
        <property name="Mycar" ref="car"></property>
        
    </bean>

    
    <!-- car物件 -->
    <bean name="car" class="domain.Car">
        <property name="name" value="蘭博基尼"></property>
        <property name="color" value="紅色"></property>
    </bean>

    <!--建構函式注入  -->
    <bean name="user2" class="domain.User">
        <!-- 
        name屬性:建構函式的引數名
        index屬性:建構函式的引數索引
        type屬性:建構函式的引數型別
         -->
        <constructor-arg name="name" index="0" type="java.lang.String" value="李四"></constructor-arg>
        <constructor-arg name="age" index="1" type="java.lang.Integer" value="25"></constructor-arg>
        <constructor-arg name="car" index="2" ref="car"></constructor-arg>
    </bean>
    
    <!-- p名稱空間,走set方法
        1、匯入p名稱空間  xmlns:p="http://www.springframework.org/schema/p"
        2、使用p:屬性完成注入
     -->
     <bean name="user3" class="domain.User" p:name="王五" p:age="22" p:Mycar-ref="car"></bean>
     
     <!-- spel注入:Spring Expression Language (Spring表示式語言) -->
     <bean name="user4" class="domain.User">
         <property name="name" value="#{user.name}"></property>
         <property name="age" value="#{user.age}"></property>
         <property name="Mycar" ref="car"></property>
     </bean>
     
     
     <!-- 複雜型別注入 -->
        <bean name="lmp" class="domain.Lmp">
            <!--Array陣列注入 -->
            <property name="arr">            
                <array>
                    <value>tom</value>
                    <value>jack</value>
                    <ref bean="user2"/>
                </array>            
            </property>
            <!-- list集合注入 -->
            <property name="list">            
                <list>
                    <value>zhangsan</value>
                    <value>lisi</value>
                    <ref bean="user3"/>
                </list>
            </property>
            <!-- map集合注入 -->
            <property name="map">
                <map>                    
                    <entry key="school" value="清華"></entry>
                    <entry key-ref="user" value-ref="car"></entry>
                </map>
            </property>
            <!-- Properties型別注入 -->
            <property name="pro">
                <props>
                    <prop key="school">北大</prop>
                    <prop key="name">張三</prop>
                </props>
            </property>
        </bean>
</beans>
    
public class User {

    public User() {                
    }
    
    public User(String name,Integer age,Car car) {
        this.name=name;
        this.age=age;
        this.Mycar=car;
        
    }
    
    private String name;
    private Integer age;
    private Car Mycar;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Car getMycar() {
        return Mycar;
    }
    public void setMycar(Car mycar) {
        Mycar = mycar;
    }
    
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", Mycar=" + Mycar + "]";
    }
}
public class Car {
    private String name;
    private String color;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    @Override
    public String toString() {
        return "Car [name=" + name + ", color=" + color + "]";
    }
}

4、配置Spring容器生命週期

<!-- 配置Spring容器隨專案的啟動而建立,隨專案的關閉而銷燬 -->
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 指定載入Spring配置檔案的位置 -->
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext.xml</param-value>
  </context-param>