淺析Spring IOC 依賴(lài)查找你需要知道的幾種方式
首先,我們創(chuàng)建一個(gè)包含 spring-context 依賴(lài)的 maven 項(xiàng)目,然后定義一個(gè) User.class
public class User { private long id; private String name; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
在 resources 目錄下,創(chuàng)建 dependency-look-up.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id = "user" class="org.example.overview.dependency.domain.User"> <property name="id" value="1"/> <property name="name" value="彭于晏"/> </bean> <bean id="superUser" class="org.example.overview.dependency.domain.SuperUser" parent="user" primary="true"> <property name="address" value="杭州"/> </bean> <bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean"> <property name="targetBeanName" value="user"/> </bean> </beans>
1. 根據(jù) Bean 名稱(chēng)查找
實(shí)時(shí)查找
實(shí)時(shí)查找的意思就是說(shuō)直接獲取 beanFactory, 通過(guò) beanFactory 獲取 user 對(duì)應(yīng)的 bean,代碼如下所示
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-look-up.xml"); // 這里的 “user” 就是 xml 文件中的 id,即名稱(chēng)實(shí)時(shí)查找 User user = (User) beanFactory.getBean("user"); System.out.println("實(shí)時(shí)加載: " + bean);
延時(shí)查找
這里的延遲就是說(shuō),通過(guò)其他的對(duì)象來(lái)獲取 user 對(duì)應(yīng)的 Bean,代碼如下所示:
ObjectFactory<User> objectFactory = (ObjectFactory<User>) beanFactory.getBean("objectFactory"); User user = objectFactory.getObject(); System.out.println("延遲加載" + user);
2. 根據(jù) Bean 類(lèi)型查找
這里的類(lèi)型指的就是 user.class
單個(gè) Bean 對(duì)象
User bean = beanFactory.getBean(User.class);
集合 Bean 對(duì)象
if(beanFactory instanceof ListableBeanFactory){ ListableBeanFactory listableBeanFactory = (ListableBeanFactory)beanFactory; Map<String, User> beansOfType = listableBeanFactory.getBeansOfType(User.class); System.out.println("集合類(lèi)型:" + beansOfType); }
3. 根據(jù) Bean 類(lèi)型 + 名稱(chēng)查找
4. 根據(jù) Java 注解查找
首先我們自定義一個(gè)注解 @Super
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Super { }
將注解表示到 superUser 類(lèi)中,這里的 superUser 繼承了 user 類(lèi)
@Super public class SuperUser extends User { private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "SuperUser{" + "address='" + address + '\'' + "} " + super.toString(); } }
最后根據(jù) spring 提供的 api,獲取注解 bean
if(beanFactory instanceof ListableBeanFactory){ ListableBeanFactory listableBeanFactory = (ListableBeanFactory)beanFactory; Map<String, Object> beansOfType = listableBeanFactory.getBeansWithAnnotation(Super.class); System.out.println("查找 @super 的:" + beansOfType); }
到此這篇關(guān)于淺析Spring IOC 依賴(lài)查找你需要知道的幾種方式的文章就介紹到這了,更多相關(guān)Spring IOC 依賴(lài)查找內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot自定義mybatis攔截器實(shí)現(xiàn)擴(kuò)展
本文主要介紹了Springboot自定義mybatis攔截器實(shí)現(xiàn)擴(kuò)展,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12關(guān)于SpringBoot整合Canal數(shù)據(jù)同步的問(wèn)題
大家都知道canal是阿里巴巴旗下的一款開(kāi)源工具,純java開(kāi)發(fā),支持mysql數(shù)據(jù)庫(kù),本文給大家介紹SpringBoot整合Canal數(shù)據(jù)同步的問(wèn)題,需要的朋友可以參考下2022-03-03Java編寫(xiě)程序之輸入一個(gè)數(shù)字實(shí)現(xiàn)該數(shù)字階乘的計(jì)算
這篇文章主要介紹了Java編寫(xiě)程序之輸入一個(gè)數(shù)字實(shí)現(xiàn)該數(shù)字階乘的計(jì)算,本文通過(guò)實(shí)例代碼給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Springboot?引入?Redis?并配置序列化并封裝RedisTemplate?
這篇文章主要介紹了Springboot?引入?Redis?并配置序列化并封裝RedisTemplate。文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09如何處理后臺(tái)向前臺(tái)傳遞的json數(shù)據(jù)
這篇文章主要介紹了如何處理后臺(tái)向前臺(tái)傳遞的json數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02