簡(jiǎn)介
以下內(nèi)容為學(xué)習(xí) Spring 教材后的知識(shí)點(diǎn)總結(jié),方便個(gè)人復(fù)習(xí) Spring 相關(guān)知識(shí)使用。并不適合入門學(xué)習(xí)。
Spring 可通過如下方式查找 Bean
- 通過 Bean 名稱查找(實(shí)時(shí)、延遲)
- 通過 Bean 類型查找(單個(gè)、集合)
- 通過注解查找
注:以上方式又可以分為: 實(shí)時(shí)查找、延遲查找、查找單個(gè) Bean、查找集合 Bean。
實(shí)例
// 定義 1 個(gè)注解,兩個(gè) Java 類
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Super {
}
public class User {
private Long id;
private String name;
// 省略 getter and setter
}
@Super
public class SuperUser extends User {
private String address;
// 省略 getter and setter
}
<!-- 定義 Spring 配置文件 -->
<bean id="user" class="demo.User" lazy-init="true">
<property name="id" value="1"/>
<property name="name" value="karson"/>
</bean>
<bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
<property name="targetBeanName" value="user"/><!-- value="user" 引用前面定義的 id="user" 的 Bean-->
</bean>
<bean id="superUser" class="demo.SuperUser" parent="user" primary="true">
<property name="address" value="北京"/>
</bean>
// 通過以上準(zhǔn)備,開始演示相關(guān)源碼
// 通過 xml 文件創(chuàng)建 BeanFactory。
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/spring-config.xml");
// 1. 通過 Bean 名稱實(shí)時(shí)查找單個(gè) Bean。
// 如設(shè)置 lazy-init="true",首次調(diào)用 getBean 才初始化 User 對(duì)象
User userByName = (User) beanFactory.getBean("user");
// 2. 通過 Bean 類型實(shí)時(shí)查找單個(gè) Bean。
User userByType = beanFactory.getBean(User.class);
// 3. 通過 ObjectFactory 查找單個(gè) Bean。
ObjectFactory<User> objectFactory = (ObjectFactory<User>) beanFactory.getBean("objectFactory");
User user = objectFactory.getObject();
if (beanFactory instanceof ListableBeanFactory) {
ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;
// 4. 通過 Bean 類型查找 Bean 集合。
Map<String, User> users = listableBeanFactory.getBeansOfType(User.class);
// 5. 通過注解查找單個(gè) Bean。
Map<String, User> users = (Map) listableBeanFactory.getBeansWithAnnotation(Super.class);
}