Spring 提供了一种接口 —— Aware,这也是 Spring 中的扩展点,Aware 字面意思是感知到的,它能感知到什么呢?他的实现有 BeanFactoryAware,BeanNameAware,ApplicationContextAware, ImportAware 等等。这些接口能让我们动态地获取 Bean 的名字,工厂,还有这个容器的上下文,也就是他所能感知到的。最原始的接口如下,我们通过 Ctrl + h 就能找到他的实现类。
public interface Aware {
}
配置类
@Configuration
@ComponentScan("com.javahly.spring73")
public class AppConfig {
}
往容器中注入两个实验对象
@Component
public class IndexService {
}
@Component
public 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 方法,就能动态得到这个工厂。
@Component
public 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 的定义信息等等。
@Component
public 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@28f67ac7
12
更多用法后续更新…
—— 完
创作不易,如果可以,看完点个关注和赞再走吧!
我的 Github:Github
CSDN: CSDN
个人网站: sirius blog
推荐阅读
史上最全,最完美的 JAVA 技术体系思维导图总结,没有之一!
全站导航 | 文章汇总!