網站首頁 編程語言 正文
目錄
1.組件(Bean)信息聲明配置(IoC)
1)基于無參構造函數
2)基于靜態工廠方法實例化
3)基于實例工廠方法實例化
2.組件(Bean)依賴注入配置(DI)
1)基于構造函數依賴注入(單個參數)
2)基于構造函數依賴注入(多個參數)
3)基于Setter方法依賴注入
總結:
3.IoC容器創建和使用
1)容器實例化
2)Bean對象獲取
4.組件作用域和周期方法配置
1)周期方法配置
①周期方法的聲明
②周期方法的配置
2)作用域配置
5.高級特性:FactoryBean特性和使用
1)FactoryBean實現類
2)配置FactoryBean實現類?
3)測試讀取FactoryBean和FactoryBean.getObject對象
1.組件(Bean)信息聲明配置(IoC)
1)基于無參構造函數
- 組件類
package com.atguigu.ioc;
public class HappyComponent {
//默認包含無參數構造函數
public void doWork() {
System.out.println("HappyComponent.doWork");
}
}
- xml配置文件編寫
<!-- 實驗一 [重要]創建bean -->
<bean id="happyComponent" class="com.atguigu.ioc.HappyComponent"/>
2)基于靜態工廠方法實例化
- 組件類
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)基于實例工廠方法實例化
- 組件類
public class DefaultServiceLocator {
private static ClientServiceImplclientService = new ClientServiceImpl();
public ClientService createClientServiceInstance() {
return clientService;
}
}
- xml配置文件編寫
<!-- 將工廠類進行ioc配置 -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
</bean>
<!-- 根據工廠對象的實例工廠方法進行實例化組件對象 -->
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
2.組件(Bean)依賴注入配置(DI)
1.基于構造函數依賴注入(單個參數、多個參數)
2.基于Setter方法依賴注入
1)基于構造函數依賴注入(單個參數)
- 組件類
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">
<!-- 構造函數引用 -->
<constructor-arg ref="userDao"/>
</bean>
<!-- 被引用類bean聲明 -->
<bean id="userDao" class="x.y.UserDao"/>
</beans>
2)基于構造函數依賴注入(多個參數)
- 組件類
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: 多參數,可以按照相應構造函數的順序注入數據 -->
<beans>
<bean id="userService" class="x.y.UserService">
<!-- value直接注入基本類型值 -->
<constructor-arg value="18"/>
<constructor-arg value="趙偉風"/>
<constructor-arg ref="userDao"/>
</bean>
<!-- 被引用類bean聲明 -->
<bean id="userDao" class="x.y.UserDao"/>
</beans>
<!-- 場景2: 多參數,可以按照相應構造函數的名稱注入數據 -->
<beans>
<bean id="userService" class="x.y.UserService">
<!-- value直接注入基本類型值 -->
<constructor-arg name="name" value="趙偉風"/>
<constructor-arg name="userDao" ref="userDao"/>
<constructor-arg name="age" value="18"/>
</bean>
<!-- 被引用類bean聲明 -->
<bean id="userDao" class="x.y.UserDao"/>
</beans>
<!-- 場景2: 多參數,可以按照相應構造函數的角標注入數據
index從0開始 構造函數(0,1,2....)
-->
<beans>
<bean id="userService" class="x.y.UserService">
<!-- value直接注入基本類型值 -->
<constructor-arg index="1" value="趙偉風"/>
<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對象的標識id
name = 屬性名 ref = 引用bean的id值
-->
<property name="movieFinder" ref="movieFinder" />
<!-- setter方法,注入基本數據類型movieName
name = 屬性名 value= 基本類型值
-->
<property name="movieName" value="消失的她"/>
</bean>
<bean id="movieFinder" class="examples.MovieFinder"/>
總結:
? 依賴注入(DI)包含引用類型和基本數據類型。
? 需要特別注意:引用其他bean,使用ref屬性。直接注入基本類型值,使用value屬性。
3.IoC容器創建和使用
1)容器實例化
//方式1:實例化并且指定配置文件
//參數:String...locations 傳入一個或者多個配置文件
ApplicationContext context =
new ClassPathXmlApplicationContext("services.xml", "daos.xml");
//方式2:先實例化,再指定配置文件,最后刷新容器觸發Bean實例化動作 [springmvc源碼和contextLoadListener源碼方式]
ApplicationContext context =
new ClassPathXmlApplicationContext();
//設置配置配置文件,方法參數為可變參數,可以設置一個或者多個配置
iocContainer1.setConfigLocations("services.xml", "daos.xml");
//后配置的文件,需要調用refresh方法,觸發刷新配置
iocContainer1.refresh();
2)Bean對象獲取
//方式1: 根據id獲取
//沒有指定類型,返回為Object,需要類型轉化!
HappyComponent happyComponent =
(HappyComponent) iocContainer.getBean("bean的id標識");
//使用組件對象
happyComponent.doWork();
//方式2: 根據類型獲取
//根據類型獲取,但是要求,同類型(當前類,或者之類,或者接口的實現類)只能有一個對象交給IoC容器管理
//配置兩個或者以上出現: org.springframework.beans.factory.NoUniqueBeanDefinitionException 問題
HappyComponent happyComponent = iocContainer.getBean(HappyComponent.class);
happyComponent.doWork();
//方式3: 根據id和類型獲取
HappyComponent happyComponent = iocContainer.getBean("bean的id標識", HappyComponent.class);
happyComponent.doWork();
根據類型來獲取bean時,在滿足bean唯一性的前提下,其實只是看:『對象 instanceof 指定的類型』的返回結果,
只要返回的是true就可以認定為和類型匹配,能夠獲取到。
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的作用域
準備兩個引用關系的組件類即可!!
-->
<!-- scope屬性:取值singleton(默認值),bean在IOC容器中只有一個實例,IOC容器初始化時創建對象 -->
<!-- scope屬性:取值prototype,bean在IOC容器中可以有多個實例,getBean()時創建對象 -->
<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實現類
// 實現FactoryBean接口時需要指定泛型
// 泛型類型就是當前工廠要生產的對象的類型
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 {
// 方法內部模擬創建、設置一個對象的復雜過程
HappyMachine happyMachine = new HappyMachine();
happyMachine.setMachineName(this.machineName);
return happyMachine;
}
@Override
public Class<?> getObjectType() {
// 返回要生產的對象的類型
return HappyMachine.class;
}
}
2)配置FactoryBean實現類
<!-- FactoryBean機制 -->
<!-- 這個bean標簽中class屬性指定的是HappyFactoryBean,但是將來從這里獲取的bean是HappyMachine對象 -->
<bean id="happyMachine7" class="com.atguigu.ioc.HappyFactoryBean">
<!-- property標簽仍然可以用來通過setXxx()方法給屬性賦值 -->
<property name="machineName" value="iceCreamMachine"/>
</bean>
3)測試讀取FactoryBean和FactoryBean.getObject對象
@Test
public void testExperiment07() {
ApplicationContext iocContainer = new ClassPathXmlApplicationContext("spring-bean-07.xml");
//注意: 直接根據聲明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
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-10-16 go?swagger生成接口文檔使用教程_Golang
- 2022-11-17 解讀Python中字典的key都可以是什么_python
- 2022-11-24 詳解Linux中atime,mtime,ctime的使用場景_linux shell
- 2022-05-13 Android 10 讀寫文件權限
- 2022-07-02 C++分析構造函數與析造函數的特點梳理_C 語言
- 2022-12-27 kubernetes?使用jq命令對資源配置查看方式_云其它
- 2023-07-31 linux下wordPress更改IP地址后無法訪問的解決辦法
- 2022-07-15 Python?print函數:如何將對象打印輸出_python
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支