淺析Spring IOC 依賴查找你需要知道的幾種方式
首先,我們創(chuàng)建一個(gè)包含 spring-context 依賴的 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 名稱查找
實(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,即名稱實(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 類型查找
這里的類型指的就是 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("集合類型:" + beansOfType);
}
3. 根據(jù) Bean 類型 + 名稱查找
4. 根據(jù) Java 注解查找
首先我們自定義一個(gè)注解 @Super
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Super {
}
將注解表示到 superUser 類中,這里的 superUser 繼承了 user 類
@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 依賴查找你需要知道的幾種方式的文章就介紹到這了,更多相關(guān)Spring IOC 依賴查找內(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-03
Java編寫程序之輸入一個(gè)數(shù)字實(shí)現(xiàn)該數(shù)字階乘的計(jì)算
這篇文章主要介紹了Java編寫程序之輸入一個(gè)數(shù)字實(shí)現(xiàn)該數(shù)字階乘的計(jì)算,本文通過(guò)實(shí)例代碼給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
Springboot?引入?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

