Spring IoC 依赖注入 byName byType

160 阅读1分钟

1 大纲

  • 根据Bean名称注入
  • 根据 Bean 类型注入
    • [单个 Bean 对象]
    • [集合 Bean 对象]
  • 注入容器内建bean对象
  • 注入非Bean对象
  • 注入类型
    • 实时注入
    • 延迟注入

2 代码说明

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>
    <!--
    -->
    <bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
        <property name="targetBeanName" value="user"/>
    </bean>
    <bean id="superUser" class="ioc.SuperUser" parent="user"
          primary="true">
        <property name="address" value="杭州"/>
    </bean>
</beans>

classpath:/META-INF/dependency-injection.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">

    <import resource="dependency-lookup.xml"/>
    <bean id="useRepositoryr" class="ioc.injection.repositpry.UserRepository">
        <!-- 手动配置 硬编码 -->
        <property name="users">
            <list>
                <ref bean="superUser"/>
                <ref bean="user"/>
            </list>
        </property>
    </bean>
</beans>

以上关于bean注入的配置有点硬编码,改成下面自动注入的形式

<bean id="useRepository" class="ioc.injection.repositpry.UserRepository" autowire="byType">
</bean>

被注入的对象

package ioc.injection.repositpry;

import ioc.User;
import org.springframework.beans.factory.BeanFactory;

import java.util.Collection;

public class UserRepository {
    private Collection<User> users;
    private BeanFactory beanFactory;

    public Collection<User> getUsers() {
        return users;
    }
    public void setUsers(Collection<User> users) {
        this.users = users;
    }
    public BeanFactory getBeanFactory() {
        return beanFactory;
    }
    public void setBeanFactory(BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }
}

注入的方法

public static void injectionByName() {
    BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-injection.xml");
    UserRepository userRepository = beanFactory.getBean("useRepository",UserRepository.class);
    System.out.println(userRepository.getUsers());
    System.out.println(userRepository.getBeanFactory() == beanFactory);
}

//输出
[User{id=1, name='彭于晏'}, SuperUser{address='杭州'} User{id=1, name='彭于晏'}]
false

3. 依赖的来源

  1. 自定义bean。比如在上面xml中定义的bean的对象
  2. 内建依赖
userRepository.getBeanFactory()
  1. 容器内建bean。spring会默认对这些bean进行初始化操作
// 容器内建bean,并没有在xml中配置。容器会默认进行初始化
Environment  environment = beanFactory.getBean(Environment.class);
System.out.println("获取Environment类型的bean"+environment);