javascript
Spring注解驱动
文章目錄
- SpringBoot注解驅動
- SpringBoot的事件監聽
- 關于Spring *PostProcessor的總結
- 幾種*Aware反注入的實現
SpringBoot注解驅動
SpringBoot的事件監聽
事件監聽三大步。首先創建一個事件,然后創建一個監聽器,再創建一個事件發布類。
事件的監聽是在bean創建完成之后執行的,refresh()的最后一步執行:
事件類:事件類要繼承ApplicationEvent這個抽象類,抽象類可以通過匿名內部類實現(如果沒有抽象方法則大括號可以為空)
創建監聽類:監聽類繼承ApplicationListener,泛型指定固定類型。
默認的Object source只有getSource()方法。可以添加其他屬性(比如message)。
發布事件:事件的發布需要調用容器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
但是監聽方法只能有一個參數。
關于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表達式。
測試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實例化之后,初始化方法執行之前: |
@Primary與@Scope 注解含義
@Configuration public class Cai {// @Scope("prototype")@Primary@Bean("mmp")public Lv lv1(){Lv lv = new Lv();lv.setAge(100);return lv;}}總結
以上是生活随笔為你收集整理的Spring注解驱动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第五课:实现花样流水灯
- 下一篇: 全年涨幅超200%,来自东南亚的Sea