1. 程式人生 > 實用技巧 >Spring學習隨筆

Spring學習隨筆

Spring中IOC的理解

1、什麼是IOC?

(1)控制反轉。把物件建立和物件間的呼叫過程交給Spring進行管理。

(2)使用IOC的目的:為了耦合度降低。


2、IOC底層原理?

(1)xml解析、工廠模式、反射

(2)圖解

原始呼叫方式(耦合度太高,dao如果變了service也要跟著變):

引入工廠模式解除上面兩個類的耦合度(但是工廠和service出現了新的耦合):

IOC解耦過程(進一步降低耦合度)

第一步:xml配置檔案,配置建立的物件,示例:<bean id="aaa" class="xxx.dao"></bean>

第二步:有service和dao類,建立工廠類,示例:


IOC介面

  1. IOC思想基於IOC容器完成,IOC容器底層就是物件工廠
  2. Spring提供IOC容器實現兩種方式:(兩個介面)
    1. BeanFactory:最基本介面,供內部人員使用。載入配置檔案時不會去建立物件,在獲取物件或者使用物件時才去建立物件。(.getBean方法時)
    2. ApplicationContext:BeanFactory介面的一個子介面。提供了更多功能,一般由開發人員使用。載入配置檔案時就會把在配置檔案中物件進行建立。

  3.ApplicationContext的主要實現類(File那個類是盤裡全路徑,Class那個是類路徑位置):

  

  


IOC操作:Bean管理

1、什麼是Bean管理(2個操作)

  (1)Spring建立物件

  (2)Spring注入屬性

2、Bean管理操作有兩種方式

  (1)基於xml配置檔案方式實現

  (2)基於註解方式實現

IOC操作Bean管理(基於xml方式)

1、基於xml建立物件

<bean id="aaa" class="xxx.dao"></bean>

bean中常用屬性:

id:唯一標識

class:類全路徑

建立物件時,預設執行無參構造,完成物件建立。

2、基於xml注入屬性

(1)DI:依賴注入,注入屬性,是IOC一種實現

第一種注入方式:使用set方法進行注入

  建立一個類,建立其對應set方法;

  在Spring配置檔案中配置物件建立,配置屬性注入,示例如下:

<bean id="book" class="org.zhaojianhui.Spring.Book">
<property name="name" value="我的世界"/>
<property name="price" value="15.0"/>
</bean>

第二種注入方式:使用有參構造進行注入

建立一個類,定義屬性以及有參構造

//有參構造注入
public Book(String name, String price) {
this.name = name;
this.price = price;
}

Spring配置檔案中編寫:
<bean id="book" class="org.zhaojianhui.Spring.Book">
<constructor-arg name="name" value="我的愛人"></constructor-arg>
<constructor-arg name="price" value="16.0"></constructor-arg>
</bean>


P名稱空間注入(底層還是set注入):
1、加一個p名稱空間

2、進行屬性注入:


xml中其他屬性注入:
1、空值注入


2、屬性值包含特殊符號:


轉義<>:&lt; &gt


注入屬性:外部Bean

  1. 建立service類和dao類,省略此處。

   2.在service中呼叫dao

 //建立userDao型別,申明set方法
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void add() {
        System.out.println("service add!!!");
        userDao.update();
    }

   3.在Spring配置檔案中進行配置

  <!--service和dao物件建立-->
    <bean id="userService" class="org.zhaojianhui.Spring.service.UserService">
        <!--注入userdao物件,name是類裡的屬性名稱,
        ref是建立UserDao中bean標籤的id,注入外部bean-->
        <property name="userDao" ref="userDao"></property>
    </bean>

    <bean id="userDao" class="org.zhaojianhui.Spring.dao.UserDaoImpl"></bean>

注入屬性:內部Bean

  1. 一對多關係:例如部門對員工示例
//部門類
public class Dept {
    private String dname;

    public void setDname(String dname) {
        this.dname = dname;
    }
}
//員工類
public class Emp {
    private String name;

    private String gender;

    private Dept dept;

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

2.在Spring配置檔案中進行配置

<!--內部bean-->
    <bean id="emp" class="org.zhaojianhui.Spring.Bean.Emp">
        <property name="name" value="zs"></property>
        <property name="gender" value="男"></property>
        <!--物件型別屬性-->
        <property name="dept">
            <bean id="demp" class="org.zhaojianhui.Spring.Bean.Dept">
                <property name="dname" value="安保部"></property>
            </bean>
        </property>
    </bean>

級聯賦值:

寫法1:

<bean id="emp" class="org.zhaojianhui.Spring.Bean.Emp">
        <property name="name" value="zs"></property>
        <property name="gender" value="男"></property>
        <!--物件型別屬性-->
        <property name="dept" ref="depts"></property>
    </bean>
    <bean id="depts" class="org.zhaojianhui.Spring.Bean.Dept">
        <property name="dname" value="安保部"></property>
    </bean>

寫法2:

<property name="dept.dname" value="體育部"></property>,對應Emp實體需要生成dept屬性的getter方法才能完成!


IOC操作Bean管理(xml注入集合屬性)
1、注入陣列型別屬性


2、注入List型別屬性

3、注入Map型別屬性

配置檔案中程式碼示例如下:
    <!--陣列、List、Map注入-->
    <bean id="stu" class="org.zhaojianhui.Spring.Bean.Stu">
        <property name="course">
            <array>
                <value>語文</value>
                <value>數學</value>
            </array>
        </property>

