探究实现Aware接口的原理及使用

 更新时间:2023年04月28日 10:37:53   作者:Anoxia1  
这篇文章主要为大家介绍了探究实现Aware接口的原理及使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

spring 对bean的创建过程做了很完整的封装。但是提供了非常多的扩展接口,供我们使用。这一节主要是实现spring提供的获取 beanFactory,classLoader 等属性的能力。 在我们开发过程中我们经常会使用到 ApplicationContextAware接口,来获取到 spring的上下文。来完成对bean的获取,当拿到了BeanFactory以后,我们能做的东西就多起来了,我们可以通过的spring工厂获取到我们需要的类,等等。

设计&实现

spring 提供Aware接口机制,给外部的类提供获取spring内部信息的能力。目前spring常用的Aware接口有

Aware 感知接口

Aware接口,只做标记。类似于Serializable序列化接口,仅标记这个类可以序列化。Aware 仅表示实现类具有在获取springbean创建过程中的一些内部属性的能力。

/**
 * 只做标记
 * spring容器感知接口
 */
public interface Aware {
}

提供具体能力的接口

ApplicationContextAware 提供获取 applicationContext 的能力

public interface ApplicationContextAware extends Aware {
    void setApplicationContext(ApplicationContext applicationContext);
}

BeanClassLoaderAware提供获取 classLoader 的能力

public interface BeanClassLoaderAware extends Aware{
    void setBeanClassLoader(ClassLoader classLoader);
}

BeanFactoryAware 提供获取 BeanFactory 的能力

public interface BeanFactoryAware extends Aware{
    void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}

BeanNameAware 提供获取 beanName 的能力

public interface BeanNameAware extends Aware{
    void setBeanName(String beanName);
}

他们都在创建bean完成后,在添加bean的扩展属性时,给这个bean加上特定的能力

@Override
    protected Object createBean(String beanName, BeanDefinition beanDefinition, Object[] args) {
        Object bean = null;
        try {
            bean = createBeanInstance(beanDefinition, beanName, args);
            // 注入属性
            applyPropertyValues(beanName, bean, beanDefinition);
            // 提供给外部的扩展包装,执行 Bean 的初始化方法和 BeanPostProcessor 的前置和后置处理方法
            bean = initializeBean(beanName, bean, beanDefinition);
        } catch (Exception e) {
            throw new RuntimeException("bean create error!", e);
        }
        // 注册实现了 DisposableBean 接口的 Bean 对象
        registerDisposableBeanIfNecessary(beanName, bean, beanDefinition);
        registerSingleton(beanName, bean);
        return bean;
    }
private Object initializeBean(String beanName, Object bean, BeanDefinition beanDefinition) throws BeansException {
        if (bean instanceof Aware) {
            if (bean instanceof BeanFactoryAware) {
                ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
            }
            if (bean instanceof ApplicationContextAware) {
                ((ApplicationContextAware) bean).setApplicationContext(this);
            }
            if (bean instanceof BeanClassLoaderAware) {
                ((BeanClassLoaderAware) bean).setBeanClassLoader(getClassLoader());
            }
            if (bean instanceof BeanNameAware) {
                ((BeanNameAware) bean).setBeanName(beanName);
            }
        }
		.....
	}

测试

实现 需要添加特定能力的 Aware接口,实现他们的方法

public class UserService implements InitializingBean, DisposableBean, ApplicationContextAware, BeanClassLoaderAware, BeanNameAware {
    private ApplicationContext applicationContext;
    private ClassLoader classLoader;
    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        this.classLoader = classLoader;
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }
}
@Test
    public void testContext1() throws BeansException {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring.xml");
        applicationContext.registerShutdownHook();
        UserService userService = (UserService) applicationContext.getBean("userService");
        System.out.println(userService.say());
        System.out.println(userService.getApplicationContext());
        System.out.println(userService.getClassLoader());
        System.out.println(userService.getBeanName());
    }

以上就是探究实现Aware接口的原理及使用的详细内容,更多关于Aware接口原理使用的资料请关注脚本之家其它相关文章!

相关文章

  • 深入理解Java责任链模式实现灵活的请求处理流程

    深入理解Java责任链模式实现灵活的请求处理流程

    本文详细介绍了Java中的责任链模式,帮助您理解其工作原理,以及如何在代码中实现。该模式可以将请求沿着处理链路传递,实现灵活的请求处理流程。通过本文的学习,您将获得在Java应用程序中使用责任链模式的知识和技能
    2023-04-04
  • Java使用Tesseract-Ocr识别数字

    Java使用Tesseract-Ocr识别数字

    这篇文章主要介绍了Java使用Tesseract-Ocr识别数字的方法,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • SpringBoot中@PostConstruct 注解的实现

    SpringBoot中@PostConstruct 注解的实现

    在Spring Boot框架中, @PostConstruct是一个非常有用的注解,它用于在依赖注入完成后执行初始化方法,本文将介绍 @PostConstruct的基本概念、使用场景以及提供详细的代码示例,感兴趣的可以了解一下
    2024-09-09
  • IDEA配置maven环境的详细教程(Unable to import maven project报错问题的解决)

    IDEA配置maven环境的详细教程(Unable to import maven project报错问题的解决)

    这篇文章主要介绍了IDEA配置maven环境的详细教程(Unable to import maven project问题的解决),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • oracle+mybatis-plus+springboot实现分页查询的实例

    oracle+mybatis-plus+springboot实现分页查询的实例

    本文主要介绍了oracle+mybatis-plus+springboot实现分页查询,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 如何将文件流转换成byte[]数组

    如何将文件流转换成byte[]数组

    这篇文章主要介绍了如何将文件流转换成byte[]数组,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • maven-shade使用解决项目版本冲突

    maven-shade使用解决项目版本冲突

    在Maven项目中,第三方组件依赖可能与项目已有组件版本冲突,直接使用可能会导致项目运行失败,可以使用maven-shade-plugin插件,本文就来介绍一下maven-shade版本冲突,感兴趣的可以了解一下
    2024-10-10
  • java中instanceof 关键字作用和实际用途详解

    java中instanceof 关键字作用和实际用途详解

    这篇文章主要介绍了java中instanceof 关键字作用和实际用途,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 在启动后台 jar包时,使用指定的 application.yml操作

    在启动后台 jar包时,使用指定的 application.yml操作

    这篇文章主要介绍了在启动后台 jar包时,使用指定的 application.yml操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • eclipse下搭建hibernate5.0环境的步骤(图文)

    eclipse下搭建hibernate5.0环境的步骤(图文)

    这篇文章主要介绍了eclipse下搭建hibernate5.0环境的步骤(图文),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论