Spring实例化bean之后的处理, 关于BeanPostProcessor接口的使用

 

业务需求:缓存页面,展示需要缓存的所有对象,每类对象在字典表中有编码对应,点击某个对象可以缓存某类对象,每类对象都有自己的缓存runner(弱弱的说一句,本人看到这里的第一反应就是if-else,捂脸中。。。。。。。。。。。)

方法:经经理指导,使用BeanPostProcessor接口

逻辑:自定义一个标签,spring实例化所有bean之后,取出每个便签的所对应的code,以及当前的code对应的runner放在一个管理器里面,使用时从管理器中取出

 实例说明:

自定义标签

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import org.springframework.stereotype.Component;

@Documented
@Retention(RUNTIME)
@Target({ TYPE, METHOD, PARAMETER })
@Component
public @interface CacheCode {
    String code() default "";
}

 

不同类上面添加标签(根据自己业务放在类上)

import org.springframework.stereotype.Component;

import com.*.cache.annotation.CacheCode;

@Component
@CacheCode(code = "1001")
public class Test1 implements Test{

    @Override
    public void test() {
        System.out.println("调用测试1");
        
    }

}

 

import org.springframework.stereotype.Component;

import com.*.cache.annotation.CacheCode;

@Component
@CacheCode(code = "1002")
public class Test2 implements Test{

    @Override
    public void test() {
    System.out.println("调用测试2");
  } }
public interface Test {
    
    public void test();
}

管理器

@Component
public class CacheManager implements BeanPostProcessor{
    
    private Map<String, Test> runners = new HashMap<String, Test>();
    
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        Class<? extends Object> persistentClass = bean.getClass();
        CacheCode cacheCode = AnnotationUtils.findAnnotation(persistentClass, CacheCode.class);
        if (null != cacheCode) {
            String code = cacheCode.code();
            Test runner = (Test)bean;
            runners.put(code, runner);
        }
        return bean;
    }
    
    public Test getRunner(String code) {
        return runners.get(code);
    }
}

 

测试结果

 

 

posted on 2019-06-03 16:16  背着核的桃子  阅读(776)  评论(0编辑  收藏  举报

导航