业务需求:缓存页面,展示需要缓存的所有对象,每类对象在字典表中有编码对应,点击某个对象可以缓存某类对象,每类对象都有自己的缓存runner(弱弱的说一句,本人看到这里的第一反应就是if-else,捂脸中。。。。。。。。。。。)
方法:经经理指导,使用BeanPostProcessor接口
逻辑:自定义一个标签,spring实例化所有bean之后,取出每个便签的所对应的code,以及当前的code对应的runner放在一个管理器里面,使用时从管理器中取出
实例说明:
自定义标签
1import static java.lang.annotation.ElementType.METHOD; 2import static java.lang.annotation.ElementType.PARAMETER; 3import static java.lang.annotation.ElementType.TYPE; 4import static java.lang.annotation.RetentionPolicy.RUNTIME; 5 6import java.lang.annotation.Documented; 7import java.lang.annotation.Retention; 8import java.lang.annotation.Target; 9 10import org.springframework.stereotype.Component; 11 12@Documented 13@Retention(RUNTIME) 14@Target({ TYPE, METHOD, PARAMETER }) 15@Component 16public @interface CacheCode { 17 String code() default ""; 18}
不同类上面添加标签(根据自己业务放在类上)
1import org.springframework.stereotype.Component; 2 3import com.*.cache.annotation.CacheCode; 4 5@Component 6@CacheCode(code = "1001") 7public class Test1 implements Test{ 8 9 @Override 10 public void test() { 11 System.out.println("调用测试1"); 12 13 } 14 15} 16 17import org.springframework.stereotype.Component; 18 19import com.*.cache.annotation.CacheCode; 20 21@Component 22@CacheCode(code = "1002") 23public class Test2 implements Test{ 24 25 @Override 26 public void test() { 27 28 System.out.println("调用测试2"); 29 30 } } 31 32public interface Test { 33 34 public void test(); 35}
管理器
1@Component 2public class CacheManager implements BeanPostProcessor{ 3 4 private Map<String, Test> runners = new HashMap<String, Test>(); 5 6 @Override 7 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 8 Class<? extends Object> persistentClass = bean.getClass(); 9 CacheCode cacheCode = AnnotationUtils.findAnnotation(persistentClass, CacheCode.class); 10 if (null != cacheCode) { 11 String code = cacheCode.code(); 12 Test runner = (Test)bean; 13 runners.put(code, runner); 14 } 15 return bean; 16 } 17 18 public Test getRunner(String code) { 19 return runners.get(code); 20 } 21}
测试结果

