SpringMVC IOC

湖南禿頭怪發表於2020-10-09

IOC介紹

(1)什麼是Spirng IOC?
控制反轉(Inversion of Control,縮寫為IoC)
》把原來new物件的這種方式轉換成了,spring通過反射建立物件的方式
》spring建立完的物件放到一個容器中,誰需要就給誰注入進去- (獲取物件並賦值給引用)

(2)SpringIOC環境搭建
1.建立Project
2.建立module maven
3.環境依賴

!--spring依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.9.RELEASE</version>
        </dependency>

(3)SpringIOC程式碼編寫
1.定義Person類
2.手動完成建立與賦值
3.由spring建立與賦值
建立容器物件
讀取配置檔案
new ClassPathXmlApplicationContext(“applicationContext.xml”);
從容器中查詢getBean()

編寫Test測試類
src\main\resources\applicationContext.xml

public class Test01 {
    private ClassPathXmlApplicationContext context;
    @Before
    public void init(){
         context=new ClassPathXmlApplicationContext("applicationContext.xml");
    }
 @Test
    public void test(){
        //1:建立ioc 容器物件  暫時看成map
        //2:給定配置檔案的名稱 applicationContext.xml
        //3:呼叫容器的getBean方法獲取id對應的對
        Person person= context.getBean("person1",Person.class);//無需轉型
        Person person1 = (Person) context.getBean("person1");//需轉型
        //設定方法
        person.setAge(1);
       log.debug(person1+"");


    }

編寫配置檔案
src\main\resources\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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

<!-- 要讓 spring容器給我建立一個person物件
        配置類名,用於反向建立物件
        同時給一個編號方便查詢-->
    <bean id="person1" class="com.xjj.Bean.Person" scope="prototype" >
        <!--'name'成員變數 'value'成員變數的值
        每一個property方法會呼叫一個set方法-->
        <property name="age" value="1"></property>
        <property name="name" value="xjj"></property>
    </bean>
    <bean id="person2" class="com.xjj.Bean.Person">
        <constructor-arg name="name" value="xjj"/>
        <constructor-arg name="age" value="2"/>
    </bean>
    <bean id="person3" class="com.xjj.Demo.PersonFactory" factory-method="getBean">

    </bean>
    <bean class="com.xjj.Demo.PersonFactory2" id="factory2"/>
    <bean factory-bean="factory2" factory-method="getBean" id="person4"/>
<!--生命週期-->
    <bean id="person6" class="com.xjj.Bean.Person"
          init-method="init"
    destroy-method="destory">
    </bean>
    <bean id="person7" class="com.xjj.Bean.Person" >
        <property name="name" value="jack"></property>
        <property name="arr" >
            <array>
                <value>rose</value>
                <value>nike</value>
            </array>
        </property>
    </bean>
    <bean id="person8" class="com.xjj.Bean.Person" >
        <property name="name" value="jack"></property>
        <property name="list" >
            <list>
                <value>rose</value>
                <value>nike</value>
            </list>
        </property>
    </bean>
    <bean id="person9" class="com.xjj.Bean.Person" >
        <property name="name" value="jack"></property>
        <property name="set" >
            <set>
                <value>rose</value>
                <value>nike</value>
            </set>
        </property>
        <property name="map" >
            <map>
                <entry key="1001" value="rose111"></entry>
                <entry key="1002" value="rose1311"></entry>
            </map>
        </property>
        <property name="properties" >
            <props>
                <prop key="10011">222</prop>
                <prop key="2222">333</prop>
            </props>
        </property>
    </bean>
    <bean id="personService" class="com.xjj.Service.PersonService">
    <property name="personDao" ref="personDao"></property>
    </bean>
    <bean id="personDao" class="com.xjj.Dao.PersonDao">

        <!--
              使用註解方式進行建立物件
              1.開啟註解掃描

              含義:開啟註解掃描,指定了 base-package 掃描指定的包,掃描包與子包中所有的類
              檢視類上是否有指定的註解, 如果類上有指定的註解,那麼就建立給類物件,
              放到spring容器中
          -->
    </bean>
    <context:component-scan base-package="com.xjj"/>
</beans>

SpringIOC的方法區別
(1)區別

context.getBean("id值", 型別.class);//無需轉型
context.getBean("id值");//需轉型

(2)bean標籤的屬性
id:bean標籤的識別ID,理論上可以隨便寫
class:你要上Spring給你建立哪個類的物件,需要寫上該類的全路徑名

兩種賦值方法

第一種

 Person person= context.getBean("person1",Person.class);//無需轉型

配置檔案
src\main\resources\applicationContext.xml
name:成員變數的名字
value:成員變數的值
一個property標籤最後會調一個對應的set方法

 <bean id="person2" class="com.wzx.domain.Person" >
        <property name="id" value="10"/>
        <property name="name" value="rose"/>
        <property name="age" value="20"/>
    </bean>

第二種,構造方法建立物件

 Person person2=new Person("xjj",2);
  System.out.println(person2);

配置檔案
src\main\resources\applicationContext.xml
配置構造方法的引數的
constructor-arg 如果有四個,就表示調的一個四個引數的構造方法。
value可以賦上基本型別資料與String,但是其他物件,要使用ref
表示在當前容器中查詢一個已存在的物件

