Aware接口作用

介紹

Aware(感知)接口是一個標記,里面沒有任何方法,實際方法定義都是子接口確定(相當于定義了一套規則,并建議子接口中應該只有一個無返回值的方法)。

我們知道spring已經定義好了很多對象,如ApplicationContext、BeanFactory、Environment等,但是這些對象是spring框架自身的,我們去獲取這些是及其困難的,所以spring定義了一套規則能讓我們很容易得獲取框架中的對象,這就是Aware的意義,現在對Aware有一定了解了吧,Aware是感知spring容器中的對象。

spring定義了很多子接口并已實現可直接可用,下圖均為spring中的子接口。
在這里插入圖片描述
如圖第一個ApplicationContextAware,類名很清晰的告訴我們是感知ApplicationContext,ApplicationContext都知道是spring容器,所以這里表示感知容器,就是我們想獲取ApplicationContext只需要實現這個接口就行。

注意
這里的接口名都是有規則的,如ApplicationContextAware就是獲取ApplicationContext的,BeanFactoryAware就是獲取BeanFactory的,見名知意。

源碼

public interface ApplicationContextAware extends Aware {/*** 只有一個方法,實現這方法spring在啟動過程中會默認將* 調用此方法并將ApplicationContext參數傳遞過來,這樣* 我們就能很容易的獲取到ApplicationContext了*/void setApplicationContext(ApplicationContext applicationContext) throws BeansException;}

例子

Teacher類并實現ApplicationContextAware 接口

package com.lp.entity;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;public class Teacher implements ApplicationContextAware {private String name;private ApplicationContext applicationContext;public ApplicationContext getApplicationContext() {return applicationContext;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +'}';}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext =applicationContext;}
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.lp"/><bean id="teacher" class="com.lp.entity.Teacher"><property name="name" value="zhangsan"/></bean>
</beans>

測試,看一看Teacher類中能不能獲取到ApplicationContext對象

package example.lp;import com.lp.entity.Teacher;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class test {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");Teacher teacher = (Teacher)context.getBean("teacher");System.out.println("------------ApplicationContext="+teacher.getApplicationContext());}
}

在這里插入圖片描述
從結果中可以清晰的看到已經獲取到了ApplicationContext對象,當我們需要其他對象也可以看看其他Aware子接口,直接實現即可。

自定義Aware接口(簡單看一下)

spring中有一個ApplicationContextAwareProcessor類,里面就是實現這些子接口功能的,invokeAwareInterfaces方法就是具體邏輯。

class ApplicationContextAwareProcessor implements BeanPostProcessor {private final ConfigurableApplicationContext applicationContext;private final StringValueResolver embeddedValueResolver;/*** Create a new ApplicationContextAwareProcessor for the given context.*/public ApplicationContextAwareProcessor(ConfigurableApplicationContext applicationContext) {this.applicationContext = applicationContext;this.embeddedValueResolver = new EmbeddedValueResolver(applicationContext.getBeanFactory());}@Override@Nullablepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof Aware) {invokeAwareInterfaces(bean);}return bean;}private void invokeAwareInterfaces(Object bean) {if (bean instanceof EnvironmentAware environmentAware) {environmentAware.setEnvironment(this.applicationContext.getEnvironment());}if (bean instanceof EmbeddedValueResolverAware embeddedValueResolverAware) {embeddedValueResolverAware.setEmbeddedValueResolver(this.embeddedValueResolver);}if (bean instanceof ResourceLoaderAware resourceLoaderAware) {resourceLoaderAware.setResourceLoader(this.applicationContext);}if (bean instanceof ApplicationEventPublisherAware applicationEventPublisherAware) {applicationEventPublisherAware.setApplicationEventPublisher(this.applicationContext);}if (bean instanceof MessageSourceAware messageSourceAware) {messageSourceAware.setMessageSource(this.applicationContext);}if (bean instanceof ApplicationStartupAware applicationStartupAware) {applicationStartupAware.setApplicationStartup(this.applicationContext.getApplicationStartup());}if (bean instanceof ApplicationContextAware applicationContextAware) {applicationContextAware.setApplicationContext(this.applicationContext);}}}

