淺析Spring IOC 依賴查找你需要知道的幾種方式
首先,我們創(chuàng)建一個包含 spring-context 依賴的 maven 項目,然后定義一個 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. 根據 Bean 名稱查找
實時查找
實時查找的意思就是說直接獲取 beanFactory, 通過 beanFactory 獲取 user 對應的 bean,代碼如下所示
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-look-up.xml"); // 這里的 “user” 就是 xml 文件中的 id,即名稱實時查找 User user = (User) beanFactory.getBean("user"); System.out.println("實時加載: " + bean);
延時查找
這里的延遲就是說,通過其他的對象來獲取 user 對應的 Bean,代碼如下所示:
ObjectFactory<User> objectFactory = (ObjectFactory<User>) beanFactory.getBean("objectFactory"); User user = objectFactory.getObject(); System.out.println("延遲加載" + user);
2. 根據 Bean 類型查找
這里的類型指的就是 user.class
單個 Bean 對象
User bean = beanFactory.getBean(User.class);
集合 Bean 對象
if(beanFactory instanceof ListableBeanFactory){ ListableBeanFactory listableBeanFactory = (ListableBeanFactory)beanFactory; Map<String, User> beansOfType = listableBeanFactory.getBeansOfType(User.class); System.out.println("集合類型:" + beansOfType); }
3. 根據 Bean 類型 + 名稱查找
4. 根據 Java 注解查找
首先我們自定義一個注解 @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(); } }
最后根據 spring 提供的 api,獲取注解 bean
if(beanFactory instanceof ListableBeanFactory){ ListableBeanFactory listableBeanFactory = (ListableBeanFactory)beanFactory; Map<String, Object> beansOfType = listableBeanFactory.getBeansWithAnnotation(Super.class); System.out.println("查找 @super 的:" + beansOfType); }
到此這篇關于淺析Spring IOC 依賴查找你需要知道的幾種方式的文章就介紹到這了,更多相關Spring IOC 依賴查找內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot?引入?Redis?并配置序列化并封裝RedisTemplate?
這篇文章主要介紹了Springboot?引入?Redis?并配置序列化并封裝RedisTemplate。文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09