 <bean id="person2" class="com.xjj.Bean.Person">
        <constructor-arg name="name" value="xjj"/>
        <constructor-arg name="age" value="2"/>
 </bean>

SpringIOC靜態工廠
(1)乜嘢是靜態工廠?
XxxFactory.get();
(2)通過靜態方法呼叫物件

package com.xjj.Demo;

import com.xjj.Bean.Person;

public class PersonFactory {
    public  static Person getBean(){
        return new Person();//靜態方法返回的物件
    }
}

(3)factory-method
指定獲取物件的靜態工廠的方法


 <bean id="person3" class="com.xjj.Demo.PersonFactory" factory-method="getBean">

例項工廠建立物件

(1)什麼是例項工廠
XxxFactory
(2)通過工廠物件呼叫成員方法獲得bean物件
XxxFactory factory = new XxxFactory(); //例項化工廠物件
factory .yyy() //獲得物件
(3)factory-bean 建立工廠物件
(4)factory-method 呼叫方法獲得bean物件

配置檔案

<bean factory-bean="factory2" factory-method="getBean" id="person4"/>

建立例項工廠類

package com.xjj.Demo;

import com.xjj.Bean.Person;

public class PersonFactory2 {
    public Person getBean() {
        //方法上沒有static,必須先new PersonFactory2()才能呼叫
        return  new Person();
    }
}

測試類

// PersonFactory2 factory2 =new PersonFactory2();
//Person person=factory2.getBean();
Person person3 = (Person) context.getBean("person4");//使用這個就不需要new物件了
System.out.println(person3);

Spring單例和多例

單例:記憶體中只有一個物件,每次獲取物件的記憶體地址都一樣
多裡:記憶體中每一個物件都是新的物件,每次獲取物件的記憶體地址都不一樣

每次獲取物件的時候,spring是新建立一個物件還是始終給我們返回同一個物件.?

答案是:Spring預設情況下建立物件物件都是單例

scope="singleton" 單例(預設值)
       scope="prototype" 多例
       scope="request" 建立的物件放到request域中
       scope="session" 建立物件放到session物件

多例項:

 <bean id="person1" class="com.xjj.Bean.Person" scope="prototype" >

單例項:

<bean id="person1" class="com.xjj.Bean.Person" scope="singleton" >

SpringMVC生命週期

(1)生命週期
建立方法init
銷燬方法destory
普通方法service
(2)屬性
init-method 當該物件初始化的時候該方法會自動執行
destroy-method 當該物件即將銷燬的時候會自動呼叫該方法

context().close關閉容器
測試類

    @Test
    public void test06(){
       /*Person person1=new Person();
       person1.init();
       person1.work();
       person1.work();
       person1.destory();*/
        Person person= (Person) context.getBean("person6");
        person.work();
      //自己銷燬容器才執行destory()方法
        context.close();
    }
public void init(){
        System.out.println("HELLO");
    }
    public void work(){
        System.out.println("hello word");
    }
    public void destory(){
        System.out.println("wuhu");
    }

配置檔案

<!--生命週期-->
    <bean id="person6" class="com.xjj.Bean.Person"
          init-method="init"
    destroy-method="destory">

Spring注入依賴DI-set方法

(1)何為注入依賴?
DI (dependency injection) 依賴注入 含義:就是給物件的屬性設定值
Set對物件屬性設定值
構造方法給物件初始化的時候設定值.

(2)property標籤
set方式設定屬性(掌握)
讓spring調set方法,前提條件類中必須有set方法

name : 代表的是set方法去掉set,首字母小寫setName Name name
value: 基本型別或字串型別的值,具體給屬性設定用的
ref (引用) : 引用物件的id,作為一個物件型別注入
在這裡插入圖片描述

Spring依賴注入-給複雜型別注入

(1)什麼是複雜型別?
簡單的是基本型別與字串
Aarry 陣列 List 集合 Map集合 Set集合 Properties集合
(2)如何給這些屬性設定值
使用對應的子標籤
array,list,map,set,props

 private  String[] arr;
    private List<String> list;
    private Set<String> set;
    private Map<String,String> map;
    private Properties properties;

配置檔案

 <bean id="person7" class="com.xjj.Bean.Person" >
        <property name="name" value="jack"></property>
        <property name="arr" >
            <array>
                <value>rose</value>
                <value>nike</value>
            </array>
        </property>
    </bean>
    <bean id="person8" class="com.xjj.Bean.Person" >
        <property name="name" value="jack"></property>
        <property name="list" >
            <list>
                <value>rose</value>
                <value>nike</value>
            </list>
        </property>
    </bean>
    <bean id="person9" class="com.xjj.Bean.Person" >
        <property name="name" value="jack"></property>
        <property name="set" >
            <set>
                <value>rose</value>
                <value>nike</value>
            </set>
        </property>
        <property name="map" >
            <map>
                <entry key="1001" value="rose111"></entry>
                <entry key="1002" value="rose1311"></entry>
            </map>
        </property>
        <property name="properties" >
            <props>
                <prop key="10011">222</prop>
                <prop key="2222">333</prop>
            </props>
        </property>
    </bean>

相關文章