日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring注解驱动

發布時間:2024/1/8 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring注解驱动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • SpringBoot注解驅動
        • SpringBoot的事件監聽
        • 關于Spring *PostProcessor的總結
        • 幾種*Aware反注入的實現

SpringBoot注解驅動

SpringBoot的事件監聽

事件監聽三大步。首先創建一個事件,然后創建一個監聽器,再創建一個事件發布類。
事件的監聽是在bean創建完成之后執行的,refresh()的最后一步執行:
事件類:事件類要繼承ApplicationEvent這個抽象類,抽象類可以通過匿名內部類實現(如果沒有抽象方法則大括號可以為空)

package com.hxh.event;import org.springframework.context.ApplicationEvent;import javax.validation.constraints.NotNull;/*** @author Hanxiaohan* @date 2021/03/19 15:32* @since 1.0* <p>Copyright: Copyright (c) 2021</p>*/ public class SelfEvent extends ApplicationEvent {/*** Create a new {@code ApplicationEvent}.** @param source the object on which the event initially occurred or with* which the event is associated (never {@code null})*/private static final long serialVersionUID = 1L;private String message;public SelfEvent(@NotNull Object source, String message) {super(source);this.message=message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;} }

創建監聽類:監聽類繼承ApplicationListener,泛型指定固定類型。
默認的Object source只有getSource()方法。可以添加其他屬性(比如message)。

/*** @author Hanxiaohan* @date 2021/03/19 15:46* @since 1.0* <p>Copyright: Copyright (c) 2021</p>*/ @Component public class SignalListener implements ApplicationListener<SelfEvent> {@Overridepublic void onApplicationEvent(SelfEvent event) {System.out.println("test##### " + event.getMessage());} }

發布事件:事件的發布需要調用容器ApplicationContext,通過其publishEvent(),參數可以是ApplicationEvent或者自己設定的其他Event類。

/*** @author Hanxiaohan* @date 2021/03/19 15:50* @since 1.0* <p>Copyright: Copyright (c) 2021</p>*/ @Component public class EventPublisher {@Resourceprivate Ginger ginger;@AutowiredApplicationContext applicationContext;public void publish(String message){applicationContext.publishEvent(new SelfEvent(ginger,ginger.toString()+ message));}}

本示例使用了一個普通bean作為source

@Component public class Ginger {@Value("China")private String local;@Value("3.14159")private Double price;@Overridepublic String toString() {return "Ginger{" +"local='" + local + '\'' +", price=" + price +'}';}public String getLocal() {return local;}public void setLocal(String local) {this.local = local;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;} }

測試調用:

@SpringBootTest class ExtendsApplicationTests03 {@Autowiredprivate EventPublisher eventPublisher;@Testvoid contextLoads() {eventPublisher.publish("賣生姜啦,預防脫發很有效!");}}

運行結果:

test##### Ginger{local='China', price=3.14159}賣生姜啦,預防脫發很有效!

ps:上面的監聽使用了自己創建的SelfEvent event類型,如果使用ApplicationEvent,會把系統的事件也監聽出來。

使用注解監聽事件:@EventListener,可以添加多個class
但是監聽方法只能有一個參數。

