本文共 3090 字,大约阅读时间需要 10 分钟。
Spring 提供了一种接口 —— Aware,这也是 Spring 中的扩展点,Aware 字面意思是感知到的,它能感知到什么呢?他的实现有 BeanFactoryAware,BeanNameAware,ApplicationContextAware, ImportAware 等等。这些接口能让我们动态地获取 Bean 的名字,工厂,还有这个容器的上下文,也就是他所能感知到的。最原始的接口如下,我们通过 Ctrl + h 就能找到他的实现类。
public interface Aware {}
配置类
@Configuration@ComponentScan("com.javahly.spring73")public class AppConfig {}
往容器中注入两个实验对象
@Componentpublic class IndexService {}
@Componentpublic class UserService {}
我们只需要提供 setter 方法,就能动态得到当前 Bean 的名字,如下代码,我们自定义了 MyBeanNameAware 实现 BeanNameAware 接口,命名为 MyName,并且得到了当前 Bean 的名字并通过 getBeanName 方法返回。最终结果打印出了 Bean 的名字。
@Component("MyName")public class MyBeanNameAware implements BeanNameAware { private String name; @Override public void setBeanName(String name) { this.name = name; } public String getBeanName() { return name; }}
public class Test { public static void main(String[] args){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); MyBeanNameAware myBeanNameAware = applicationContext.getBean(MyBeanNameAware.class); System.out.println(myBeanNameAware.getBeanName()); }}
输出结果:MyName
和之前的原理一样,我们只需要提供 setBeanFactory 方法,就能动态得到这个工厂。
@Componentpublic class MyBeanFactoryAware implements BeanFactoryAware { private static BeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } public static BeanFactory getBeanFactory(){ return beanFactory; }}
这里我们先是获得了这个工厂,然后通过这个工厂动态获得了一个 Bean 为 indexService,在实际开发中,在我们的业务代码中,如果需要动态的获取某个 Bean,从而切换处理某些业务逻辑,我们可以通过这种方法。BeanFactory 还提供了很多方法,比如这个 Bean 是单例的还是原型的,是否在这个工厂里面,是什么类型的等等。
public class Test { public static void main(String[] args){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); System.out.println(MyBeanFactoryAware.getBeanFactory().getBean("indexService")); }}
输出结果为:com.javahly.spring73.service.IndexService@649d209a
ApplicationContextAware 则是获取整个 Spring 容器的上下文,也就是整个 Spring 容器,通过 ApplicationContextAware 不仅可以动态获得一个 Bean,还能获取所有 BeanDefinition ,也就是 Bean 的定义信息等等。
@Componentpublic class MyApplicationContextAware implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext =applicationContext; } public static ApplicationContext getApplicationContext(){ return applicationContext; }}
public class Test { public static void main(String[] args){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); System.out.println(MyApplicationContextAware.getApplicationContext().getBean("indexService")); //获取有多少个 BeanDefinition ,包括我们自定义的和 Spring 内部的 System.out.println(MyApplicationContextAware.getApplicationContext().getBeanDefinitionCount()); }}
输出结果com.javahly.spring73.service.IndexService@28f67ac712
更多用法后续更新…
—— 完
创作不易,如果可以,看完点个关注和赞再走吧!
公众号:【星尘Pro】
github:
推荐阅读
转载地址:http://sffsi.baihongyu.com/