BeanFactory和ApplicationContext的區別+部分Spring的使用


BeanFactoryApplicationContext的區別

ApplicationContext 方式加載創建容器的同時 容器初始化,容器所有的bean創建完畢

               Spring容器中獲取一個對象 通過類型直接獲取

 

BeanFactory 方式加載創建容器對象,BeanFactory當調用getBean獲取響應對象是才創建對象

            Spring容器中獲取一個對象 通過類型直接獲取

 

這兩個區別是一個容器加載的時候實例化對象,一個是在使用的時候才實例化對象。

 

靜態工廠注入:

 

 

1、創建靜態工廠類,定義一個工廠方法,new一個對象

2、<!-- 注冊靜態工廠 -->

  <bean class="com.sxt.factory.UserFactory" factory-method="getInstance" id="user"/>

 

在一些第三方框架使用過程中,可能不得不使用靜態工廠注入或者實例工廠注入

HttpUrlConnection、HttpClient、OkHttp

 

動態工廠注入:

1、創建動態工廠類,定義一個工廠方法,new一個對象

2、

<!-- 實現動態工廠 -->

<bean class="com.sxt.factory.UserFactory" id="userFactory"/>

<bean factory-bean="userFactory" factory-method="getInstance" id="user"/>

 

屬性注入

1、構造注入

創建有參構造方法,同時必須提供無參構造方法

     <bean class="com.bb.pojo.User">
         <!-- 通過構造注入的方式 初始化屬性 -->
         <constructor-arg name="id" value="1001"/>
         <constructor-arg name="userName" value="張三"/>
         <constructor-arg name="address" value="深圳"/>
     </bean>

 

2、設置注入

 

有參構造方法不是必須的了,無參方法是必須的!!!

 

set方法注入就是利用對象屬性的set方法給屬性賦值,實際上,相當於首先使用無參構造方法創建一個Book對象,然后調用對象中的set方法給各個屬性賦值。

 

設置注入必須添加對應的set()的方法

     <bean class="com.bb.pojo.User">
         <!-- 通過設值注入的方式 初始化屬性 -->
         <property name="id" value="1003"/>
         <property name="userName" value="王五"/>
         <property name="address" value="固戍"/>
     </bean>

 

P名稱空間注入

 

 

p名稱空間注入本質上還是set方法注入,只是寫法不同(注意:p名稱空間注入,需要有無參構造方法)。

<bean class="com.bb.pojo.User" p:id="1004" p:userName="趙六" p:address="西鄉"/>

 

對象注入

 

     <bean class="com.bb.pojo.Cat" id="myCat">
         <property name="nick" value="小黑"/>
         <property name="color" value="黃色"/>
     </bean>

 

數組和集合注入

 

 

數組和集合的注入方式是一致的,無論是基本數據類型還是一個引用,注入方式都是一樣。 首先聲明一個對象,對象中包含集合和數組。

        <!-- 數組類型 -->
         <array>
             <value>LOL</value>
             <value>CF</value>
             <value>DNF</value>
         </array>
         </property>
         <property name="cats">
         <!-- List類型 -->
         <list>
             <ref bean="myCat"/>
             <ref bean="myCat"/>
             <ref bean="myCat"/>
         </list>
         </property>

 

 

Map注入

<property name="maps">
         <!-- map類型 -->
         <map>
             <entry key="c1" value-ref="myCat"></entry>
             <entry key="c2" value-ref="myCat"></entry>
             <entry key="c3" value-ref="myCat"></entry>
         </map>
 </property>

Props注入

<property name="props">
   <props>
    <prop key="url">http://192.168.0.135</prop>
    <prop key="userName">admin</prop>
    <prop key="password">123</prop>
   </props>

</property>

 

控制反轉注入

 

1·在spring容器中加載dao層的實現類

<!-- 配置Dao -->
     <bean class="com.bb.dao.impl.UserDaoImpl" id="userDaoImpl"/>

2·在業務層的實現類中使用set()方法注入dao層實現類

<!-- 配置service -->
     <bean class="com.bb.service.impl.UserServiceImpl" id="userServiceImpl">
         <property name="dao" ref="userDaoImpl"/>
     </bean>

3·在控制層中使用set()方法注入service層實現類

<!-- 配置controller -->
     <bean class="com.bb.controller.UserController">
         <property name="userService" ref="userServiceImpl"/>
     </bean>

 

JavaConfig配置(Java代碼+注解)

@Configuration:表示該java類就是一個配置類相對於applicationContext.xml(放在類上)

@Bean("name"):相對於我們在applicationContext.xml文件中的bean標簽 name默認的是方法名稱(放在方法上)

 

JavaConfig + @Profile配置

@Profile:Spring中提供實現動態生成相應的bean

 

xmlConfig + @Profile

<!-- profile配置  注意寫在文件的底部 -->
     <beans profile="dev">
         <bean class="com.bb.pojo.DataSource">
             <!-- 通過設值注入的方式 -->
             <property name="url" value="http://dev..."/>
             <property name="username" value="admin"/>
             <property name="password" value="123456"/>
         </bean>
     </beans>

 

xmlConfig + annotation

<!-- 開啟掃描、開啟注解 -->
     <context:component-scan base-package="com.bb.pojo"/>

@Component("user")等價 配置文件中<bean>標簽 默認的name是類名首字母小寫,一般用在身份不明的組件上

  <bean class="com.bb.pojo.User" name="user"/>

@Controller  一般在控制層使用的注解

@Service  一般在業務層使用的注解

@Repository  一般在dao層使用的注解

 

JavaConfig + annotation

@ComponentScan主要就是定義掃描的路徑從中找出標識了需要裝配的類自動裝配到spring的bean容器中

 

總結一下@ComponentScan的常用方式如下

 

  • 自定掃描路徑下邊帶有@Controller,@Service,@Repository,@Component注解加入spring容器

  • 通過includeFilters加入掃描路徑下沒有以上注解的類加入spring容器

  • 通過excludeFilters過濾出不用加入spring容器的類

  • 自定義增加了@Component注解的注解方式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM