Spring--->FactoryBean創建複雜對象

1 FactoryBean接口
  • 開發步驟

    1. 實現FactoryBean接口

    2. Spring配置文件中註冊

      <bean id="conn" class="com.yuziyan.factorybean.ConnectionFactoryBean"/>
    3. 注意:

      • 如果class類型是FactoryBean接口的實現類,那麼通過id值獲得的是這個類getObject()方法所返回的對象。比如 Connection SqlSessionFactory

      • 由於我們此時想獲取的是Connection對象,所以需要在pom.xml文件中加入相關的依賴

        <!-- MySql連接 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>

         

  • 細節分析

    1. 如果就想獲得FactoryBean類型的對象,在id前加上&符號,ctx.getBean("&conn"),此時獲得的就是ConnectionFactoryBean對象本身。

    2. isSingleton()方法,返回 true 只會創建一個複雜對象,返回 false 每一次都會創建新的對象

      問題:根據這個對象的特點 ,決定是返回true (SqlSessionFactory) 還是 false (Connection)。

    3. mysql高版本連接創建時,需要制定SSL證書,解決問題的方式。

      url = "jdbc:mysql://localhost:3306/suns?useSSL=false"
    4. 體會依賴注入(DI)

      可以把ConnectionFactoryBean中依賴的4個字符串信息 ,在配置文件中進行注入 ,解耦合。

      <bean id="conn" class="com.yuziyan.factorybean.ConnectionFactoryBean">
          <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
          <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false"/>
          <property name="username" value="root"/>
          <property name="password" value="root"/>
      </bean>
      

        

  • FactoryBean的實現原理[簡易版]

    Spring內部運行流程:

    1. 通過conn獲得ConnectionFactoryBean類的對象。
    2. 進而通過instanceof 判斷是否是FactoryBean接口的實現類。
    3. 如果是,Spring按照規定調用getObject()方法返回Connection類的對象。體現了接口回調的特點。

    image-20200417114723005

  • FactoryBean總結

    Spring中用於創建複雜對象的一種方式,也是Spring原生提供的,後續講解Spring整合其他框架,大量應用FactoryBean

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章