为了账号安全,请及时绑定邮箱和手机立即绑定

Springboot工具类如何使用自动绑定

/ 猿问

Springboot工具类如何使用自动绑定

至尊宝的传说 2019-03-11 12:12:07

Springboot工具类如何使用自动绑定


查看完整描述

2 回答

?
绝地无双

springboot支持通过set方法实现注入,我们可以利用非静态set方法注入静态变量

@Component // 需要添加Component注释才会被springboot管理
public class TestUtil {
@Value("${link.host}")
private static String linkHost;

// *核心:通过非静态set方法实现注入*
@Value("${link.host}")
public void setLinkHost(String linkHost) {
XunTongUtil.linkHost = linkHost;
}

public static JSONObject getAccessToken(String appid, String secret) {
String apiURL = linkHost + "/test/;
String responseStr = HttpUtil.sendGet(apiURL);
JSONObject json = JSONObject.fromObject(responseStr);
return json.getString("access_token");
return json;
}
}

在静态工具类中注入Bean

public class AccountManageClient {

@Autowired
private PcodeService pcodeService; // 尝试自动绑定Service

private static String getDepartmentPcode(String department) {
try {
List<PcodePO> pcodes = pcodeService.findAll(); // 尝试使用自动绑定的service
for (PcodePO pcode : pcodes) {
if (department.contains(pcode.getDepartment())) {
return pcode.getPcode();
}
}
} catch (Exception e) {
}
return "";
}
}

需要在保留原静态的属性(@Autowired)的同时,
添加一个该类的静态属性。同时声明一个返回值为void的方法,
在其中将非静态属性赋值给静态属性,该方法需要使用@PostConstruct注释

@Component // 1. 需要添加Component注释才会被springboot管理
public class AccountManageClient {
public static AccountManageClient accountManageClient; // 2.添加一个该类的静态对象作为属性

@Autowired
private PcodeService pcodeService;

// 3. 使用@PostConstruct方法引导绑定
@PostConstruct
public void init() {
accountManageClient = this;
accountManageClient.pcodeService = this.pcodeService;
}

private static String getDepartmentPcode(String department) {
try {
List<PcodePO> pcodes = accountManageClient.pcodeService.findAll(); // 4. 使用时需要这样实现
for (PcodePO pcode : pcodes) {
if (department.contains(pcode.getDepartment())) {
return pcode.getPcode();
}
}
} catch (Exception e) {
}
return "";
}
}



查看完整回答
反对 回复 2019-03-20
?
ITMISS

第一步,编写配置Bean——PrintAfterInitBean
代码如下,因为只是一个简单例子,这里的配置Bean其实可以是其他任何复杂配置Bean,例如DataSource。往往一个公共包需要多个这样配置Bean才能完成其配置。
public class PrintAfterInitBean implements InitializingBean {
private String message;

public void afterPropertiesSet() throws Exception {
System.out.println(message);
}
//setter getter
}

第二步,创建一个AutoConfiguration。
如果搜索Spring Boot下面的类,你会发现其实有很多名字形如xxxAutoConfiguration的类,这些类都是Spirng Boot为我们做的一些快捷配置类。 创建一个TestAutoConfig,作为一个自动配置类
@Configuration
public class TestAutoConfig {

@Bean
@ConfigurationProperties(prefix = "init")
@ConditionalOnMissingBean(PrintAfterInitBean.class)
@ConditionalOnProperty(prefix = "init",value = "message")
public PrintAfterInitBean printAfterInitBean() {
return new PrintAfterInitBean();
}
}

@ConfigurationProperties 是Spring Boot提供的方便属性注入的注解,功能其实和@Value类似
@ConditionalOnMissingBean 表示当BeanFactory中没有PrintAfterInitBean类型的Bean才会创建,否则就会忽略这个Bean。这个就是上图中所谓的【满足自动配置条件】,同理的,ConditionalOnProperty表示当存在配置前缀为init,配置值为message的配置的时候,才会生效。@ConditionalOnXXX 系列的注解都是为了在自动配置中,不侵入用户的配置。
第三步,创建spring.factories
在resources下面创建META-INF/spring.factories, 然后在文件中把第二步的类配置进去
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.netease.xxx.xxx.UrsPropertyAutoConfig

这样就完成一个Spring Boot自动配置,如果存在init.message的配置,那么spring boot启动的时候就会打印init.message配置对应值。




查看完整回答
反对 回复 2019-03-20

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信