@Component public class WoFe {@EventListener({ApplicationEvent.class})public void listten(ApplicationEvent event){if(event.getSource().getClass() == Ginger.class){System.out.println("注解實現::: " + ((SelfEvent)event).getMessage());}else{System.out.println("注解實現::: 而我在等你"+event.getSource());}} 。。。 注解實現::: 而我在等你[DefaultTestContext@2e3967ea testClass = ExtendsApplicationTests03, 注解實現::: Ginger{local='China', price=3.14159}賣生姜啦,預防脫發很有效! 注解實現::: 而我在等你[DefaultTestContext@2e3967ea testClass = ExtendsApplicationTests03, 。。。

關于Spring *PostProcessor的總結

/** * bean的生命周期: * bean存在注冊信息(ImportBeanDefinitionRegistrar)-->被加載到beanfactory-->被創建實例 * -->屬性賦值(populate)-(BeanPostProcessor,*Aware)->初始化-->銷毀 * * beanfactory歷程: * spring首先創建beanfactory,然后標準初始化beanfactory。。 * 然后執行BeanFactoryPostProcessor(包含兩個接口) * * BeanFactoryPostProcessor及其子接口 * BeanDefinitionRegistryPostProcessor * 根據實現PriorityOrder接口執行子接口先。 * 再然后執行“注冊BeanPostProcessor”。 * * ApplicationContextAware:屬性賦值之后,初始化之前 * BeanPostProcessor:在屬性賦值之后,初始化之前 * BeanNameAware:同上,可修改beanname; * BeanFactoryAware:在屬性賦值之后,初始化之前** BeanPostProcessor:Bean后置處理器,在bean對象初始化前后進行攔截工作。* 1,BeanFactoryPostProcessor* 在beanfactory標準初始化之后調用:所有的bean的定義已經加載到beanFactory但是還沒有被* 創建實例。可覆蓋屬性賦值。** 2,BeanDefinitionRegistryPostProcessor繼承了BeanFactoryPostProcessor* postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)* 在所以bean定義信息將要被加載,bean實例還未被創建的時候執行。*/

測試BeanDefinitionRegistryPostProcessor:

/*** registries that hold bean definitions** BeanDefinitionRegistry 為bean定義的存儲中心;以后BeanFactory就是* 按照BeanDefinitionRegistry里面保存的每一個bean定義信息創建bean實例。**/ @Component public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {System.out.println("postProcessBeanDefinitionRegistry...bean的數量:"+registry.getBeanDefinitionCount()+"!");RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Student.class);registry.registerBeanDefinition("mmp",rootBeanDefinition);AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Student.class).getBeanDefinition();registry.registerBeanDefinition("mmlgb",beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println("MyBeanDefinitionRegistryPostProcessor...bean的數量:"+beanFactory.getBeanDefinitionCount()+"!");} }

測試BeanFactoryPostProcessor
一個函數式接口,使用lambda表達式。

@Configuration @Import({MyImportBeanDefinitionRegistrar.class}) public class MainConfig {@Beanpublic BeanFactoryPostProcessor beanFactoryPostProcessor1(){return ele -> {int beanDefinitionCount = ele.getBeanDefinitionCount();String[] beanDefinitionNames = ele.getBeanDefinitionNames();System.out.println("當前beanfactory中有"+beanDefinitionCount+"個bean!");System.out.println(Arrays.asList(beanDefinitionNames));};} }

測試ImportBeanDefinitionRegistrar,使用注解導入bean:@Import({MyImportBeanDefinitionRegistrar.class})

/*** AnnotationMetadata: 當前類的注解信息* BeanDefinitionRegistry:* 注冊類把所有需要添加到容器中的bean* 調用registerBeanDefinitions手工注冊進來*/ public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry){boolean mmb1 = registry.containsBeanDefinition("mmp");boolean mmb2 = registry.containsBeanDefinition("mmlgb");if(!mmb1 && !mmb2){registry.registerBeanDefinition("goodbye", new RootBeanDefinition(Student.class));System.out.println("注冊進去goodbye");}} }

測試BeanPostProcessor

@Component public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object o, String s) throws BeansException {if(o.getClass()==Lp.class){System.out.println("3+6= 9");}return o;}@Overridepublic Object postProcessAfterInitialization(Object o, String s) throws BeansException {if(s.equals("mmp")){System.out.println("-3-6= -9");}return o;} }

幾種*Aware反注入的實現

運行在bean實例化之后,初始化方法執行之前:

/*** @author Hanxiaohan* @date 2021/03/16 10:04* @since 1.0.1* <p>Copyright: Copyright (c) 2021</p>*/ @Component public class NiuPi implements ApplicationContextAware , BeanNameAware, EmbeddedValueResolverAware, EnvironmentAware {@Autowiredprivate Lp lb;private StringValueResolver stringValueResolver;@Overridepublic String toString() {return "NiuPi{" +"lb=" + lb +'}';}private ApplicationContext application;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.application=applicationContext;for (String beanDefinitionName : applicationContext.getBeanDefinitionNames()) {System.out.println(beanDefinitionName);}}@Overridepublic void setBeanName(String name) {System.out.println(name);}@Overridepublic void setEmbeddedValueResolver(StringValueResolver stringValueResolver) {this.stringValueResolver=stringValueResolver;System.out.println(stringValueResolver.resolveStringValue("#{7.8*75*0.35}"));}@Overridepublic void setEnvironment(Environment environment) {System.out.println(environment.getProperty("os.name"));} }

@Primary與@Scope 注解含義

@Configuration public class Cai {// @Scope("prototype")@Primary@Bean("mmp")public Lv lv1(){Lv lv = new Lv();lv.setAge(100);return lv;}}

總結

以上是生活随笔為你收集整理的Spring注解驱动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。