spring的钩子_Spring 中的几个常用的钩子接口

spring的钩子_Spring 中的几个常用的钩子接口1 Aware 接口 Awear 这个单词的意思是知道的 所以可以猜想以 Awear 结尾的接口意思可以把他知道的东西告诉我们

大家好,欢迎来到IT知识分享网。

1.Aware接口

Awear 这个单词的意思是知道的,所以可以猜想以Awear 结尾的接口意思可以把他知道的东西告诉我们。常用的Awear接口有 ApplicationContextAware和 BeanFactoryAware,另外还有BeanNameAware 和EnvironmentAware

(1)ApplicationContextAware 接口 可以返回  ApplicationContext,也就是容器本身,我们可以通过ApplicationContext 这个容器对象做很多事,最常见的是获取Bean,和判断当前容器是否包含某个组件。下面的示例是通过ApplicationContext 获取Bean的示例(工程基于SpringBoot2.2.1.RELEASE)

packagecom.spring.hook.compent;importorg.springframework.beans.BeansException;importorg.springframework.context.ApplicationContext;importorg.springframework.context.ApplicationContextAware;importorg.springframework.stereotype.Component;/* @Author lizhilong

* @create 2019/11/28 13:51

* @desc*/@Componentpublic class SpringContextAware implementsApplicationContextAware {private staticApplicationContext app;

@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throwsBeansException {

app=applicationContext;

}public static T getBeanByClass(Classclazz){returnapp.getBean(clazz);

}public static Class>getBeanByType(String type){returnapp.getType(type);

}

@SuppressWarnings(“unchecked”)public static T getBeanByName(String name){return(T) app.getBean(name);

}

}

(2)BeanFactoryAware 。通过实现 BeanFactoryAware 可以获取BeanFactory。Beanfactory 作用和ApplicationContext 类似,BeanFactory 比ApplicationContext更底层一些, 当然功能更加单一一些,ApplicationContext 在此基础做了一些加强,比如多了国际化等一些信息。

packagecom.spring.hook.compent;importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.BeanFactory;importorg.springframework.beans.factory.BeanFactoryAware;importorg.springframework.stereotype.Component;/* @Author lizhilong

* @create 2019/11/28 16:48

* @desc*/@Componentpublic class BeanFactoryContext implementsBeanFactoryAware{private staticBeanFactory beanFactory;

@Overridepublic void setBeanFactory(BeanFactory beanFactory) throwsBeansException {

BeanFactoryContext.beanFactory=beanFactory;

}public static T getBeanByClass(Classclazz){returnbeanFactory.getBean(clazz);

}

}

(3)BeanNameAware。这个接口个人感觉作用不明显,通过实现这个接口可以获取当前Bean的名称。

packagecom.spring.hook.compent;importorg.springframework.beans.factory.BeanNameAware;importorg.springframework.stereotype.Component;/* @Author lizhilong

* @create 2019/11/28 14:19

* @desc*/@Componentpublic class Car implementsBeanNameAware{

@Overridepublic voidsetBeanName(String s) {

System.out.println(“BeanName:”+s);

}privateString brand;privateString color;publicString getCarAttr(){return “品牌:”+brand+” 颜色:”+color;

}public voidsetBrand(String brand) {this.brand =brand;

}public voidsetColor(String color) {this.color =color;

}

}

(4)EnvironmentAware 通过实现这个接口可以获取当前运行环境的一些信息。

packagecom.spring.hook.compent;importorg.springframework.context.EnvironmentAware;importorg.springframework.core.env.Environment;importorg.springframework.stereotype.Component;/* @Author lizhilong

* @create 2019/11/28 17:25

* @desc*/@Componentpublic class EnvironmentContext implementsEnvironmentAware {

@Overridepublic voidsetEnvironment(Environment environment) {

String[] activeProfile=environment.getActiveProfiles();

String[] defaultProfile=environment.getDefaultProfiles();

String port= environment.getProperty(“dog.type”);

}

}

2.InitializingBean,DisposableBean 通过实现这两个接口可以在Bean初始化后和摧毁钱做一些事。InitializingBean 接口的afterPropertiesSet() 方法在set属性完成后执行,DisposableBean 的 destroy() 方法在bean摧毁前BeanFactory执行

packagecom.spring.hook.compent;importorg.springframework.beans.factory.DisposableBean;importorg.springframework.beans.factory.InitializingBean;importorg.springframework.stereotype.Component;/* @Author lizhilong

* @create 2019/11/28 17:45

* @desc*/@Componentpublic class Fruit implementsInitializingBean,DisposableBean{

@Overridepublic void destroy() throwsException {

System.out.println(“我要被销毁了”);

}

@Overridepublic void afterPropertiesSet() throwsException {

System.out.println(“我原来的名字叫:”+name);

name= “苹果”;

}privateString name;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

}

3.PostProcessor 这个接口被称为后置处理器,常见的有:BeanPostProcessor,BeanFactoryPostProcessor ,分别为Bean的后置处理器和BeanFactory的后置处理器。

(1)BeanPostProcessor 能再Bean的初始化前后做一些事,但是个人感觉很功能很单一,无法返回具体的Bean

packagecom.spring.hook.compent;importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.config.BeanPostProcessor;importorg.springframework.stereotype.Component;/* @Author lizhilong

* @create 2019/11/28 18:19

* @desc*/@Componentpublic class BeanPostProcessorImpl implementsBeanPostProcessor{

@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throwsBeansException {

System.out.println(“初始化前BeanName:”+beanName);returnbean;

}

@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throwsBeansException {

System.out.println(“初始化后BeanName:”+beanName);returnbean;

}

}

(2)BeanFactoryPostProcessor

packagecom.spring.hook.compent;importorg.springframework.beans.BeansException;importorg.springframework.beans.MutablePropertyValues;importorg.springframework.beans.factory.config.BeanDefinition;importorg.springframework.beans.factory.config.BeanFactoryPostProcessor;importorg.springframework.beans.factory.config.ConfigurableListableBeanFactory;importorg.springframework.stereotype.Component;/* @Author lizhilong

* @create 2019/11/28 18:29

* @desc*/@Componentpublic class BeanPostFactoryContextImpl implementsBeanFactoryPostProcessor {private staticConfigurableListableBeanFactory beanFactory;

@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throwsBeansException {

beanFactory=configurableListableBeanFactory;if(beanFactory.containsBean(“fruit”)){

BeanDefinition fruit= beanFactory.getBeanDefinition(“fruit”);

MutablePropertyValues propertyValues=fruit.getPropertyValues();

propertyValues.add(“name”,”香蕉”);

}

Fruit fruit= (Fruit)beanFactory.getBean(“fruit”);

System.out.println(“我现在的名字叫:”+fruit.getName());

}

}

示例中我们在不同的时刻为 Fruit 的name属性赋值,运行结果:

我原来的名字叫:香蕉

我现在的名字叫:苹果

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/141817.html

(0)
上一篇 2025-05-14 18:20
下一篇 2025-05-14 18:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信