Spring Boot 2.x实战11 - Spring 5.x基础9 - 意识Spring容器Aware

4 意识Spring容器 - Aware

程序员的主要工作是业务逻辑代码的编写,业务逻辑代码一般都是技术无关性的,即Spring代码不会侵入到我们的业务逻辑代码中,虽然我们使用了很多Spring的注解,但注解属于一种元数据(和XML一样),不属于代码侵入的范畴。

但是有些时候我们可能不得不让自己的代码和Spring框架耦合,我们通过实现相应的Aware接口即可注入其对应的Bean。

  • BeanNameAware:可获得beanName,获得Bean的名称;
  • ResourceLoaderAware:可获得ResourceLoader,用来加载资源的Bean;
  • BeanFactoryAware:可获得BeanFactory,容器的父接口,用于管理Bean的相关操作;
  • EnvironmentAware:可获得Environment,当前应用的运行环境;
  • MessageSourceAware:可获得MessageSource,用来解析文本信息的Bean;
  • ApplicationEventPublisherAware:可获得ApplicationEventPublisher,用来发布系统时间的Bean;
  • ApplicationContextAware:可自动注入ApplicationContext,容器本身。
@Component
public class AwareSpringService implements BeanNameAware,
                                           ResourceLoaderAware,
                                           BeanFactoryAware,
                                           EnvironmentAware,
                                           ApplicationEventPublisherAware,
                                           ApplicationContextAware{

    private String beanName;
    private ResourceLoader resourceLoader;
    private BeanFactory beanFactory;
    private Environment environment;
    private ApplicationEventPublisher publisher;
    private ApplicationContext context;

    @Override //BeanNameAware接口的重载方法,自动注入了name;
    public void setBeanName(String name) { 
        this.beanName = name;
    }

    @Override//ResourceLoaderAware接口的重载方法,自动注入了resourceLoader
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

    @Override//BeanFactoryAware接口的重载方法,自动注入了beanFactory
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    @Override//EnvironmentAware接口的重载方法,自动注入了environment
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    @Override//ApplicationEventPublisherAware接口的重载方法,自动注入了applicationEventPublisher
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.publisher = applicationEventPublisher;
    }

    @Override//ApplicationContextAware接口的重载方法,自动注入了applicationContext
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context = applicationContext;
    }

    public void doSomething() throws IOException{
        beanNameDemo();
        resourceLoaderDemo();
        beanFactoryDemo();
        environmentDemo();
        publisherDemo();
        contextDemo();
    }

    private void beanNameDemo(){
        System.out.println("注入的beanName为:" + beanName);
    }

    private void resourceLoaderDemo() throws IOException {
      	//可以用resourceLoader获取外部资源
        Resource resource = resourceLoader.getResource("https://avatars3.githubusercontent.com/u/1981770");
        System.out.println("通过注入的ResourceLoader加载的文件长度为:" + resource.contentLength());

    }

    private void beanFactoryDemo(){
        AwareSpringService service =  beanFactory.getBean(AwareSpringService.class);
        System.out.println("通过注入的BeanFactory获得的当前Bean的名称为:" + service.beanName);
    }

    private void environmentDemo(){
        String osName = environment.getProperty("os.name");
        System.out.println("通过注入的Environment获得的操作系统名称为:" + osName);
    }

    private void publisherDemo(){
        System.out.println("通过注入的ApplicationEventPublisher发送了系统事件"); 
        //在”Bean之间的事件通讯“一节讲解
        publisher.publishEvent(new MessageEvent("来自AwareSpringService的消息"));
    }

    private void contextDemo(){
        System.out.println("通过注入的ApplicationContext获得容器的显示名称:" + context.getDisplayName());
    }


}

JavaConfig里执行:

@Bean
CommandLineRunner awareClr(AwareSpringService awareSpringService){
    return args -> awareSpringService.doSomething();
}

在这里插入图片描述

新书推荐:

我的新书《从企业级开发到云原生微服务:Spring Boot 实战》已出版,内容涵盖了丰富Spring Boot开发的相关知识
购买地址:https://item.jd.com/12760084.html

在这里插入图片描述

主要包含目录有:

第一章 初识Spring Boot(快速领略Spring Boot的美丽)
第二章 开发必备工具(对常用开发工具进行介绍:包含IntelliJ IDEA、Gradle、Lombok、Docker等)
第三章 函数式编程
第四章 Spring 5.x基础(以Spring 5.2.x为基础)
第五章 深入Spring Boot(以Spring Boot 2.2.x为基础)
第六章 Spring Web MVC
第七章 数据访问(包含Spring Data JPA、Spring Data Elasticsearch和数据缓存)
第八章 安全控制(包含Spring Security和OAuth2)
第九章 响应式编程(包含Project Reactor、Spring WebFlux、Reactive NoSQL、R2DBC、Reactive Spring Security)
第十章 事件驱动(包含JMS、RabbitMQ、Kafka、Websocket、RSocket)
第11章 系统集成和屁股里(包含Spring Integration和Spring Batch)
第12章 Spring Cloud与微服务
第13章 Kubernetes与微服务(包含Kubernetes、Helm、Jenkins、Istio)
多谢大家支持。

发布了116 篇原创文章 · 获赞 10 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/wiselyman/article/details/105734264
今日推荐