自己實現Aware接口

這個需要了解一下spring啟動過程,跟BeanPostProcessor這個接口有關,也需要了解BeanPostProcessor的執行時機,這里我就不介紹了,我自己寫了一個示例,這里只是展示怎么實現Aware的。

package com.lp.entity;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;public class Teacher implements ApplicationContextAware {private String name;private ApplicationContext applicationContext;public ApplicationContext getApplicationContext() {return applicationContext;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +'}';}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext =applicationContext;}
}
package com.lp.entity;import com.lp.TeacherAware;public class Student implements TeacherAware {private String name;private Teacher teacher;public Teacher getTeacher() {return teacher;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void setTeacher(Teacher teacher) {this.teacher =teacher;}
}
package com.lp;import com.lp.entity.Teacher;
import org.springframework.beans.factory.Aware;public interface TeacherAware extends Aware {void setTeacher(Teacher teacher);
}
package com.lp;import com.lp.entity.Teacher;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;@Component
public class TeacherAwareBeanPostProcessor implements BeanPostProcessor {private final ConfigurableApplicationContext applicationContext;@Autowiredpublic TeacherAwareBeanPostProcessor(ConfigurableApplicationContext applicationContext) {this.applicationContext = applicationContext;}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof TeacherAware teacherAware){teacherAware.setTeacher(applicationContext.getBean(Teacher.class));}return bean;}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.lp"/><bean id="teacher" class="com.lp.entity.Teacher"><property name="name" value="zhangsan"/></bean><bean id="student" class="com.lp.entity.Student"><property name="name" value="lisi"/></bean></beans>
package example.lp;import com.lp.entity.Student;
import com.lp.entity.Teacher;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class test {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");//Teacher teacher = (Teacher)context.getBean("teacher");//System.out.println("------------ApplicationContext="+teacher.getApplicationContext());Student student = (Student)context.getBean("student");System.out.println("------------Teacher="+student.getTeacher());}
}

從上述代碼和結果中可以看到,我創建了兩個bean,一個Student和一個Teacher,我用Aware方式實現了將Student中的Teacher屬性注入,當然這個場景可能不是很合適,但這里主要是演示怎么自己實現Aware接口,需要自己寫一個接口實現Aware接口并之定義一個方法(接口名最好是遵循spring規則,且只有一個void方法),創建一個實現BeanPostProcessor的對象并寫出具體實現邏輯,這兒需要你了解spring啟動流程并且知道BeanPostProcessor接口的作用。

希望對你有幫助,別忘了點贊!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14113.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14113.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14113.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024 電工杯高校數學建模競賽(A題)| 儲能配置 |建模秘籍文章代碼思路大全

鐺鐺&#xff01;小秘籍來咯&#xff01; 小秘籍團隊獨辟蹊徑&#xff0c;運用負載均衡&#xff0c;多目標規劃等強大工具&#xff0c;構建了這一題的詳細解答哦&#xff01; 為大家量身打造創新解決方案。小秘籍團隊&#xff0c;始終引領著建模問題求解的風潮。 抓緊小秘籍&am…

C 語言設計模式(結構型)

文章目錄 代理模式場景示例 門面模式場景示例 橋接模式場景示例 適配器模式場景示例 外觀模式場景示例 享元模式場景示例 裝飾器模式場景示例 組合模式場景示例 代理模式 C語言中&#xff0c;代理模式通常用于實現對象的間接訪問。代理模式是一種結構型設計模式&#xff0c;它…

微信小程序uniapp+django洗腳按摩足浴城消費系統springboot