        <property name="list">
            <list>
                <value>張三</value>
                <value>三兒</value>
            </list>
        </property>
        <property name="map">
            <map>
                <entry key="JAVA" value="java">
                </entry>
                <entry key="PHP" value="php"></entry>
            </map>
        </property>
    </bean>

在集合裡設定物件型別值:
 <!--注入list集合型別,值是物件-->
        <property name="courseList">
            <list>
                <ref bean="course1"></ref>
                <ref bean="course2"></ref>
            </list>
        </property>
    </bean>
    <bean id="course1" class="org.zhaojianhui.Spring.Bean.Course">
        <property name="cname" value="Spring"></property>
    </bean>
    <bean id="course2" class="org.zhaojianhui.Spring.Bean.Course">
        <property name="cname" value="MVC"></property>
    </bean>

  

把集合注入部分提取出來

1、在配置檔案中引入一個名稱空間util

<?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:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/util
         http://www.springframework.org/schema/util/spring-util.xsd">

</beans>

2、使用util標籤完成list集合提取注入

 <!--提取list集合屬性注入-->
    <util:list id="list">
        <value>w</value>
        <value>q</value>
        <value>r</value>

    </util:list>
    <!--注入使用-->
    <bean id="stu" class="org.zhaojianhui.Spring.Bean.Stu">
        <property name="list" ref="list">
        </property>
    </bean>

  


IOC操作Bean管理(FactoryBean)
1、Spring有兩種Bean,一種普通Bean,另外一種工廠Bean

2、普通Bean:在配置檔案中定義Bean型別就是返回型別

3、工廠Bean:在配置檔案中定義Bean型別可以和返回型別不一樣


Bean的作用域:

預設單例,可以在配置檔案中修改作用域,在bean標籤的scope屬性用於設定,屬性值有singleton,prototype(多例),request,session

區別:

設定為單例時,載入配置檔案時就會建立單例物件,設定為多例時候不是在載入配置檔案時建立物件,而是在呼叫getBean方法時候建立多例項物件。


Bean的生命週期:

1、通過構造器建立bean示例(無參構造)

2、為bean的屬性設定值和對其他bean的引用(呼叫set方法)

把bean例項傳遞給bean後置處理器方法(如果使用了後置處理器就會多兩個步驟,即實現BeanPostProcessor方法)

3、呼叫bean的初始化方法

把bean例項傳遞給bean後置處理器方法

4、bean可以使用了(物件獲取到了)

5、當容器關閉時,呼叫Bean的銷燬方法


XML自動裝配

1、基於名稱 2、基於型別

 <!--自動裝配,bean標籤屬性autowire配置自動裝配,byName根據屬性名稱注入(bean的id值和類屬性名稱一樣),byType根據屬性型別注入
    (但是相同型別的bean不能定義多個)-->
    <bean id="emp" class="org.zhaojianhui.Spring.Bean.Emp" autowire="byName"></bean>
    <bean id="dept" class="org.zhaojianhui.Spring.Bean.Dept">
        <property name="dname" value="開發部門"></property>
    </bean>

引入外部屬性檔案(以資料庫資訊為例):

1、直接配置資料庫資訊

2、通過引入外部屬性檔案配置資料庫連線池

  1、引入context名稱空間

  2、spring配置檔案中引入外部檔案

    <!--引入外部屬性檔案-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

  3、使用${屬性}填充內容

 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${prop.driverClass}"></property>
        <property name="url" value="${prop.url}"></property>
        <property name="username" value="${prop.userName}"></property>
        <property name="password" value="${prop.password}"></property>
    </bean>

  


IOC操作Bean管理(基於註解方式)

1、什麼是註解?

  1、@註解名稱,註解可以作用在類、方法、屬性上

  2、使用目的:簡化xml配置

2、Spring針對Bean管理中建立物件提供註解:

  1、@Component:

  2、@Service:

  3、@Controller:

  4、@Repository:用於dao層一般

3、基於註解方式演示物件建立(註解的value值預設為類首字母小寫)

第一步:引入aop依賴

第二步:開啟組建掃描

<!--開啟元件掃描-->
    <context:component-scan base-package="org.zhaojianhui.Spring"></context:component-scan>