业务场景:
有的时候需要在工具类中依赖Spring的bean,而且还想通过静态方法对外提供,实现方式如下:
方式一:
@Component
public class DbMapperUtils {
private static Environment env;
private static Map<String, String> propsMap = new HashMap<>();
public static String getPropVal(String propKey) {
if (!propsMap.containsKey(propKey)) {
propsMap.put(propKey, env.getProperty(propKey));
}
return propsMap.get(propKey);
}
@Resource
public void setEnv(Environment env) {
DbMapperUtils.env = env;
}
}
方式二:
@Component
public class DbMapperUtils {
@Resource
private Environment environment;
private static Environment env;
private static Map<String, String> propsMap = new HashMap<>();
@PostConstruct
public void beforeInit() {
env = environment;
}
public static String getPropVal(String propKey) {
if (!propsMap.containsKey(propKey)) {
propsMap.put(propKey, env.getProperty(propKey));
}
return propsMap.get(propKey);
}
}
参考示例:
@Configuration
public class XxlJobAdminConfigCopy implements InitializingBean {
private static XxlJobAdminConfigCopy adminConfig = null;
public static XxlJobAdminConfigCopy getAdminConfig() {
return adminConfig;
}
@Override
public void afterPropertiesSet() throws Exception {
adminConfig = this;
}
// conf
@Value("${xxl.job.login.username}")
private String loginUsername;
@Value("${xxl.job.login.password}")
private String loginPassword;
@Value("${xxl.job.i18n}")
private String i18n;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${spring.mail.username}")
private String emailUserName;
public String getLoginUsername() {
return loginUsername;
}
public String getLoginPassword() {
return loginPassword;
}
public String getI18n() {
return i18n;
}
public String getAccessToken() {
String privateKey = "xxx";
String publicKey = "yyy";
SM2 sm2 = SmUtil.sm2(Base64.decode(privateKey), Base64.decode(publicKey));
return sm2.encryptBcd(accessToken + LocalDate.now(), KeyType.PublicKey);
}
public String getEmailUserName() {
return emailUserName;
}
}
方式三:
工具类SpringBeanUtils
package com.etoak.tian.utils;
import org.springframework.context.ApplicationContext;
public class SpringBeanUtils {
private static ApplicationContext applicationContext;
public SpringBeanUtils() {
}
public static void setApplicationContext(ApplicationContext applicationContext) {
SpringBeanUtils.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return (ApplicationContext) applicationContext;
}
public static Object getBean(String name) {
ApplicationContext applicationContext = getApplicationContext();
return applicationContext != null ? applicationContext.getBean(name) : null;
}
public static <T> T getBean(Class<T> requiredType) {
ApplicationContext applicationContext = getApplicationContext();
return applicationContext != null ? applicationContext.getBean(requiredType) : null;
}
public static <T> T getBean(String name, Class<T> requiredType) {
ApplicationContext applicationContext = getApplicationContext();
return applicationContext != null ? applicationContext.getBean(name, requiredType) : null;
}
}
配置类setter
package com.etoak.tian;
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import java.nio.file.Paths;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import org.jasypt.encryption.pbe.PBEStringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
@Configuration(proxyBeanMethods = false)
@EnableEncryptableProperties
public class UtilsAutoConfiguration implements EnvironmentAware, BeanFactoryAware, ApplicationContextAware {
private Environment environment;
private BeanFactory beanFactory;
public UtilsAutoConfiguration() {
}
public void setApplicationContext(ApplicationContext applicationContext) {
SpringBeanUtils.setApplicationContext(applicationContext);
}
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
public void setEnvironment(Environment environment) {
this.environment = environment;
}
}