В своей недавней работе я получил очень полезную аннотацию и поделился ею с вами.
Болевые точки
Если вы сделали платеж WeChat или Alipay, вы, возможно, столкнулись с такой проблемой, то есть для заполнения обратного вызова о результате платежа, то есть после успешного платежа Alipay уведомит нас по адресу, который мы предоставили для информирования нам, успешно ли пользователь оплатил, и если да, мы должны иметь дело с соответствующей бизнес-логикой ниже. Если мы тестируем сервис, нам нужно заполнить адрес обратного вызова тестового сервиса. Если он опубликован в Интернете, нам нужно измените его на онлайн-адрес.
Для приведенного выше сценария мы обычно делаем динамическую конфигурацию следующим образом, не меняя ее каждый раз, чтобы предотвратить проблемы.
public class PayTest {
@Value("${spring.profiles.active}")
private String environment;
public Object notify(HttpServletRequest request) {
if ("prod".equals(environment)) {
// 正式环境
} else if ("test".equals(environment)) {
// 测试环境
}
return "SUCCESS";
}
}
Приведенный выше код вроде не имеет никаких проблем, но как кирпичи, как мы можем так двигаться, поза неправильная!
вопрос:
Расширяемость слишком плохая, если нам нужно использовать этот параметр в других местах, то нам все равно нужно использовать аннотацию @Value, чтобы получить его снова?Если однажды наш руководитель вдруг скажет, что слово test выглядит слишком низким, измените на high-end Да, замените его на dev, тогда мы должны менять все тесты в проекте?
Итак, можем ли мы сделать эти параметры конфигурации в глобальную статическую переменную, чтобы мы могли пить ее напрямую, даже если мы действительно хотим ее изменить, тогда мне нужно изменить только одно место.
Обратите внимание на большую яму
Некоторые друзья могут быть более уверенными, поэтому я просто добавлю модификатор static Если вы действительно планируете это сделать, то вы готовы собираться и уходить. Значение, полученное путем прямого добавления static, на самом деле равно нулю. Что касается причины, проверьте порядок загрузки классов и статических переменных.
@PostConstruct аннотация
Тогда, поскольку проблема была сказана, должно быть и решение, иначе вы думаете, что я играю с вами.
Во-первых, эту аннотацию предоставляет Java, которая используется для оформления нестатического метода void. Он будет запущен, когда сервер загрузит сервлет, и только один раз..
Модернизация:
@Component
public class SystemConstant {
public static String surroundings;
@Value("${spring.profiles.active}")
public String environment;
@PostConstruct
public void initialize() {
System.out.println("初始化环境...");
surroundings = this.environment;
}
}
результат:
Мы видим, что инициализация выполняется при запуске проекта.
На этом этапе мы уже можем определить, является ли текущая рабочая среда тестовой или формальной, чтобы можно было выполнить динамическую настройку.
Наконец хочу сказать
На самом деле эта аннотация гораздо полезнее, чем эта. Как и класс инструментов Redis, который я написал ранее, я использую RedisTemplate для работы с Redis, поэтому написанный метод нельзя изменить с помощью статики. Каждый раз, когда я использую класс инструментов Redis, я могу только сначала введите его в контейнер, а затем снова вызовите его и используйте эту аннотацию, чтобы идеально решить эту неловкую проблему. код показывает, как показано ниже.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* @ClassName RedisUtil
* @Description TODO
* @Auther bingfeng
* @Date 2019/7/4/004 17:14
* @Version 1.0
*/
@Component
public class RedisUtil {
private static RedisTemplate<Object, Object> redisTemplates;
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
@PostConstruct
public void initialize() {
redisTemplates = this.redisTemplate;
}
/**
* 添加元素
*
* @param key
* @param value
*/
public static void set(Object key, Object value) {
if (key == null || value == null) {
return;
}
redisTemplates.opsForValue().set(key, value);
}
}