網(wǎng)站首頁 編程語言 正文
目錄
1.組件(Bean)信息聲明配置(IoC)
1)基于無參構(gòu)造函數(shù)
2)基于靜態(tài)工廠方法實(shí)例化
3)基于實(shí)例工廠方法實(shí)例化
2.組件(Bean)依賴注入配置(DI)
1)基于構(gòu)造函數(shù)依賴注入(單個(gè)參數(shù))
2)基于構(gòu)造函數(shù)依賴注入(多個(gè)參數(shù))
3)基于Setter方法依賴注入
總結(jié):
3.IoC容器創(chuàng)建和使用
1)容器實(shí)例化
2)Bean對象獲取
4.組件作用域和周期方法配置
1)周期方法配置
①周期方法的聲明
②周期方法的配置
2)作用域配置
5.高級特性:FactoryBean特性和使用
1)FactoryBean實(shí)現(xiàn)類
2)配置FactoryBean實(shí)現(xiàn)類?
3)測試讀取FactoryBean和FactoryBean.getObject對象
1.組件(Bean)信息聲明配置(IoC)
1)基于無參構(gòu)造函數(shù)
- 組件類
package com.atguigu.ioc;
public class HappyComponent {
//默認(rèn)包含無參數(shù)構(gòu)造函數(shù)
public void doWork() {
System.out.println("HappyComponent.doWork");
}
}
- xml配置文件編寫
<!-- 實(shí)驗(yàn)一 [重要]創(chuàng)建bean -->
<bean id="happyComponent" class="com.atguigu.ioc.HappyComponent"/>
2)基于靜態(tài)工廠方法實(shí)例化
- 組件類
public class ClientService {
private static ClientService clientService = new ClientService();
private ClientService() {}
public static ClientService createInstance() {
return clientService;
}
}
- xml配置文件編寫
<bean id="clientService"
class="examples.ClientService"
factory-method="createInstance"/>
3)基于實(shí)例工廠方法實(shí)例化
- 組件類
public class DefaultServiceLocator {
private static ClientServiceImplclientService = new ClientServiceImpl();
public ClientService createClientServiceInstance() {
return clientService;
}
}
- xml配置文件編寫
<!-- 將工廠類進(jìn)行ioc配置 -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
</bean>
<!-- 根據(jù)工廠對象的實(shí)例工廠方法進(jìn)行實(shí)例化組件對象 -->
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
2.組件(Bean)依賴注入配置(DI)
1.基于構(gòu)造函數(shù)依賴注入(單個(gè)參數(shù)、多個(gè)參數(shù))
2.基于Setter方法依賴注入
1)基于構(gòu)造函數(shù)依賴注入(單個(gè)參數(shù))
- 組件類
public class UserDao {
}
public class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
}
- 配置文件
<beans>
<!-- 引用類bean聲明 -->
<bean id="userService" class="x.y.UserService">
<!-- 構(gòu)造函數(shù)引用 -->
<constructor-arg ref="userDao"/>
</bean>
<!-- 被引用類bean聲明 -->
<bean id="userDao" class="x.y.UserDao"/>
</beans>
2)基于構(gòu)造函數(shù)依賴注入(多個(gè)參數(shù))
- 組件類
public class UserDao {
}
public class UserService {
private UserDao userDao;
private int age;
private String name;
public UserService(int age , String name ,UserDao userDao) {
this.userDao = userDao;
this.age = age;
this.name = name;
}
}
- 配置文件
<!-- 場景1: 多參數(shù),可以按照相應(yīng)構(gòu)造函數(shù)的順序注入數(shù)據(jù) -->
<beans>
<bean id="userService" class="x.y.UserService">
<!-- value直接注入基本類型值 -->
<constructor-arg value="18"/>
<constructor-arg value="趙偉風(fēng)"/>
<constructor-arg ref="userDao"/>
</bean>
<!-- 被引用類bean聲明 -->
<bean id="userDao" class="x.y.UserDao"/>
</beans>
<!-- 場景2: 多參數(shù),可以按照相應(yīng)構(gòu)造函數(shù)的名稱注入數(shù)據(jù) -->
<beans>
<bean id="userService" class="x.y.UserService">
<!-- value直接注入基本類型值 -->
<constructor-arg name="name" value="趙偉風(fēng)"/>
<constructor-arg name="userDao" ref="userDao"/>
<constructor-arg name="age" value="18"/>
</bean>
<!-- 被引用類bean聲明 -->
<bean id="userDao" class="x.y.UserDao"/>
</beans>
<!-- 場景2: 多參數(shù),可以按照相應(yīng)構(gòu)造函數(shù)的角標(biāo)注入數(shù)據(jù)
index從0開始 構(gòu)造函數(shù)(0,1,2....)
-->
<beans>
<bean id="userService" class="x.y.UserService">
<!-- value直接注入基本類型值 -->
<constructor-arg index="1" value="趙偉風(fēng)"/>
<constructor-arg index="2" ref="userDao"/>
<constructor-arg index="0" value="18"/>
</bean>
<!-- 被引用類bean聲明 -->
<bean id="userDao" class="x.y.UserDao"/>
</beans>
3)基于Setter方法依賴注入
- 組件類
public Class MovieFinder{
}
public class SimpleMovieLister {
private MovieFinder movieFinder;
private String movieName;
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
public void setMovieName(String movieName){
this.movieName = movieName;
}
// business logic that actually uses the injected MovieFinder is omitted...
}
- 配置文件
<bean id="simpleMovieLister" class="examples.SimpleMovieLister">
<!-- setter方法,注入movieFinder對象的標(biāo)識id
name = 屬性名 ref = 引用bean的id值
-->
<property name="movieFinder" ref="movieFinder" />
<!-- setter方法,注入基本數(shù)據(jù)類型movieName
name = 屬性名 value= 基本類型值
-->
<property name="movieName" value="消失的她"/>
</bean>
<bean id="movieFinder" class="examples.MovieFinder"/>
總結(jié):
? 依賴注入(DI)包含引用類型和基本數(shù)據(jù)類型。
? 需要特別注意:引用其他bean,使用ref屬性。直接注入基本類型值,使用value屬性。
3.IoC容器創(chuàng)建和使用
1)容器實(shí)例化
//方式1:實(shí)例化并且指定配置文件
//參數(shù):String...locations 傳入一個(gè)或者多個(gè)配置文件
ApplicationContext context =
new ClassPathXmlApplicationContext("services.xml", "daos.xml");
//方式2:先實(shí)例化,再指定配置文件,最后刷新容器觸發(fā)Bean實(shí)例化動作 [springmvc源碼和contextLoadListener源碼方式]
ApplicationContext context =
new ClassPathXmlApplicationContext();
//設(shè)置配置配置文件,方法參數(shù)為可變參數(shù),可以設(shè)置一個(gè)或者多個(gè)配置
iocContainer1.setConfigLocations("services.xml", "daos.xml");
//后配置的文件,需要調(diào)用refresh方法,觸發(fā)刷新配置
iocContainer1.refresh();
2)Bean對象獲取
//方式1: 根據(jù)id獲取
//沒有指定類型,返回為Object,需要類型轉(zhuǎn)化!
HappyComponent happyComponent =
(HappyComponent) iocContainer.getBean("bean的id標(biāo)識");
//使用組件對象
happyComponent.doWork();
//方式2: 根據(jù)類型獲取
//根據(jù)類型獲取,但是要求,同類型(當(dāng)前類,或者之類,或者接口的實(shí)現(xiàn)類)只能有一個(gè)對象交給IoC容器管理
//配置兩個(gè)或者以上出現(xiàn): org.springframework.beans.factory.NoUniqueBeanDefinitionException 問題
HappyComponent happyComponent = iocContainer.getBean(HappyComponent.class);
happyComponent.doWork();
//方式3: 根據(jù)id和類型獲取
HappyComponent happyComponent = iocContainer.getBean("bean的id標(biāo)識", HappyComponent.class);
happyComponent.doWork();
根據(jù)類型來獲取bean時(shí),在滿足bean唯一性的前提下,其實(shí)只是看:『對象 instanceof 指定的類型』的返回結(jié)果,
只要返回的是true就可以認(rèn)定為和類型匹配,能夠獲取到。
4.組件作用域和周期方法配置
1)周期方法配置
①周期方法的聲明
public class BeanOne {
//周期方法要求: 方法命名隨意,但是要求方法必須是 public void 無形參列表
public void init() {
// 初始化邏輯
}
}
public class BeanTwo {
public void cleanup() {
// 釋放資源邏輯
}
}
②周期方法的配置
<beans>
<bean id="beanOne" class="examples.BeanOne" init-method="init" />
<bean id="beanTwo" class="examples.BeanTwo" destroy-method="cleanup" />
</beans>
2)作用域配置
c.作用域配置
<!--bean的作用域
準(zhǔn)備兩個(gè)引用關(guān)系的組件類即可!!
-->
<!-- scope屬性:取值singleton(默認(rèn)值),bean在IOC容器中只有一個(gè)實(shí)例,IOC容器初始化時(shí)創(chuàng)建對象 -->
<!-- scope屬性:取值prototype,bean在IOC容器中可以有多個(gè)實(shí)例,getBean()時(shí)創(chuàng)建對象 -->
<bean id="happyMachine8" scope="prototype" class="com.atguigu.ioc.HappyMachine">
<property name="machineName" value="happyMachine"/>
</bean>
<bean id="happyComponent8" scope="singleton" class="com.atguigu.ioc.HappyComponent">
<property name="componentName" value="happyComponent"/>
</bean>
d.作用域測試
@Test
public void testExperiment08() {
ApplicationContext iocContainer = new ClassPathXmlApplicationContext("配置文件名");
HappyMachine bean = iocContainer.getBean(HappyMachine.class);
HappyMachine bean1 = iocContainer.getBean(HappyMachine.class);
//多例對比 false
System.out.println(bean == bean1);
HappyComponent bean2 = iocContainer.getBean(HappyComponent.class);
HappyComponent bean3 = iocContainer.getBean(HappyComponent.class);
//單例對比 true
System.out.println(bean2 == bean3);
}
5.高級特性:FactoryBean特性和使用
1)FactoryBean實(shí)現(xiàn)類
// 實(shí)現(xiàn)FactoryBean接口時(shí)需要指定泛型
// 泛型類型就是當(dāng)前工廠要生產(chǎn)的對象的類型
public class HappyFactoryBean implements FactoryBean<HappyMachine> {
private String machineName;
public String getMachineName() {
return machineName;
}
public void setMachineName(String machineName) {
this.machineName = machineName;
}
@Override
public HappyMachine getObject() throws Exception {
// 方法內(nèi)部模擬創(chuàng)建、設(shè)置一個(gè)對象的復(fù)雜過程
HappyMachine happyMachine = new HappyMachine();
happyMachine.setMachineName(this.machineName);
return happyMachine;
}
@Override
public Class<?> getObjectType() {
// 返回要生產(chǎn)的對象的類型
return HappyMachine.class;
}
}
2)配置FactoryBean實(shí)現(xiàn)類
<!-- FactoryBean機(jī)制 -->
<!-- 這個(gè)bean標(biāo)簽中class屬性指定的是HappyFactoryBean,但是將來從這里獲取的bean是HappyMachine對象 -->
<bean id="happyMachine7" class="com.atguigu.ioc.HappyFactoryBean">
<!-- property標(biāo)簽仍然可以用來通過setXxx()方法給屬性賦值 -->
<property name="machineName" value="iceCreamMachine"/>
</bean>
3)測試讀取FactoryBean和FactoryBean.getObject對象
@Test
public void testExperiment07() {
ApplicationContext iocContainer = new ClassPathXmlApplicationContext("spring-bean-07.xml");
//注意: 直接根據(jù)聲明FactoryBean的id,獲取的是getObject方法返回的對象
HappyMachine happyMachine = iocContainer.getBean("happyMachine7",HappyMachine.class);
System.out.println("happyMachine = " + happyMachine);
//如果想要獲取FactoryBean對象, 直接在id前添加&符號即可! &happyMachine7 這是一種固定的約束
Object bean = iocContainer.getBean("&happyMachine7");
System.out.println("bean = " + bean);
}
原文鏈接:https://blog.csdn.net/weixin_69134926/article/details/136074201
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2022-10-28 Django執(zhí)行python?manage.py?makemigrations報(bào)錯的解決方案分享_p
- 2022-05-13 python實(shí)現(xiàn)簡易圖書管理系統(tǒng)_python
- 2022-10-19 python列表[list]和元組(tuple)詳情_python
- 2023-02-09 C++存儲持續(xù)性生命周期原理解析_C 語言
- 2022-06-13 harbor可視化私有鏡像倉庫環(huán)境及服務(wù)部署示例_docker
- 2023-07-28 form表單使用Select 選擇器
- 2022-04-11 git 強(qiáng)行拉取覆蓋本地方法(Git強(qiáng)制覆蓋本地代碼)
- 2022-05-06 Nginx七層及四層反向代理配置的全過程_nginx
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支