BeanPostProcessor не может обрабатывать bean-компонент RedisProperties - PullRequest
0 голосов
/ 16 июня 2020

Я использую пружинный ботинок 2.1.5.RELEASE. Мой проект работает с redis. В целях безопасности я зашифрую свой пароль redis. Я установил значение в своем application.properties следующим образом:

spring.redis.password = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Я хочу расшифровать до инициализации Spring bean-компонента, поэтому я хочу изменить значение свойства RedisProperties passowrd . Поэтому я настраиваю BeanPostProcesser следующим образом:

@Component
public class PasswordBeanPostProcessor implements BeanPostProcessor {

    @Autowired
    private Cryptor cryptor;

    @Value("${spring.redis.password}")
    private String password;

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        log.info("beanName = {}",beanName);
        if (bean instanceof RedisProperties) {
            RedisProperties redisPropertiesBean = (RedisProperties) bean;
            try {
                redisPropertiesBean.setPassword(cryptor.decrypt(password));
                log.debug(redisPropertiesBean.getPassword());
                return redisPropertiesBean;
            } catch (Exception ex) {
                log.error("redis password decrypt error", ex);
                throw new RuntimeException(ex);
            }
        }
        return bean;
    }
}

Но это не сработало , когда я запускаю свое приложение, нет журнала, подобного этой печати:

beanName = redisProperties

Чтобы убедиться, что в моем * есть bean-компонент с именем redisProperties 1019 *, я вставляю bean RedisProperties в другой Bean. Он работает хорошо, я могу получить свойства в RedisProperties.

Чтобы мое приложение успешно работало с зашифрованным паролем, я расшифровываю пароль redis в другом @PostConstruct метод.Но я думаю, что этот способ не изящен, что является правильным?

кто может мне помочь , пожалуйста

1 Ответ

0 голосов
/ 16 июня 2020

Хорошо, я понял, что ясыпт использовать нельзя. Тем не менее, взгляните на его исходный код, который довольно прост, учитывая тот факт, что вы уже работаете с Bean Post Processors, который является довольно продвинутым материалом для весенней / весенней загрузки

Доступен стартер (модуль autoconfig) Здесь

Итак, вы увидите, что у него есть spring.factories, которые включают некоторые bootstrap и автоконфигурации.

В конце концов вы придете к коду , который на самом деле обрабатывает шифрование

Он использует постпроцессор фабрики bean-компонентов - то, что срабатывает, когда определения bean-компонентов готовы, но фактические bean-компоненты еще не созданы. Это крючок, который вам не подходит. Конечно, реализация будет другой, но "оркестровка" та же ...

...