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