AOP配置類自動注入

? ? ? ? 本文主要探究AopAutoConfiguration配置類里面的bean怎么被自動裝配的。代碼如下:

package com.example.springdemo.demos.a05;import com.example.springdemo.demos.a04.Bean1;
import com.example.springdemo.demos.a04.Bean2;
import com.example.springdemo.demos.a04.TestAutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.aop.AopAutoConfiguration;
import org.springframework.context.annotation.*;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.env.SimpleCommandLinePropertySource;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.core.type.AnnotationMetadata;import java.util.List;/*** @author zhou* @version 1.0* @description TODO* @date 2025/8/17 22:12*/
public class TestAopAuto {public static void main(String[] args) {GenericApplicationContext context = new GenericApplicationContext();/*StandardEnvironment env = new StandardEnvironment();env.getPropertySources().addLast(new SimpleCommandLinePropertySource("--spring.aop.auto=false"));context.setEnvironment(env);*/AnnotationConfigUtils.registerAnnotationConfigProcessors(context.getDefaultListableBeanFactory());context.registerBean(Config.class);context.refresh();for (String name : context.getBeanDefinitionNames()){System.out.println(name);}}@Configuration //本項目配置類@Import({MyImportSelector.class})static class Config{}static class MyImportSelector implements DeferredImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{AopAutoConfiguration.class.getName()};}}
}

輸出結果:

D:\Java2\jdk1.8.0_131\bin\java.exe "-javaagent:D:\idea2\IntelliJ IDEA 2022.3.2\lib\idea_rt.jar=53704:D:\idea2\IntelliJ IDEA 2022.3.2\bin" -Dfile.encoding=UTF-8 -classpath D:\Java2\jdk1.8.0_131\jre\lib\charsets.jar;D:\Java2\jdk1.8.0_131\jre\lib\deploy.jar;D:\Java2\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;D:\Java2\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;D:\Java2\jdk1.8.0_131\jre\lib\ext\dnsns.jar;D:\Java2\jdk1.8.0_131\jre\lib\ext\jaccess.jar;D:\Java2\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;D:\Java2\jdk1.8.0_131\jre\lib\ext\localedata.jar;D:\Java2\jdk1.8.0_131\jre\lib\ext\nashorn.jar;D:\Java2\jdk1.8.0_131\jre\lib\ext\sunec.jar;D:\Java2\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;D:\Java2\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;D:\Java2\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;D:\Java2\jdk1.8.0_131\jre\lib\ext\zipfs.jar;D:\Java2\jdk1.8.0_131\jre\lib\javaws.jar;D:\Java2\jdk1.8.0_131\jre\lib\jce.jar;D:\Java2\jdk1.8.0_131\jre\lib\jfr.jar;D:\Java2\jdk1.8.0_131\jre\lib\jfxswt.jar;D:\Java2\jdk1.8.0_131\jre\lib\jsse.jar;D:\Java2\jdk1.8.0_131\jre\lib\management-agent.jar;D:\Java2\jdk1.8.0_131\jre\lib\plugin.jar;D:\Java2\jdk1.8.0_131\jre\lib\resources.jar;D:\Java2\jdk1.8.0_131\jre\lib\rt.jar;D:\javacode\springDemo\target\classes;C:\Users\zhou\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.6.13\spring-boot-starter-web-2.6.13.jar;C:\Users\zhou\.m2\repository\org\springframework\boot\spring-boot-starter\2.6.13\spring-boot-starter-2.6.13.jar;C:\Users\zhou\.m2\repository\org\springframework\boot\spring-boot\2.6.13\spring-boot-2.6.13.jar;C:\Users\zhou\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.6.13\spring-boot-autoconfigure-2.6.13.jar;C:\Users\zhou\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.6.13\spring-boot-starter-logging-2.6.13.jar;C:\Users\zhou\.m2\repository\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;C:\Users\zhou\.m2\repository\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;C:\Users\zhou\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;C:\Users\zhou\.m2\repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;C:\Users\zhou\.m2\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;C:\Users\zhou\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\zhou\.m2\repository\org\yaml\snakeyaml\1.29\snakeyaml-1.29.jar;C:\Users\zhou\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.6.13\spring-boot-starter-json-2.6.13.jar;C:\Users\zhou\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.13.4.2\jackson-databind-2.13.4.2.jar;C:\Users\zhou\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.4\jackson-annotations-2.13.4.jar;C:\Users\zhou\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.13.4\jackson-core-2.13.4.jar;C:\Users\zhou\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.4\jackson-datatype-jdk8-2.13.4.jar;C:\Users\zhou\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.4\jackson-datatype-jsr310-2.13.4.jar;C:\Users\zhou\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.4\jackson-module-parameter-names-2.13.4.jar;C:\Users\zhou\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.6.13\spring-boot-starter-tomcat-2.6.13.jar;C:\Users\zhou\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.68\tomcat-embed-core-9.0.68.jar;C:\Users\zhou\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.68\tomcat-embed-el-9.0.68.jar;C:\Users\zhou\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.68\tomcat-embed-websocket-9.0.68.jar;C:\Users\zhou\.m2\repository\org\springframework\spring-web\5.3.23\spring-web-5.3.23.jar;C:\Users\zhou\.m2\repository\org\springframework\spring-beans\5.3.23\spring-beans-5.3.23.jar;C:\Users\zhou\.m2\repository\org\springframework\spring-webmvc\5.3.23\spring-webmvc-5.3.23.jar;C:\Users\zhou\.m2\repository\org\springframework\spring-aop\5.3.23\spring-aop-5.3.23.jar;C:\Users\zhou\.m2\repository\org\springframework\spring-context\5.3.23\spring-context-5.3.23.jar;C:\Users\zhou\.m2\repository\org\springframework\spring-expression\5.3.23\spring-expression-5.3.23.jar;C:\Users\zhou\.m2\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;C:\Users\zhou\.m2\repository\org\springframework\spring-core\5.3.23\spring-core-5.3.23.jar;C:\Users\zhou\.m2\repository\org\springframework\spring-jcl\5.3.23\spring-jcl-5.3.23.jar com.example.springdemo.demos.a05.TestAopAuto
22:35:54.151 [main] DEBUG org.springframework.context.support.GenericApplicationContext - Refreshing org.springframework.context.support.GenericApplicationContext@4361bd48
22:35:54.191 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
22:35:54.438 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
22:35:54.440 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'forceAutoProxyCreatorToUseClassProxying'
22:35:54.442 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
22:35:54.447 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
22:35:54.448 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
22:35:54.452 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.aop.config.internalAutoProxyCreator'
22:35:54.521 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'com.example.springdemo.demos.a05.TestAopAuto$Config'
22:35:54.524 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration'
22:35:54.525 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.aop.AopAutoConfiguration'
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
com.example.springdemo.demos.a05.TestAopAuto$Config
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration
forceAutoProxyCreatorToUseClassProxying
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
org.springframework.aop.config.internalAutoProxyCreatorProcess finished with exit code 0

