javascript
springboot 获取bean_SpringBoot高级(自动配置 事件监听 监控)
SpringBoot自動配置
condition-1
Condition是Spring4.0后引入的條件化配置接口,通過實現Condition接口可以完成有條件的加載相應的Bean
@Conditional要配和Condition的實現類(ClassCondition)進行使用
- ClassCondition
UserConfig
@Configurationpublic?class?UserConfig?{????@Bean????@Conditional(ClassCondition.class)????public?User?user(){????????return?new?User();????}}測試
@SpringBootApplicationpublic?class?SpringbootConditionApplication?{????public?static?void?main(String[]?args)?{????????//啟動SpringBoot的應用,返回Spring的IOC容器????????ConfigurableApplicationContext?context?=?SpringApplication.run(SpringbootConditionApplication.class,?args);????????Object?user?=?context.getBean("user");????????System.out.println(user);????}}依賴
????????????????????redis.clients????????????jedis????????這一段是判斷jedis這個依賴要有沒有來決定是否生成對應的bean對象,需要實現Condition接口,重寫mathes方法,返回false則不創建對象,在這個user對象上加入注解@Conditioal(xxx.class)來實現判斷。
Condition-2
需求:將類的判斷定義為動態的。判斷哪個字節碼文件存在可以動態指定。
自定義條件注解類
import?org.springframework.context.annotation.Conditional;import?java.lang.annotation.*;@Target({ElementType.TYPE,?ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Conditional(ClassCondition.class)public?@interface?ConditionOnClass?{????String[]?value();}**注意:**此處@ConditionOnClass為自定義注解
@Configurationpublic?class?UserConfig?{????@Bean????//@Conditional(ClassCondition.class)????@ConditionOnClass("com.alibaba.fastjson.JSON")????public?User?user(){????????return?new?User();????}????@Bean????@ConditionalOnProperty(name?=?"itcast",havingValue?=?"ii")????public?User?user2(){????????return?new?User();????}}測試User對象的創建
@SpringBootApplicationpublic?class?SpringbootConditionApplication?{????public?static?void?main(String[]?args)?{????????//啟動SpringBoot的應用,返回Spring的IOC容器????????ConfigurableApplicationContext?context?=?SpringApplication.run(SpringbootConditionApplication.class,?args);????????Object?user?=?context.getBean("user");????????System.out.println(user);????}}- 自定義注解其實是對原來注解的封裝
- @ConditionalOnProperty是看配置文件中是否存在一個這樣的鍵值對,如果有則創建、
-執行順序:
@ConditionOnClass的value值,找到依賴和自定義注解類,通過自定義注解類上的class找到具體要執行的代碼,決定是否生成bean對象。
查看條件注解源碼
SpringBoot 提供的常用條件注解:
ConditionalOnProperty:判斷配置文件中是否有對應屬性和值才初始化Bean
ConditionalOnClass:判斷環境中是否有對應字節碼文件才初始化Bean
ConditionalOnMissingBean:判斷環境中沒有對應Bean才初始化Bean
SpringBoot自動配置-切換內置web服務器
查看繼承關系圖
排除Tomcat
pom文件中的排除依賴效果
SpringBoot自動配置-Enable注解原理
SpringBoot不能直接獲取在其他工程中定義的Bean
演示代碼:
springboot-enable工程
/**?*?@ComponentScan 掃描范圍:當前引導類所在包及其子包?*?*?com.itheima.springbootenable?*?com.itheima.config?*?//1.使用@ComponentScan掃描com.itheima.config包?*?//2.可以使用@Import注解,加載類。這些類都會被Spring創建,并放入IOC容器?*?//3.可以對Import注解進行封裝。?*///@ComponentScan("com.itheima.config")//@Import(UserConfig.class)@EnableUser@SpringBootApplicationpublic?class?SpringbootEnableApplication?{????public?static?void?main(String[]?args)?{????????ConfigurableApplicationContext?context?=?SpringApplication.run(SpringbootEnableApplication.class,?args);?????//獲取Bean????????Object?user?=?context.getBean("user");????????System.out.println(user);?}}pom中引入springboot-enable-other
???????????????com.itheima??????????springboot-enable-other????????????0.0.1-SNAPSHOT??????springboot-enable-other工程
UserConfig
@Configurationpublic?class?UserConfig?{????@Bean??public?User?user()?{????????return?new?User();??}}EnableUser注解類
import?org.springframework.context.annotation.Import;import?java.lang.annotation.*;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(UserConfig.class)public?@interface?EnableUser?{myImportSelector
?public?class?MyImportSelector?implements?ImportSelector?{??????@Override??????public?String[]?selectImports(AnnotationMetadata?importingClassMetadata)?{??????????return?new?String[]{"com.itheima.domain.User",?"com.itheima.domain.Role"};??????}??}ImportBeanDefinitionRegistrar 實現類
public?class?MyImportBeanDefinitionRegistrar?implements?ImportBeanDefinitionRegistrar?{????@Override????public?void?registerBeanDefinitions(AnnotationMetadata?importingClassMetadata,?BeanDefinitionRegistry?registry)?{????????AbstractBeanDefinition?beanDefinition?=?BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();????????registry.registerBeanDefinition("user",?beanDefinition);????}}
Import4中用法:
1.導入Bean
- 2.導入配置類
- 3.導入ImportSelector的實現類。
- 4.導入ImportBeanDefinitionRegistrar實現類
自定義依賴
SpringBoot事件監聽
Java中的事件監聽機制定義了以下幾個角色:
①事件:Event,繼承 java.util.EventObject 類的對象
②事件源:Source ,任意對象Object
③監聽器:Listener,實現 java.util.EventListener 接口 的對象
SpringBoot 在項目啟動時,會對幾個監聽器進行回調,我們可以實現這些監聽器接口,在項目啟動時完成一些操作。
- ApplicationContextInitializer、
- SpringApplicationRunListener、
- CommandLineRunner、
- ApplicationRunner自定義監聽器的啟動時機:MyApplicationRunner和MyCommandLineRunner都是當項目啟動后執行,使用@Component放入容器即可使用
MyApplicationRunner
/**?*?當項目啟動后執行run方法。?*/@Componentpublic?class?MyApplicationRunner?implements?ApplicationRunner?{????@Override????public?void?run(ApplicationArguments?args)?throws?Exception?{????????System.out.println("ApplicationRunner...run");????????System.out.println(Arrays.asList(args.getSourceArgs()));????}}?MyCommandLineRunner
@Componentpublic?class?MyCommandLineRunner?implements?CommandLineRunner?{????@Override????public?void?run(String...?args)?throws?Exception?{????????System.out.println("CommandLineRunner...run");????????System.out.println(Arrays.asList(args));????}}MyApplicationContextInitializer的使用要在resource文件夾下添加META-INF/spring.factories
org.springframework.context.ApplicationContextInitializer=com.itheima.springbootlistener.listener.MyApplicationContextInitializer@Componentpublic?class?MyApplicationContextInitializer?implements?ApplicationContextInitializer?{????@Override????public?void?initialize(ConfigurableApplicationContext?applicationContext)?{????????System.out.println("ApplicationContextInitializer....initialize");????}}MySpringApplicationRunListener的使用要添加構造器(最屌)
public?class?MySpringApplicationRunListener?implements?SpringApplicationRunListener?{????public?MySpringApplicationRunListener(SpringApplication?application,?String[]?args)?{????}????@Override????public?void?starting()?{????????System.out.println("starting...項目啟動中");????}????@Override????public?void?environmentPrepared(ConfigurableEnvironment?environment)?{????????System.out.println("environmentPrepared...環境對象開始準備");????}????@Override????public?void?contextPrepared(ConfigurableApplicationContext?context)?{????????System.out.println("contextPrepared...上下文對象開始準備");????}????@Override????public?void?contextLoaded(ConfigurableApplicationContext?context)?{????????System.out.println("contextLoaded...上下文對象開始加載");????}????@Override????public?void?started(ConfigurableApplicationContext?context)?{????????System.out.println("started...上下文對象加載完成");????}????@Override????public?void?running(ConfigurableApplicationContext?context)?{????????System.out.println("running...項目啟動完成,開始運行");????}????@Override????public?void?failed(ConfigurableApplicationContext?context,?Throwable?exception)?{????????System.out.println("failed...項目啟動失敗");????}}Springboot Admin圖形化管理平臺
以后可以server打成jar包,然后其他服務通過端口去綁定注冊
Springboot 部署
部署有兩個方式
1.通過maven或者命令直接打成jar包,通過cmd,直接運行jar包即可
2.通過war包啟動,pom.xml里加入war,主文件繼承SpringBootServletInitializer,重寫方法,即可
SpringBoot流程分析
初始化
run
5.創建context
最后給個banner
1
${AnsiColor.BRIGHT_GREEN}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$${AnsiColor.BRIGHT_YELLOW}$$????????????????????????????????_.ooOoo._???????????????????????????????$$${AnsiColor.BRIGHT_RED}$$???????????????????????????????o888888888o??????????????????????????????$$${AnsiColor.BRIGHT_CYAN}$$???????????????????????????????88"??.??"88??????????????????????????????$$${AnsiColor.BRIGHT_MAGENTA}$$???????????????????????????????(|??^_^??|)??????????????????????????????$$${AnsiColor.BRIGHT_GREEN}$$???????????????????????????????O???=???/O??????????????????????????????$$${AnsiColor.BRIGHT_RED}$$????????????????????????????____/`-----'____???????????????????????????$$${AnsiColor.BRIGHT_CYAN}$$??????????????????????????.'??|???????|$$??`.?????????????????????????$$${AnsiColor.BRIGHT_MAGENTA}$$?????????????????????????/??|||???:???|||$$??????????????????????????$$${AnsiColor.BRIGHT_GREEN}$$????????????????????????/??_|||||??-:-??|||||-?????????????????????????$$${AnsiColor.BRIGHT_YELLOW}$$????????????????????????|???|????-???$$/?|???|???????????????????????$$${AnsiColor.BRIGHT_GREEN}$$????????????????????????|?_|??''-----/''??|???|???????????????????????$$${AnsiColor.BRIGHT_YELLOW}$$??????????????????????????.-___??`-`??____/-.?/???????????????????????$$${AnsiColor.BRIGHT_CYAN}$$??????????????????????___`.?.'???/--.--???`.?.?___?????????????????????$$${AnsiColor.BRIGHT_RED}$$????????????????????.""?'_/____.'??>'"".??????????????????$$${AnsiColor.BRIGHT_GREEN}$$??????????????????|?|?:??`-?`.;`.?_?/``;.`/?-?`?:?|?|?????????????????$$${AnsiColor.BRIGHT_YELLOW}$$?????????????????????`-.???_?___?/___?_/???.-`?/??/?????????????????$$${AnsiColor.BRIGHT_CYAN}$$????????????========`-.____`-._________/____.-`____.-'========?????????$$${AnsiColor.BRIGHT_MAGENTA}$$??????????????????????????????????`=---='???????????????????????????????$$${AnsiColor.BRIGHT_YELLOW}$$????????????^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^????????$$${AnsiColor.BRIGHT_GREEN}$$?????????????????????佛祖保佑??????????永無BUG?????????永不修改?????????$$${AnsiColor.BRIGHT_YELLOW}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$${AnsiColor.BRIGHT_YELLOW}2
${AnsiColor.BRIGHT_GREEN}/***${AnsiColor.BRIGHT_YELLOW}*??????┌─┐???????┌─┐?+?+${AnsiColor.BRIGHT_GREEN}?*???┌──┘?┴───────┘?┴──┐++${AnsiColor.BRIGHT_YELLOW}?*???│?????????????????│${AnsiColor.BRIGHT_YELLOW}?*???│???????───???????│++?+?+?+${AnsiColor.BRIGHT_BLACK}?*???███████───███████?│+${AnsiColor.BRIGHT_GREEN}?*???│?????????????????│+?*???│???????─┴─???????│?*???│?????????????????│?*???└───┐?????????┌───┘?${AnsiColor.BRIGHT_GREEN}*???????│?????????│?*???????│?????????│???+?+?*???????│?????????│?*???????│?????????└──────────────┐?*???????│????????????????????????│?*???????│????????????????????????├─┐?*???????│????????????????????????┌─┘?*???????│????????????????????????│?*???????└─┐??┐??┌───────┬──┐??┌──┘??+?+?+?+?*?????????│?─┤?─┤???????│?─┤?─┤?*?????????└──┴──┘???????└──┴──┘??+?+?+?+?*????????????????神獸保佑?*???????????????代碼無BUG!?*/版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:
http://blog.csdn.net/m0_46690280/article/details/108567548
總結
以上是生活随笔為你收集整理的springboot 获取bean_SpringBoot高级(自动配置 事件监听 监控)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软 Win11 KB5022303、K
- 下一篇: python特征工程插件_手把手教你用P