业务需求:缓存页面,展示需要缓存的所有对象,每类对象在字典表中有编码对应,点击某个对象可以缓存某类对象,每类对象都有自己的缓存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);
}
}
测试结果