java Spring boot使用spring反射

spring 反射java

当你配置各类各样的bean时,是以配置文件的形式配置的,你须要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行。spring

1.能够经过类名去实例化这个类app

applicationContext.getBean(name)
2.经过类型获取类
applicationContext.getBeansOfType(clazz);

首先要拿到spring容器,类里实现ApplicationContextAware接口能获取applicationContext

能够把获取bean的方法写到一个工具类里实现ApplicationContextAware,把applicationContext定义成常量方便调用
 1  private static ApplicationContext applicationContext = null;
 2 
 3     @Override
 4     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
 5         if (SpringUtil.applicationContext == null) {
 6             SpringUtil.applicationContext = applicationContext;
 7         }
 8     }
 9 
10     public static ApplicationContext getApplicationContext() {
11         return applicationContext;
12     }
13 
14     public static <T> Map<String, T> getBeanOfType(Class<T> clazz) {
15         return getApplicationContext().getBeansOfType(clazz);
16     }
17 
18     public static Object getBean(String name) {
19         return getApplicationContext().getBean(name);
20     }
21 
22     public static <T> T getBean(Class<T> clazz) {
23         return getApplicationContext().getBean(clazz);
24     }
25 
26     public static <T> T getBean(String name, Class<T> clazz) {
27         return getApplicationContext().getBean(name, clazz);
28     }

 

在spring boot框架中省略了xml<bean>的配置,经过@Bean注入到配置类中,让spring找到写的这个工具类

在多态的实现中,有时须要不少判断去执行不一样的实现,这个时候就能够经过实现类类名或者接口去找到要执行的接口

举个例子
1 Map<String, IAddReceipt> map = SpringUtil.getBeanOfType(IAddReceipt.class);
2         for (IAddReceipt addReceipt : map.values()) {
3             addReceipt.save(addReceiptVO);
4         }

我要实现一个功能,他分了好几个模块的save动做,我定义了一个 IAddReceipt的接口,里面是一个save方法,这几个模块的save我分别建了一个IAddReceipt的实现类,每一个实现类里都有本身的操做,这样我获取到这个接口的实现类放到map里,而后去遍历map调用save方法。框架

这样在主方法中,就完成了对每一个模块的操做。ide

反射机制是框架技术的原理和核心部分。经过反射机制咱们能够动态的经过改变配置文件(javabean)的方式来加载类、调用类方法,以及使用类属性。这样的话,对于编码和维护带来至关大的便利。在程序进行改动的时候,也只会改动相应的功能就好了,调用的方法是不用改的。更不会一改就改全身。工具

相关文章
相关标签/搜索