美文网首页
aop & 反射 & 缓存

aop & 反射 & 缓存

作者: 川流不息attitude | 来源:发表于2023-05-19 16:43 被阅读0次

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();
    }
}

反射方法里面的缓存

image.png image.png
测试 ,通用属性注入完成
image.png

相关文章

  • Spring AOP源码

    AOP联盟标准 AOP联盟将AOP体系分为三层,从三层结构可以看出,AOP实现方式有很多种,包括反射、元数据处理、...

  • Java 面试问题系列三(Spring)

    1、Spring 主要思想是什么,回答 IOC 和AOP,怎么自己实现 AOP ? IOC 的好处 使用基于反射的...

  • Spring学习笔记

    1. Spring: 主要技术IOC 和AOP, IOC通过反射控制,实现解耦。 AOP是面向切面编程,通过配置接...

  • Java 反射 reflection

    spring源代码,其基本原理如依赖注入、aop、以及xml技术,动态反射机制 Reflection 学习反射原理...

  • 【广撒网】ConcurrentHashMap提供的compute

    在实际项目中,会使用反射来编写代码,为了优化反射的性能,我们需要缓存Field对象。而缓存Field对象时,我们需...

  • 2018-10-05

    反射_invoke aop详解 代理51cto 代理图解 jvm_死灰级反射入门_笨蛋 代理111 动态代理的目的...

  • 通过反射获取spring中aop代理的target对象

    最近项目需要获取从spring创建的aop代理中获取它的target对象,其实可以通过反射来获取,代码如下 aop...

  • filter 与 interceptor

    filter 基于servlet 回调实现 interceptor 基于spring 方法反射实现,类似aop前,...

  • Spring AOP + Transactional源码解析

    Spring AOP应用于多数场景 缓存 权限 懒加载 日志 事务 。。。 这一篇将通过AOP源码的实现层面,结合...

  • Java 反射实现 Aop 代理

    利用反射生成JDK的动态代理,也就是AOP中的AOP代理,代替目标对象,从而在代码中织入增强。 定义代理接口 由于...

网友评论

      本文标题:aop & 反射 & 缓存

      本文链接:https://www.haomeiwen.com/subject/fiknsdtx.html