原生wxml開發對Node、預編譯器、webpack支持不好&#xff0c;影響開發效率和工程構建。所以都會用uniapp框架開發 前后端分離&#xff0c;后端給接口和API文檔&#xff0c;注重前端,接近原生系統 使用Navicat或者其它工具&#xff0c;在mysql中創建對應名稱的數據庫&#xff0…

Java中字符串拼接方式

在Java編程中&#xff0c;字符串是非常基礎且重要的數據類型。無論是處理用戶輸入、生成日志信息還是構建復雜的文本輸出&#xff0c;字符串拼接都是一個不可避免的操作。本文將詳細探討幾種常見的字符串拼接方式&#xff0c;并分析它們的優缺點&#xff0c;以幫助開發者選擇最…

GO實名認證接口開發示例、接口集成、身份認證

翔云身份證實名認證接口&#xff0c;通過核驗身份證二要素、三要素、三要素現場人像的方式&#xff0c;實時聯網核驗身份信息的真偽。想象一下&#xff0c;無需耗費大量的人力物力&#xff0c;只需簡單幾步&#xff0c;即可將翔云身份證實名認證接口集成到您的應用中。 無論是…

集成框架 -- 項目啟動時創建mysql數據庫結構

使用 Spring JDBC DataSource 初始化 前言正文配置Spring JDBC的DataSource初始化application.propertiesapplication.yml 使用 data.sql 進行數據庫初始化application.propertiesapplication.ymlapplication.propertiesapplication.yml 前言 項目中要使用一些數據庫&#xff…

xjoi題庫一級二段題解(c語言版)

開根號 時間&#xff1a;0.2 空間&#xff1a;32M 題目描述&#xff1a; 輸入一個整數, 求它的平方根,輸出答案向下取整. 比如5√2, 16??√4 輸入格式&#xff1a; 輸入一個整數 輸出格式&#xff1a; 輸出一個整數 樣例輸入1&#xff1a; 5 樣例輸出1&#xff1a; 2 樣例輸…

cn.hutool.poi.excel 實現excel導出效果 首行高度,行樣式,顏色,合并單元格,例子樣式

需求 接了需求&#xff0c;下載excel模版&#xff0c;本來看著還是簡單的&#xff0c;然后實現起來一把淚&#xff0c;首先是使用poi&#xff0c;我查了好久&#xff0c;才實現&#xff0c;然后是我用easyexcel又實現了一遍&#xff0c;用了一個周多才實現。 這是需求&#x…

Python使用virtualenv創建虛擬環境

目錄 第一步&#xff1a;安裝virtualenv 第二步&#xff1a;選擇一個文件夾用來放所創建的虛擬環境 第三步&#xff1a;創建虛擬環境 第四步&#xff1a;激活虛擬環境 第五步&#xff1a;退出虛擬環境 第六步&#xff1a;測試安裝django 前提&#xff1a;你得有個python環…

【STL專題】深入探索C++之std::string:不止于字符串【萬字詳解】

歡迎來到CILMY23的博客 &#x1f3c6;本篇主題為&#xff1a;深入探索C之std::string&#xff1a;不止于字符串 &#x1f3c6;個人主頁&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列專欄&#xff1a;Python | C | C語言 | 數據結構與算法 | 貪心算法 | Linux &#x1f3…

IOS手機自動化一些工具的簡單有哪些?

iOS手機自動化測試或操作可以通過多種工具來實現&#xff0c;這些工具提供了豐富的功能&#xff0c;可以幫助開發者和測試人員提高效率。以下是一些簡單的iOS自動化工具&#xff1a; 1. Xcode: 蘋果官方提供的開發工具&#xff0c;包含了iOS應用開發、調試和自動化測試的功能。…

aardio - godking.vlistEx虛表點擊表頭全選、排序

新版虛表內置了名稱為 DefaultCheckedImg 和 DefaultUnCheckedImg 的兩張圖片&#xff0c;分別為 【選擇框勾選狀態默認圖片】 和 【選擇框未勾選狀態默認圖片】 以下代碼調用了這兩張圖片&#xff0c;所以請將虛表庫升級為最新版。 如果使用舊版庫&#xff0c;可以自行添加這…

