山東省疫情防控最新政策seo外包收費(fèi)
Aware 接口的回調(diào)方法是在 Bean 實(shí)例化之后調(diào)用的。具體來說,這些回調(diào)方法是在依賴注入完成后,但在 Bean 完全初始化之前調(diào)用的。這是 Spring 容器管理 Bean 生命周期的一部分
完成了屬性賦值之后,Spring會執(zhí)行一些回調(diào),包括: 1. BeanNameAware:回傳beanName給bean對象。 2. BeanClassLoaderAware:回傳classLoader給bean對象。 3. BeanFactoryAware:回傳beanFactory
1、BeanNameAware:
- 回調(diào)目的:告訴 Bean 它自己的名字。
- 大白話解釋:Spring 會調(diào)用 setBeanName(String name) 方法,把 Bean 的名字告訴給 Bean 本身。這樣,Bean 就知道它在 Spring 容器中的名字是什么。
- 應(yīng)用場景:如果你的 Bean 需要知道自己在 Spring 容器中的名字,可以實(shí)現(xiàn) BeanNameAware 接口。
2、BeanClassLoaderAware:
- 回調(diào)目的:告訴 Bean 它的類加載器。
- 大白話解釋:Spring 會調(diào)用 setBeanClassLoader(ClassLoader classLoader) 方法,把類加載器告訴給 Bean 本身。這樣,Bean 就可以使用這個類加載器來加載類。
- 應(yīng)用場景:如果你的 Bean 需要動態(tài)加載類,可以實(shí)現(xiàn) BeanClassLoaderAware 接口。
3、BeanFactoryAware:
- 回調(diào)目的:告訴 Bean 它所在的 BeanFactory。
- 大白話解釋:Spring 會調(diào)用 setBeanFactory(BeanFactory beanFactory) 方法,把 BeanFactory 的引用告訴給 Bean 本身。這樣,Bean 就可以訪問和操作整個 Spring 容器。
- 應(yīng)用場景:如果你的 Bean 需要訪問 Spring 容器中的其他 Bean,或者需要執(zhí)行一些與容器相關(guān)的操作,可以實(shí)現(xiàn) BeanFactoryAware 接口。
當(dāng)然Spring中還有很多其它功能的aware接口或者自定義aware接口
具體示例
1. 定義 MyBean 類
首先,定義一個 MyBean 類,實(shí)現(xiàn) BeanNameAware、BeanClassLoaderAware 和 BeanFactoryAware 接口:
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.BeanClassLoaderAware;public class MyBean implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware {private String beanName;private ClassLoader classLoader;private BeanFactory beanFactory;@Overridepublic void setBeanName(String name) {this.beanName = name;System.out.println("Bean name is: " + name);}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {this.classLoader = classLoader;System.out.println("Class loader is: " + classLoader);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {this.beanFactory = beanFactory;System.out.println("BeanFactory is: " + beanFactory);}public void doSomething() {System.out.println("Doing something...");// 你可以在這里使用 beanName、classLoader 和 beanFactory}
}
2. 定義配置類
接下來,定義一個配置類,使用 @Configuration 和 @Bean 注解來配置 MyBean:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}
}
3. 啟動 Spring 應(yīng)用
最后,編寫一個主類來啟動 Spring 應(yīng)用,并獲取 MyBean 實(shí)例
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {// 創(chuàng)建 Spring 應(yīng)用上下文AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 獲取 MyBean 實(shí)例MyBean myBean = context.getBean(MyBean.class);// 調(diào)用 MyBean 的方法myBean.doSomething();// 關(guān)閉上下文context.close();}
}
運(yùn)行結(jié)果
當(dāng)你運(yùn)行 Main 類時,你會看到類似以下的輸出
解釋
1、MyBean 類:
- 實(shí)現(xiàn)了 BeanNameAware、BeanClassLoaderAware 和 BeanFactoryAware 接口。
- 重寫了 setBeanName、setBeanClassLoader 和 setBeanFactory 方法,在這些方法中打印相關(guān)信息。
2、AppConfig 類:
- 使用 @Configuration 注解標(biāo)記為配置類。
- 使用 @Bean 注解定義 MyBean 的 Bean。
3、Main 類:
- 使用 AnnotationConfigApplicationContext 創(chuàng)建 Spring 應(yīng)用上下文,并傳入配置類 AppConfig。
- 從上下文中獲取 MyBean 實(shí)例,并調(diào)用其 doSomething 方法。
- 最后關(guān)閉上下文。
通過這種方式,你可以使用純 Java 配置來實(shí)現(xiàn) BeanNameAware、BeanClassLoaderAware 和 BeanFactoryAware 回調(diào)
當(dāng)然還有更多的
- i. EnvironmentAware:回傳環(huán)境變量
- ii. EmbeddedValueResolverAware:回傳占位符解析器
- iii. ResourceLoaderAware:回傳資源加載器
- iv. ApplicationEventPublisherAware:回傳事件發(fā)布器
- v. MessageSourceAware:回傳國際化資源
- vi. ApplicationStartupAware:回傳應(yīng)用其他監(jiān)聽對象,可忽略
- vii. ApplicationContextAware:回傳Spring容器ApplicationContext