? ? ? ?可以看到,com.example.springdemo.demos.a05.TestAopAuto$Config之下的類都是通過aop自動配置類注入的bean。之上的是通過注入bean工廠后處理器自帶的bean。

?進入AopAutoConfiguration類的源碼:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package org.springframework.boot.autoconfigure.aop;import org.aspectj.weaver.Advice;
import org.springframework.aop.config.AopConfigUtils;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration(proxyBeanMethods = false
)
@ConditionalOnProperty(prefix = "spring.aop",name = {"auto"},havingValue = "true",matchIfMissing = true
)
public class AopAutoConfiguration {public AopAutoConfiguration() {}@Configuration(proxyBeanMethods = false)@ConditionalOnMissingClass({"org.aspectj.weaver.Advice"})@ConditionalOnProperty(prefix = "spring.aop",name = {"proxy-target-class"},havingValue = "true",matchIfMissing = true)static class ClassProxyingConfiguration {ClassProxyingConfiguration() {}@Beanstatic BeanFactoryPostProcessor forceAutoProxyCreatorToUseClassProxying() {return (beanFactory) -> {if (beanFactory instanceof BeanDefinitionRegistry) {BeanDefinitionRegistry registry = (BeanDefinitionRegistry)beanFactory;AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);}};}}@Configuration(proxyBeanMethods = false)@ConditionalOnClass({Advice.class})static class AspectJAutoProxyingConfiguration {AspectJAutoProxyingConfiguration() {}@Configuration(proxyBeanMethods = false)@EnableAspectJAutoProxy(proxyTargetClass = true)@ConditionalOnProperty(prefix = "spring.aop",name = {"proxy-target-class"},havingValue = "true",matchIfMissing = true)static class CglibAutoProxyConfiguration {CglibAutoProxyConfiguration() {}}@Configuration(proxyBeanMethods = false)@EnableAspectJAutoProxy(proxyTargetClass = false)@ConditionalOnProperty(prefix = "spring.aop",name = {"proxy-target-class"},havingValue = "false")static class JdkDynamicAutoProxyConfiguration {JdkDynamicAutoProxyConfiguration() {}}}
}

