<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • Java開發學習(三)----Bean基礎配置及其作用范圍

    一、bean基礎配置

    對于bean的基礎配置如下

    <bean id="" class=""/>

    其中,bean標簽的功能、使用方式以及id和class屬性的作用,我們通過一張圖來描述下

    思考:

    • class屬性能不能寫接口如BookDao的類全名呢?

    答案肯定是不行,因為接口是沒辦法創建對象的。

    • 前面提過為bean設置id時,id必須唯一,但是如果由于命名習慣而產生了分歧后,該如何解決?

    在解決這個問題之前,我們需要準備下開發環境,內容如下:

    二、bean的name屬性

    環境準備好后,接下來就可以在這個環境的基礎上來學習下bean的別名配置,

    首先來看下別名的配置說明:

    步驟1:配置別名

    打開spring的配置文件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 http://www.springframework.org/schema/beans/spring-beans.xsd">
    ?
        <!--name:為bean指定別名,別名可以有多個,使用逗號,分號,空格進行分隔-->
        <bean id="bookService" name="service service4 bookEbi" class="com.itheima.service.impl.BookServiceImpl">
            <property name="bookDao" ref="bookDao"/>
        </bean>
    ?
        <!--scope:為bean設置作用范圍,可選值為單例singloton,非單例prototype-->
        <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl"/>
    </beans>

    說明:Ebi全稱Enterprise Business Interface,翻譯為企業業務接口

    步驟2:根據名稱容器中獲取bean對象
    public class AppForName {
        public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            //此處根據bean標簽的id屬性和name屬性的任意一個值來獲取bean對象
            BookService bookService = (BookService) ctx.getBean("service4");
            bookService.save();
        }
    }
    步驟3:運行程序

    測試結果為:

    注意事項:

    • bean依賴注入的ref屬性指定bean,必須在容器中存在

    • 如果不存在,則會報錯,如下:

      這個錯誤大家需要特別關注下:

      獲取bean無論是通過id還是name獲取,如果無法獲取到,將拋出異常NoSuchBeanDefinitionException

      遇到這樣的問題通常檢查名稱是否寫錯

    三、bean作用范圍scope配置

    關于bean的作用范圍是bean屬性配置的一個重點內容。看到這個作用范圍,我們就得思考bean的作用范圍是來控制bean哪塊內容的?

    我們先來看下bean作用范圍的配置屬性:

    3.1 驗證IOC容器中對象是否為單例

    驗證思路

    同一個bean獲取兩次,將對象打印到控制臺,看打印出的地址值是否一致。

    具體實現
    • 創建一個AppForScope的類,在其main方法中來驗證

      public class AppForScope {
          public static void main(String[] args) {
              ApplicationContext ctx = new 
                  ClassPathXmlApplicationContext("applicationContext.xml");
      ?
              BookDao bookDao1 = (BookDao) ctx.getBean("bookDao");
              BookDao bookDao2 = (BookDao) ctx.getBean("bookDao");
              System.out.println(bookDao1);
              System.out.println(bookDao2);
          }
      }
    • 打印,觀察控制臺的打印結果

    • 結論:默認情況下,Spring創建的bean對象都是單例的

    獲取到結論后,問題就來了,那如果我想創建出來非單例的bean對象,該如何實現呢?

    3.2 配置bean為非單例

    在Spring配置文件中,配置scope屬性來實現bean的非單例創建

    • 在Spring的配置文件中,修改<bean>的scope屬性

      <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope=""/>
    • 將scope設置為singleton

      <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope="singleton"/>

      運行AppForScope,打印看結果

    • 將scope設置為prototype

      <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype"/>

      運行AppForScope,打印看結果

    • 結論,使用bean的scope屬性可以控制bean的創建是否為單例:

      • singleton默認為單例

      • prototype為非單例

    3.3 scope使用后續思考

    介紹完scope屬性以后,我們來思考幾個問題:

    • 為什么bean默認為單例?

      • bean為單例的意思是在Spring的IOC容器中只會有該類的一個對象

      • bean對象只有一個就避免了對象的頻繁創建與銷毀,達到了bean對象的復用,性能高

    • bean在容器中是單例的,會不會產生線程安全問題?

      • 如果對象是有狀態對象,即該對象有成員變量可以用來存儲數據的,

      • 因為所有請求線程共用一個bean對象,所以會存在線程安全問題。

      • 如果對象是無狀態對象,即該對象沒有成員變量沒有進行數據存儲的,

      • 因方法中的局部變量在方法調用完成后會被銷毀,所以不會存在線程安全問題。

    • 哪些bean對象適合交給容器進行管理?

      • 表現層對象 serviceImpl

      • 業務層對象 service

      • 數據層對象 dao

      • 工具對象 util

    • 哪些bean對象不適合交給容器進行管理?

      • 封裝實例的域對象,因為會引發線程安全問題,所以不適合。

     

    posted @ 2022-06-11 12:36  |舊市拾荒|  閱讀(204)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看