All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.fashionbrot.properties.config.MarsConfigurationPropertiesBindingPostProcessor Maven / Gradle / Ivy

package com.github.fashionbrot.properties.config;

import com.alibaba.fastjson.JSON;
import com.github.fashionbrot.event.MarsListenerEvent;
import com.github.fashionbrot.properties.annotation.MarsConfigurationProperties;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import static org.springframework.core.annotation.AnnotationUtils.findAnnotation;

/**
 * @author fashionbrot
 * @date 2021/07/28 22:45
 *
 */
@Slf4j
public class MarsConfigurationPropertiesBindingPostProcessor implements BeanPostProcessor, ApplicationContextAware,
        ApplicationListener {

    public static final String BEAN_NAME = "marsConfigurationPropertiesBindingPostProcessor";

    private ConfigurableApplicationContext applicationContext;

    private Map configurationTargetMap =new ConcurrentHashMap<>();

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {


        MarsConfigurationProperties configurationProperties = findAnnotation(bean.getClass(), MarsConfigurationProperties.class);

        if (configurationProperties != null) {
            bind(bean, beanName, configurationProperties);

            if (configurationProperties.autoRefreshed()){
                configurationTargetMap.put(configurationProperties.fileName(),
                        MarsConfigurationTarget.builder()
                                .bean(bean)
                                .beanName(beanName)
                                .marsConfigurationProperties(configurationProperties)
                                .build()
                        );
            }
        }

        return bean;
    }

    private void bind(Object bean, String beanName, MarsConfigurationProperties configurationProperties) {

        MarsConfigurationPropertiesBinder binder;
        try {
            binder = applicationContext.getBean(MarsConfigurationPropertiesBinder.BEAN_NAME, MarsConfigurationPropertiesBinder.class);
            if (binder == null) {
                binder = new MarsConfigurationPropertiesBinder(applicationContext);
            }

        } catch (Exception e) {
            binder = new MarsConfigurationPropertiesBinder(applicationContext);
        }

        binder.bind(bean, beanName, configurationProperties);

    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = (ConfigurableApplicationContext) applicationContext;
    }

    @Override
    public void onApplicationEvent(MarsListenerEvent event) {
        if (event==null){
            log.info("onApplicationEvent event is null ");
            return;
        }

        String fileName = event.getFileName();
        MarsConfigurationTarget target= configurationTargetMap.get(fileName);
        if (target==null){
            if (log.isDebugEnabled()){
                log.debug("onApplicationEvent fileName:{} marsConfigurationProperties autoRefreshed false ",fileName);
            }
            return;
        }
        if (log.isInfoEnabled()){
            log.info("onApplicationEvent marsConfigurationReceivedEvent:\n{} ", JSON.toJSONString(event) );
        }
        bind(target.getBean(),target.getBeanName(),target.getMarsConfigurationProperties());
    }


    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    private static class MarsConfigurationTarget {

        private Object bean;

        private String beanName;

        private MarsConfigurationProperties marsConfigurationProperties;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy