SpringIOC容器初始化源码解析(2)—— Aware及其子接口

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: ApplicationContextAwareBeanNameAware其他的

从Bean里获取到容器实例并对其进行操作( 类名如果是xxxAware,xxx就是可以获取到的)


public interface Aware {}


仅仅是个空的接口,只能当做标签来使用,真正能发挥作用的是继承了这个接口的子接口。


54.png


当类需要容器提供帮助的时候,就需要向容器证明类本身是可以感知到容器的存在的,即实现特定类型的aware接口。


ApplicationContextAware


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

实现了该接口的bean,在容器创建这个bean实例的时候,将容器本身的实例作为参数传进来给这个bean使用


BeanNameAware


package org.springframework.beans.factory;
public interface BeanNameAware extends Aware {
   void setBeanName(String name);
}


方法的作用是将bean的名字传进来供接口实现类使用。



其他的


BeanFactoryAware主要是用于获取当前的BeanFactory,这样就可以调用容器服务

MessageSourceAware是用来获取MessageSource相关的文本信息

ApplicationEventPublisherAware是用来获取发布器实例以发布事件

ResourceLoaderAware主要是用来获取资源加载器的,通过资源加载器可以获取外部资源加载文件

每一个Aware都会有一个对应的set

可以修改WelcomeController来进行一个测试:


点击获取源码


package com.wjw.controller;
import com.wjw.service.WelcomeService;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanInitializationException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Controller;
@Controller
public class WelcomeController implements ApplicationContextAware, BeanNameAware {
   private String myName;
   private ApplicationContext myContainer;
   @Autowired
   private WelcomeService welcomeService;
   public void handleRequest(){
      welcomeService.sayHello("来自Controller的问候");
      System.out.println("I am:" + myName);
      String[] beanDefinitionNames = myContainer.getBeanDefinitionNames();
      for(String beanDefinitionName : beanDefinitionNames) {
         System.out.println("I get:" + beanDefinitionName);
      }
   }
   @Override
   public void setBeanName(String name) {
      this.myName = name;
   }
   @Override
   public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
      this.myContainer = applicationContext;
   }
}


55.png


注意:想要获取容器提供的支援,除了实现aware接口之外,本身还必须是被容器管理的bean才行。

相关文章
|
17天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
44 3
|
19天前
|
安全 持续交付 Docker
深入理解并实践容器化技术——Docker 深度解析
深入理解并实践容器化技术——Docker 深度解析
41 2
|
25天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
26天前
|
运维 持续交付 虚拟化
深入解析Docker容器化技术的核心原理
深入解析Docker容器化技术的核心原理
45 1
|
1月前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
47 3
|
29天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
67 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
75 0
|
2月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0
|
2月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
64 0
|
2月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
85 0

推荐镜像

更多