文章目录
夯实Spring系列|第二章:IoC 依赖查找
1.本章说明
本章将通过大量的代码来展示 Spring IoC 依赖查找
后续相关专题会做更详细的介绍 夯实Spring系列|第七章:IoC 依赖查找(专题)
2.依赖查找方式
Spring 中的依赖查找方式大致分类如下,后面会用代码一 一演示:
-
根据 Bean 名称查找
- 实时查找
- 延迟查找
-
根据 Bean 类型查找
- 单个 Bean 对象
- 集合 Bean 对象
-
根据 Bean 名称+类型查找
-
根据 Java 注解查找
3.项目环境
-
Java 8
-
maven 项目,pom.xml 文件核心依赖如下
<properties>
<spring.version>5.2.2.RELEASE</spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
- github 项目地址
https://github.com/huajiexiewenfeng/thinking-in-spring
模块 ioc-container-overview
本章的相关代码 com.huajie.thinking.in.spring.ioc.overview.dependency.lookup.DependencyLookUpDemo
4.代码演示
4.1 新建 User POJO 对象
public class User{
private Long id;
private String name;
private Integer age;
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;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public static User createUser() {
User user = new User();
user.setName("static-user");
return user;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
"}";
}
}
4.2 创建一个 dependency-lookup-context.xml 的 context 文件
在 xml 配置文件中 配置 User 对象 id 为 user
<?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="com.huajie.thinking.in.spring.ioc.overview.domain.User">
<property name="name" value="xwf"/>
<property name="age" value="18"/>
<property name="id" value="1"/>
</bean>
</beans>
4.3 根据 Bean 名称查找 - 实时查找
public class DependencyLookUpDemo {
public static void main(String[] args) {
//配置 xml 配置文件
//启动 spring 应用上下文
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-lookup-context.xml");
lookupInRealTime(beanFactory);
}
private static void lookupInRealTime(BeanFactory beanFactory) {
User user = (User) beanFactory.getBean("user");
System.out.println("实时查找---" + user);
}
}
4.4 根据 Bean 名称查找 - 延迟查找
在 xml 中新增配置
<bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
<property name="targetBeanName" value="user"/>
</bean>
通过 objectFactory
对象来获取 User 对象
private static void lookupInLazy(BeanFactory beanFactory) {
ObjectFactory<User> userObjectFactory = (ObjectFactory<User>) beanFactory.getBean("objectFactory");
User user = userObjectFactory.getObject();
System.out.println("延迟查找---" + user);
}
4.5 根据 Bean 类型查找 - 单个对象
private static void lookupByType(BeanFactory beanFactory) {
User user = beanFactory.getBean(User.class);
System.out.println("类型查找---" + user);
}
4.6 根据 Bean 类型查找 - 集合对象
private static void lookupCollectionByType(BeanFactory beanFactory) {
if (beanFactory instanceof ListableBeanFactory) {
ListableBeanFactory listBeanFactory = (ListableBeanFactory) beanFactory;
Map<String, User> users = listBeanFactory.getBeansOfType(User.class);
System.out.println("查找到的所有集合对象---" + users);
}
}
4.7 根据 Bean 名称+类型查找
private static void lookupByNameAndType(BeanFactory beanFactory) {
User user = beanFactory.getBean("user",User.class);
System.out.println("名称类型查找---" + user);
}
4.8 根据 Java 注解查找
新建一个 @Super
的注解类
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Super {
}
新建 SuperUser
类,加上 @Super
注解
@Super
public class SuperUser extends User{
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "SuperUser{" +
"address='" + address + '\'' +
'}'+super.toString();
}
}
在 context.xml 文件中配置 SuperUser 对象
<bean primary="true" id="superUser" class="com.huajie.thinking.in.spring.ioc.overview.domain.SuperUser" parent="user">
<property name="address" value="wuhan"/>
</bean>
通过getBeansWithAnnotation
查找
private static void lookupByAnnotationType(BeanFactory beanFactory) {
if (beanFactory instanceof ListableBeanFactory) {
ListableBeanFactory listBeanFactory = (ListableBeanFactory) beanFactory;
Map<String, Object> users = listBeanFactory.getBeansWithAnnotation(Super.class);
System.out.println("查找到的所有标注 @Super 集合对象---" + users);
}
}
4.9 测试截图
打印截图中多出了一些内容,因为后面的章节对代码做了一定的改动,详细源代码可以参考 github 项目
5.参考
- 极客时间-小马哥《小马哥讲Spring核心编程思想》