发布时间:2025-12-10 22:53:17 浏览次数:1
spring 对bean的创建过程做了很完整的封装。但是提供了非常多的扩展接口,供我们使用。这一节主要是实现spring提供的获取 beanFactory,classLoader 等属性的能力。 在我们开发过程中我们经常会使用到 ApplicationContextAware接口,来获取到 spring的上下文。来完成对bean的获取,当拿到了BeanFactory以后,我们能做的东西就多起来了,我们可以通过的spring工厂获取到我们需要的类,等等。
spring 提供Aware接口机制,给外部的类提供获取spring内部信息的能力。目前spring常用的Aware接口有
Aware接口,只做标记。类似于Serializable序列化接口,仅标记这个类可以序列化。Aware 仅表示实现类具有在获取springbean创建过程中的一些内部属性的能力。
/***只做标记*spring容器感知接口*/publicinterfaceAware{}ApplicationContextAware 提供获取 applicationContext 的能力
publicinterfaceApplicationContextAwareextendsAware{voidsetApplicationContext(ApplicationContextapplicationContext);}BeanClassLoaderAware提供获取 classLoader 的能力
publicinterfaceBeanClassLoaderAwareextendsAware{voidsetBeanClassLoader(ClassLoaderclassLoader);}BeanFactoryAware 提供获取 BeanFactory 的能力
publicinterfaceBeanFactoryAwareextendsAware{voidsetBeanFactory(BeanFactorybeanFactory)throwsBeansException;}BeanNameAware 提供获取 beanName 的能力
publicinterfaceBeanNameAwareextendsAware{voidsetBeanName(StringbeanName);}他们都在创建bean完成后,在添加bean的扩展属性时,给这个bean加上特定的能力
@OverrideprotectedObjectcreateBean(StringbeanName,BeanDefinitionbeanDefinition,Object[]args){Objectbean=null;try{bean=createBeanInstance(beanDefinition,beanName,args);//注入属性applyPropertyValues(beanName,bean,beanDefinition);//提供给外部的扩展包装,执行Bean的初始化方法和BeanPostProcessor的前置和后置处理方法bean=initializeBean(beanName,bean,beanDefinition);}catch(Exceptione){thrownewRuntimeException("beancreateerror!",e);}//注册实现了DisposableBean接口的Bean对象registerDisposableBeanIfNecessary(beanName,bean,beanDefinition);registerSingleton(beanName,bean);returnbean;}privateObjectinitializeBean(StringbeanName,Objectbean,BeanDefinitionbeanDefinition)throwsBeansException{if(beaninstanceofAware){if(beaninstanceofBeanFactoryAware){((BeanFactoryAware)bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}if(beaninstanceofApplicationContextAware){((ApplicationContextAware)bean).setApplicationContext(this);}if(beaninstanceofBeanClassLoaderAware){((BeanClassLoaderAware)bean).setBeanClassLoader(getClassLoader());}if(beaninstanceofBeanNameAware){((BeanNameAware)bean).setBeanName(beanName);}}.....}实现 需要添加特定能力的 Aware接口,实现他们的方法
publicclassUserServiceimplementsInitializingBean,DisposableBean,ApplicationContextAware,BeanClassLoaderAware,BeanNameAware{privateApplicationContextapplicationContext;privateClassLoaderclassLoader;@OverridepublicvoidsetBeanClassLoader(ClassLoaderclassLoader){this.classLoader=classLoader;}@OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext){this.applicationContext=applicationContext;}}@TestpublicvoidtestContext1()throwsBeansException{ClassPathXmlApplicationContextapplicationContext=newClassPathXmlApplicationContext("classpath:spring.xml");applicationContext.registerShutdownHook();UserServiceuserService=(UserService)applicationContext.getBean("userService");System.out.println(userService.say());System.out.println(userService.getApplicationContext());System.out.println(userService.getClassLoader());System.out.println(userService.getBeanName());}到此,相信大家对“实现Aware接口的原理及使用方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是本站网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!