Spring IoC依赖查找

115 阅读1分钟

1.依赖查找

    1. 根据 Bean 名称查找
    • [实时查找]
    • [延时查找]
    1. 根据 Bean 类型查找
    • [单个 Bean 对象]
    • [集合 Bean 对象]
    1. 根据 Bean 类型 + 名称查找
    1. 根据 Java 注解查找

新建一个工程,依赖spring-context

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

创建一个User类

package ioc;

public class User {
    Long id;
    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 + ''' +
                '}';
    }
}

新建META-INF/dependency-lookup.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="ioc.User">
        <property name="id" value="1"/>
        <property name="name" value="彭于晏"/>
    </bean>
</beans>

byName实时依赖查找

/**
 * 依赖查找例子
 */
public class DependencyLookupDemo {
    public static void main(String[] args) {
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-lookup.xml");
        // 这里的 “user” 就是 xml 文件中的 id,即名称实时查找
        User user = (User) beanFactory.getBean("user");
        System.out.println(user);
    }
}

byName延迟查找

// xml中添加

<bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
    <property name="targetBeanName" value="user"/>
</bean>

// 延迟查找的例子
ObjectFactory<User> objectFactory = (ObjectFactory<User>) beanFactory.getBean("objectFactory");
User user = objectFactory.getObject();
System.out.println("延迟加载" + user);

byType 单个bean

// 单个bean对象
public static void lookUpByType() {
    BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-lookup.xml");
    User bean = beanFactory.getBean(User.class);
    System.out.println(bean);
}

byType 多个bean

存在集合bean

// 有多个bean对象的情况
public static void lookUpByTypeComplex() {
    BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-lookup.xml");
    if(beanFactory  instanceof ListableBeanFactory){
        ListableBeanFactory listableBeanFactory = (ListableBeanFactory)beanFactory;
        Map<String, User> beansOfType = listableBeanFactory.getBeansOfType(User.class);
        System.out.println("集合类型:" + beansOfType);
    }
}

byAnnotation 通过注解

package ioc;

@DependencyLookupDemo.Super
public class SuperUser extends User {
    private String address;

    public SuperUser() {
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "SuperUser{" +
                "address='" + address + ''' +
                "} " + super.toString();
    }
}

xml中添加bean的实现

<bean id="superUser" class="ioc.SuperUser" parent="user"
      primary="true">
    <property name="address" value="杭州"/>
</bean>
// 根据注解查找
public static void lookUpByAnnotation() {
    BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-lookup.xml");
    if(beanFactory  instanceof ListableBeanFactory){
        ListableBeanFactory listableBeanFactory = (ListableBeanFactory)beanFactory;
        Map<String, Object> beansOfType = listableBeanFactory.getBeansWithAnnotation(Super.class);
        System.out.println("查找 @super 的:" + beansOfType);
    }
}