问题引入
首先明确一个问题:抽象类不能生成实例对象,spring无法注入。
原因:spring的原理是启动服务器时读取配置文件,取得类名后利用反射机制在spring上下文中生成一个单例的对象,由spring注入属性并维护此对象的状态,抽象类在反射生成对象时就已经失败了,后面的不会进行
问题解决
限于springboot方式启动,
我们编写一个SpringBeanLoader的类,在应用启动时加载org.springframework.context.ApplicationContext,对外通过ApplicationContext提供获取bean的方法,代码如下:
应用启动时设置applicationContext
public class SjglApplication {
public static void main(String[] args) {
ApplicationContext applicationContext =SpringApplication.run(SjglApplication.class, args);
SpringBeanLoaderUtil.setApplicationContext(applicationContext);
}
}
SpringBeanLoaderUtil类如下:
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@Component
public class SpringBeanLoaderUtil {
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static void setApplicationContext(ApplicationContext applicationContext) {
SpringBeanLoaderUtil.applicationContext = applicationContext;
}
/**
* 获取Spring中注册的Bean
*
* @param beanClass
* @param beanId
* @return
*/
public static <T> T getSpringBean(String beanId, Class<T> beanClass) {
return getApplicationContext().getBean(beanId, beanClass);
}
/**
* 获取Spring中注册的Bean
*
* @param beanClass
* @return
*/
public static <T> T getSpringBean(Class<T> beanClass) {
return getApplicationContext().getBean(beanClass);
}
}
抽象工具类调用方式如下:
public abstract class PickUpKeyTemplete {
protected RedisTemplate redisTemplate;
protected Map<String, String> getRuleMap(String s) {
redisTemplate = SpringBeanLoaderUtil.getSpringBean("redisTemplate",RedisTemplate.class);
String redisValue = (String) redisTemplate.boundValueOps(redisKey).get();
}
}
随仅适用于引入springboot的项目,但方式比较简单