简介
以下内容为学习 Spring 教材后的知识点总结,方便个人复习 Spring 相关知识使用。并不适合入门学习。
Spring 可通过如下方式查找 Bean
- 通过 Bean 名称查找(实时、延迟)
- 通过 Bean 类型查找(单个、集合)
- 通过注解查找
注:以上方式又可以分为: 实时查找、延迟查找、查找单个 Bean、查找集合 Bean。
实例
// 定义 1 个注解,两个 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>
// 通过以上准备,开始演示相关源码
// 通过 xml 文件创建 BeanFactory。
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/spring-config.xml");
// 1. 通过 Bean 名称实时查找单个 Bean。
// 如设置 lazy-init="true",首次调用 getBean 才初始化 User 对象
User userByName = (User) beanFactory.getBean("user");
// 2. 通过 Bean 类型实时查找单个 Bean。
User userByType = beanFactory.getBean(User.class);
// 3. 通过 ObjectFactory 查找单个 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. 通过注解查找单个 Bean。
Map<String, User> users = (Map) listableBeanFactory.getBeansWithAnnotation(Super.class);
}
网友评论