注意看上面的條件

@ConditionalOnProperty(prefix = "spring.aop",name = {"auto"},havingValue = "true",matchIfMissing = true
)

只要當下面條件之一成立便可加載AopAutoConfiguration里面的配置的bean

1)配置文件里面有spring.aop開頭的屬性,名字為auto,值為ture

2)上面配置缺失

現在我們手動在main方法里面把spring.aop.auto設置為false,便不會加載里面的bean

測試結果如下:

跟之前對比少了四個bean。

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

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

相關文章

云計算-K8s 實戰:Pod、安全上下文、HPA 、CRD、網絡策略、親和性等功能配置實操指南

簡介 此次圍繞Kubernetes 日常管理中的核心場景,提供了從基礎到進階的實操配置指南。內容涵蓋 9 大關鍵知識點:從使用 nginx 鏡像創建 QoS 類為 Guaranteed 的 Pod,到為 Pod 配置安全上下文以指定運行用戶和組;從自定義 Student 資源類型(CRD),到配置 Sidecar 實現跨命…

嵌入式LINUX——————TCP并發服務器

一、服務器1.服務器分類單循環服務器:只能處理一個客戶端任務的服務器 并發服務器:可同時處理多個客戶端任務的服務器二、TCP并發服務器的構建1.如何構建? (1)多進程(每一次創建都非常耗時耗空間&#…

論文潤色不能降低文章的重復率

最近大家問到多的,你們潤色好了重復率會不會就降低了。這事兒啊,得從好幾個方面去剖析,今天咱們就一塊兒來探個究竟。咱們先得清楚,重復率檢測工具一般會把內容標記成兩類:一是那些和其他文獻在文字表達上高度相似的部…

Python爬蟲實戰:構建alltheplaces平臺地理信息數據采集系統

1. 引言 1.1 研究背景與意義 在大數據與智慧城市建設的推動下,地理位置信息(如餐館、景點、公共設施等 POI 數據)已成為商業分析、城市規劃、公共服務優化的核心基礎數據。alltheplaces 作為全球領先的開放場所數據平臺,整合了來自多個數據源的標準化信息,涵蓋場所名稱、…

HTML第三次作業

抽獎項目代碼<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>簡易抽獎轉盤</title><sty…

PyTorch 面試題及詳細答案120題(01-05)-- 基礎概念與安裝

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

云手機選哪個比較好用?

云手機作為基于云計算技術運行的一款虛擬手機&#xff0c;能夠幫助企業與個人用戶進行賬號多開和遠程訪問等多種功能&#xff0c;是手游玩家的首要選擇&#xff0c;能夠多開賬號掛機不卡頓&#xff0c;但是哪一款云手機更加流暢好用呢&#xff1f;對于熱衷于手游的玩家來說&…

[科研理論]無人機底層控制算法PID、LQR、MPC解析

文章目錄1. PX4飛控PID簡介1.1 位置控制器1.2 速度控制器1.3 加速度和yaw轉到姿態1.4 姿態控制器1.5 角速率控制器2. 線性二次型優化&#xff08;LQR&#xff09;控制3. 模型預測控制MPC/NMPC3.1 MPC3.2 NMPC1. PX4飛控PID簡介 相關鏈接&#xff1a;PX4官方中文文檔、PID概念(…

AI系統性思維復盤概述

核心價值&#xff1a;從“被動思考”到“主動進化”。 基于數據驅動、機器學習和知識圖譜的智能化組織學習系統&#xff0c;它將經驗積累從傳統的主觀性、碎片化模式轉變為客觀性、系統化的科學模式&#xff0c;最終實現從被動應對向主動預防、從經驗決策向數據決策、從個體智慧…

C++繼承(2)

2.基類和派生類間的轉換 ?public繼承的派?類對象可以賦值給基類的指針/基類的引?。這?有個形象的說法叫切?或者切 割。寓意把派?類中基類那部分切出來&#xff0c;基類指針或引?指向的是派?類中切出來的基類那部分。 ? 基類對象不能賦值給派?類對象。 ? 基類的指針或…

easya2a: 一鍵將 LangChain Agent 發布為 A2A 服務

easya2a: 一鍵將 LangChain Agent 發布為 A2A 服務 隨著 A2A (Agent-to-Agent) 協議的發布&#xff0c;相關的實踐項目也逐漸涌現。對于許多希望體驗 A2A 功能&#xff0c;但又擔心學習成本和開發時間的開發者來說&#xff0c;推薦使用 easya2a——一個可以快速、無縫地將現有 …

原學之設計模式- 設計模式來源

引言 各位旅行者們你們好&#xff0c;我是小森&#xff0c;首先我為啥是程序員。學了技術快六年了&#xff0c;但一直都是斷斷續續&#xff0c;本身自己的條件&#xff0c;從2021年11月份開始下載原神&#xff0c;總而言之不了解一些抽卡機制導致退了并且刪除了具體賬號打算重新…

有鹿機器人:AI技術如何重新定義「掃地」這件小事?

當掃地成為一門“技術活”掃地&#xff0c;可能是人類最古老的清潔行為之一。從掃帚到吸塵器&#xff0c;再到今天的無人駕駛清潔設備&#xff0c;我們一直在尋找更高效、更徹底的方式維護環境整潔。但有鹿機器人的出現&#xff0c;讓“掃地”這件事有了新的定義——它不再只是…

62.不同路徑

dp問題描述 62.不同路徑 確定本題的狀態表示 dp[i,j]表示的是從左上角走到這個位置的路徑條數 確定本題的狀態轉移方程 根據已知條件&#xff1a;dp[0,0]1&#xff0c;dp[0,1]1&#xff0c;dp[1,0]1 本題的狀態轉移方程是&#xff1a; dp[i,j]dp[i,j-1]dp[i-1,j] 填表求…

python---包

文章目錄包的基本概念創建包的基本結構__init__.py文件導入包和模塊相對導入&#xff08;在包內部使用&#xff09;導入包和導入模塊的區別包是Python中組織模塊的一種方式&#xff0c;它允許你將相關的模塊分組在一起&#xff0c;形成一個層次結構。包的主要目的是幫助避免命名…

超詳細yolov8/11-obb旋轉框全流程概述:配置環境、數據標注、訓練、驗證/預測、onnx部署(c++/python)詳解

因為yolo的檢測/分割/姿態/旋轉/分類模型的環境配置、訓練、推理預測等命令非常類似&#xff0c;這里不再詳細敘述環境配置&#xff0c;主要參考【超詳細yolo8/11-detect目標檢測全流程概述&#xff1a;配置環境、數據標注、訓練、驗證/預測、onnx部署(c/python)詳解】&#xf…

創世理論達成 全關聯的動態振動網:量子世界的“底層邏輯”

全關聯的動態振動網&#xff1a;量子世界的“底層邏輯”&#xff08;不帶公式&#xff0c;超級詳細&#xff09;要真正理解量子世界的本質&#xff0c;我們需要跳出“粒子”和“波”的傳統框架&#xff0c;從量子場論的核心邏輯出發&#xff0c;用最生活化的類比和日常經驗&…

銀行間交易IMIX協議加密相關

加密流程 字段篩選與序列化 提取業務報文中標記為敏感的字段&#xff0c;生成待加密的數據塊 <!-- 示例&#xff1a;原始交易指令 --> <Order><Symbol>ABC123</Symbol> <!-- 非敏感 --><Price>100.50</Price> …

ABM和強化學習-2015年全國大學生數學建模競賽B題

多智能體系統&#xff08;Agent-Based Model, ABM&#xff09;和強化學習&#xff08;Reinforcement Learning, RL&#xff09;是兩個不同但可結合的概念&#xff0c;尤其在復雜系統建模和人工智能領域有重要應用。下面分別解釋它們&#xff0c;并說明二者的關聯&#xff1a; …

ALBEF/BLIP/BLIP2/Instruct BLIP/X Instruct BLIP

ALBEF 研究動機 ALBEF之前的一些方式&#xff0c; 視覺分支基本都是基于 dector的方式&#xff08;檢出目標框&#xff09;&#xff0c;如下圖所示&#xff0c;由于大量的數據沒有標框&#xff0c;因此視覺預訓練的受限于dector的檢測方式。創新點 能不能不再采用dector的方式訓…