BeanFactory和ApplicationContext的區別
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注解的注解方式