1. 依赖查找

2021-07-09  本文已影响0人  hopi

简介

以下内容为学习 Spring 教材后的知识点总结,方便个人复习 Spring 相关知识使用。并不适合入门学习。
Spring 可通过如下方式查找 Bean

  1. 通过 Bean 名称查找(实时、延迟)
  2. 通过 Bean 类型查找(单个、集合)
  3. 通过注解查找
    注:以上方式又可以分为: 实时查找、延迟查找、查找单个 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);
        }

上一篇 下一篇

猜你喜欢

热点阅读