aop & 反射 & 缓存

aop & 反射 & 缓存

有时候一些 公用属性,就想一个对象继承这个对象,这个对象里面的属性就自动赋值,这个时候就可以 用到反射(反射加上缓存 速度嘎嘎快,性能损耗微乎其微),那些方法需要赋值 用aop 切 就行。

1. 第一步定义注解 和对应的 公共类
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface SetChannelConfig {
}
@Data
public class Config {

    private String url;

    private String name;

    private Integer id;

    private Date date;
}
@Data
public class Config01 extends Config{

    private String name;

}
2. 第二步定义 aop
@Component
@Aspect
@Slf4j
public class SetChannelConfigAop {

    /**
     * 注解切入点
     */
    @Pointcut("@annotation(SetChannelConfig) || @within(SetChannelConfig)")
    public void setChannelConfigPointCut(){

    }

    /**
     * 伪造假数据
     */
    Map<String,String> config = new HashMap<>();
    {
        config.put("url","wwww.baidu.com");
        config.put("name","123456");
        config.put("id","1");
        config.put("date","2023-05-20 16:22:52");
    }
    /**
     * 方法执行前执行
     *
     * @param joinPoint
     */
    @Around("setChannelConfigPointCut()")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {

        Object target = joinPoint.getTarget();
        Object[] args = joinPoint.getArgs();
        for (int i = 0; i < args.length; i++) {
            if(args[i] instanceof Config){
                Object obj = args[i];
                Class<?> aClass = obj.getClass();
                long startTime = System.currentTimeMillis();

                Field[] fields = ReflectUtil.getFields(aClass);
                log.info("反射耗时 {}",System.currentTimeMillis()-startTime);
                for (int j = 0; j < fields.length; j++) {
                    Field field = fields[j];
                    String name = field.getName();
                    String value = config.get(field.getName());
                    if(!StringUtils.isBlank(name)){
                        String upperCase = String.valueOf(name.charAt(0)).toUpperCase();
                        String substring = name.substring(1);
                        Class<?> type = field.getType();
                        ReflectUtil.invoke(obj,new StringBuilder("set").append(upperCase).append(substring).toString(), Convert.convert(type,value));
                    }
                }

            }
        }
        return joinPoint.proceed();
    }
}

反射方法里面的缓存

测试 ,通用属性注入完成

posted @ 2023-05-20 16:41  川流不息&  阅读(133)  评论(0编辑  收藏  举报