浅析Spring IOC 依赖查找你需要知道的几种方式

 更新时间:2021年08月17日 14:54:34   作者:越不过山丘  
这篇文章主要介绍了浅析Spring IOC 依赖查找的几种方式,Spring是Java面试中最常考的,学Java的小伙伴快来看看吧

首先,我们创建一个包含 spring-context 依赖的 maven 项目,然后定义一个 User.class

public class User {

    private long id;
    private 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 + '\'' +
                '}';
    }
 }

在 resources 目录下,创建 dependency-look-up.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="org.example.overview.dependency.domain.User">
        <property name="id" value="1"/>
        <property name="name" value="彭于晏"/>
    </bean>

    <bean id="superUser" class="org.example.overview.dependency.domain.SuperUser" parent="user"
          primary="true">
        <property name="address" value="杭州"/>
    </bean>

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

</beans>

1. 根据 Bean 名称查找

实时查找

实时查找的意思就是说直接获取 beanFactory, 通过 beanFactory 获取 user 对应的 bean,代码如下所示

 BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-look-up.xml");
// 这里的 “user” 就是 xml 文件中的 id,即名称实时查找                
User user = (User) beanFactory.getBean("user");
System.out.println("实时加载: " + bean);

延时查找

这里的延迟就是说,通过其他的对象来获取 user 对应的 Bean,代码如下所示:

ObjectFactory<User> objectFactory = (ObjectFactory<User>) beanFactory.getBean("objectFactory");
User user = objectFactory.getObject();
System.out.println("延迟加载" + user);

2. 根据 Bean 类型查找

这里的类型指的就是 user.class

单个 Bean 对象

User bean = beanFactory.getBean(User.class);

集合 Bean 对象

if(beanFactory  instanceof ListableBeanFactory){
      ListableBeanFactory listableBeanFactory = (ListableBeanFactory)beanFactory;
      Map<String, User> beansOfType = listableBeanFactory.getBeansOfType(User.class);
      System.out.println("集合类型:" + beansOfType);
 }

3. 根据 Bean 类型 + 名称查找

4. 根据 Java 注解查找

首先我们自定义一个注解 @Super

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Super {
}

将注解表示到 superUser 类中,这里的 superUser 继承了 user 类

@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();
    }
}

最后根据 spring 提供的 api,获取注解 bean

 if(beanFactory  instanceof ListableBeanFactory){
       ListableBeanFactory listableBeanFactory = (ListableBeanFactory)beanFactory;
       Map<String, Object> beansOfType = listableBeanFactory.getBeansWithAnnotation(Super.class);
       System.out.println("查找 @super 的:" + beansOfType);
 }

到此这篇关于浅析Spring IOC 依赖查找你需要知道的几种方式的文章就介绍到这了,更多相关Spring IOC 依赖查找内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java ForkJoin框架的原理及用法

    Java ForkJoin框架的原理及用法

    这篇文章主要介绍了Java ForkJoin框架的原理及用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java实现桌面日历

    Java实现桌面日历

    这篇文章主要为大家详细介绍了Java实现桌面日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Java黑科技:replace首个替换一秒搞定

    Java黑科技:replace首个替换一秒搞定

    要实现只替换第一个匹配项,可以使用Java中的String类的replaceFirst方法,该方法接受两个参数,第一个参数是要替换的字符串或正则表达式,第二个参数是替换后的字符串,需要的朋友可以参考下
    2023-10-10
  • Springboot自定义mybatis拦截器实现扩展

    Springboot自定义mybatis拦截器实现扩展

    本文主要介绍了Springboot自定义mybatis拦截器实现扩展,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 详谈java集合框架

    详谈java集合框架

    这篇文章主要介绍了详谈java集合框架 ,需要的朋友可以参考下
    2015-05-05
  • 关于SpringBoot整合Canal数据同步的问题

    关于SpringBoot整合Canal数据同步的问题

    大家都知道canal是阿里巴巴旗下的一款开源工具,纯java开发,支持mysql数据库,本文给大家介绍SpringBoot整合Canal数据同步的问题,需要的朋友可以参考下
    2022-03-03
  • Java编写程序之输入一个数字实现该数字阶乘的计算

    Java编写程序之输入一个数字实现该数字阶乘的计算

    这篇文章主要介绍了Java编写程序之输入一个数字实现该数字阶乘的计算,本文通过实例代码给大家介绍的非常想详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 基于Java实现记事本功能

    基于Java实现记事本功能

    这篇文章主要为大家详细介绍了基于Java实现记事本功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • Springboot 引入 Redis 并配置序列化并封装RedisTemplate 

    Springboot 引入 Redis 并配置序列化并封装RedisTemplate 

    这篇文章主要介绍了Springboot 引入 Redis 并配置序列化并封装RedisTemplate。文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 如何处理后台向前台传递的json数据

    如何处理后台向前台传递的json数据

    这篇文章主要介绍了如何处理后台向前台传递的json数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论