【Python自動化測試】:Unittest單元測試與HTMLTestRunner自動生成測試用例的好幫手

讀者大大們好呀&#xff01;&#xff01;!?????? &#x1f525; 歡迎來到我的博客 &#x1f440;期待大大的關注哦?????? &#x1f680;歡迎收看我的主頁文章??尋至善的主頁 文章目錄 &#x1f525;前言&#x1f680;unittest編寫測試用例&#x1f680;unittest測…

六種常用設計模式

單例設計模式 單例模式指在整個系統生命周期里&#xff0c;保證一個類只能產生一個實例&#xff0c;確保該類的唯一性。 單例模式分類 單例模式可以分為懶漢式和餓漢式&#xff0c;兩者之間的區別在于創建實例的時間不同&#xff1a; 懶漢式&#xff1a;指系統運行中&#…

SpringBootWeb 篇-深入了解 Mybatis 刪除、新增、更新、查詢的基礎操作與 SQL 預編譯解決 SQL 注入問題

&#x1f525;博客主頁&#xff1a; 【小扳_-CSDN博客】 ?感謝大家點贊&#x1f44d;收藏?評論? 文章目錄 1.0 Mybatis 的基礎操作 2.0 基礎操作 - 環境準備 3.0 基礎操作 - 刪除操作 3.1 SQL 預編譯 3.2 SQL 預編譯的優勢 3.3 參數占位符 4.0 基礎操作 - 新增 4.1 主鍵返回…

Python圖像處理:從基礎到高級的全方位指南

目錄 第一部分&#xff1a;Python圖像處理基礎 1.1 圖像處理概念 1.2 Python圖像處理常用庫 1.3 實戰案例&#xff1a;圖像顯示與保存 1.4 注意事項 第二部分&#xff1a;Python圖像處理高級技巧 2.1 圖像變換 2.2 圖像增強 2.3 圖像復原 第三部分&#xff1a;Python…

esp32s3中ap與sta模式的wps配對問題

無線路由器中的WPS是Wi-Fi Protected Setup的簡稱&#xff0c;中文翻譯為Wi-Fi安全防護設置&#xff0c;它是由Wi-Fi安全聯盟推出的一種無線加密認證方式。主要是為了簡化無線局域網的安裝及安全性能配置工作&#xff0c;通過這種設置&#xff0c;讓無線連接更加方便和安全。省…

20232802 黃千里 2023-2024-2 《網絡攻防實踐》實踐十一報告

20232802 2023-2024-2 《網絡攻防實踐》實踐十一報告 1.實踐過程 1.1web瀏覽器滲透攻擊 攻擊機&#xff1a;kali172.20.10.10靶機&#xff1a;win2k172.20.10.3 首先在kali中啟動msfconsole 輸入命令search MS06-014&#xff0c;搜索滲透攻擊模塊 輸入use exploit/window…

終于讓我找到了,你也可以學會的人工智能-機器學習教程

給大家分享一套非常棒的python機器學習課程——《AI小天才&#xff1a;讓小學生輕松掌握機器學習》&#xff0c;2024年5月完結新課&#xff0c;提供配套的代碼筆記軟件包下載&#xff01;學完本課程&#xff0c;可以輕松掌握機器學習的全面應用&#xff0c;復雜特征工程&#x…

C# 跨線程訪問UI組件,serialPort1串口接收數據

在Windows應用程序&#xff08;例如WinForms或WPF&#xff09;中&#xff0c;UI組件&#xff08;如按鈕、文本框等&#xff09;都在主線程&#xff08;也稱為UI線程&#xff09;上運行。當你在一個非UI線程&#xff08;例如&#xff0c;一個后臺線程或者網絡請求線程&#xff0…