zoukankan      html  css  js  c++  java
  • Spring中可复用工具类&&特性记录&&技巧

    Spring 里有用工具类:

    GenericTypeResolver 解析泛型类型。核心逻辑还是调用 ResolvableType
    ResolvableType 解析泛型类型


    BeanWrapper 利用反射修改 JavaBean 的属性值。(支持修改嵌套属性)

      dubbo 中的 com.alibaba.dubbo.common.bytecode.Wrapper 实现了类似的功能
    public class Foo {
        private int id;
        private String name;
        ......
    }
    
    
    
    public static void main(String[] args) {
        Foo foo = new Foo();
        
        // org.springframework.beans.BeanWrapper给对象属性赋值
        BeanWrapper bw = new BeanWrapperImpl(foo);
        bw.setPropertyValue("id", 123); // 给 Foo的id属性赋值
        
        // com.alibaba.dubbo.common.bytecode.Wrapper给对象属性赋值
        Wrapper.getWrapper(Foo.class).setPropertyValue(foo, "id", 123); // 给 Foo的id属性赋值
        System.out.println(JSON.toJSONString(foo));
    }
    View Code

    IntrospectionSupport 设置 JavaBean 属性。 IntrospectionSupport.setProperties(Object target, Map<String, ?> props, String optionPrefix)

    org.springframework.core.Constants : 处理 public static final 字段


    org.springframework.util.ReflectionUtils :反射相关
    org.springframework.util.ReflectionUtils.makeAccessible(this.aspectJAdviceMethod);

    取属性值:

    @Autowired
    private Environment env;  
    env.getProperty("spring.redis.pool.max-idle")

    获取资源文件:

    ResourcePatternResolver resourceLoader = new PathMatchingResourcePatternResolver();
    Resource[] source = resourceLoader.getResources(filePath); // 支持ant风格的路径匹配(?、*、**)

    流处理:

    org.springframework.util.StreamUtils  (流拷贝、从流中读取数据.....)

    通用常量:

    org.springframework.http.MediaType
    如:APPLICATION_JSON_UTF8_VALUE --> application/json;charset=UTF-8

    org.springframework.http.HttpStatus
    如:OK(200, "OK")

    Junit自动回滚:

    @Test
    @Rollback
    @Transactional
    public void testRollback(){
        xxxService.insert(instance);
    }

    -----------------------------------------------------技巧----------------------------------------------------

    1. 找一个带命名空间(namespace)配置的处理类,可以从 NamespaceHandler 接口入手,找实现类

    例如: <context:component-scan base-package="com.kvn.xx" />
    可以从 NamespaceHandler 的实现类中找到 ContextNamespaceHandler

    public class ContextNamespaceHandler extends NamespaceHandlerSupport {
        @Override
        public void init() {
            registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser());
            registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser());
            registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser());
            registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());
            registerBeanDefinitionParser("load-time-weaver", new LoadTimeWeaverBeanDefinitionParser());
            registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
            registerBeanDefinitionParser("mbean-export", new MBeanExportBeanDefinitionParser());
            registerBeanDefinitionParser("mbean-server", new MBeanServerBeanDefinitionParser());
        }
    }
    View Code

    然后就能找到 component-scan 的处理类为: ComponentScanBeanDefinitionParser

    2. springMvc 使用时,如果代码有进行地址重定向(sendRedirect),可以从下面步骤入手(判断是否服务器重定向&&相应的 Controller)

    断点打在 DispatcherServlet#doDispatch() ,观察 request 和 response 

    查看图片
  • 相关阅读:
    洛谷 P3040 [USACO12JAN]贝尔分享Bale Share
    洛谷 P1994 有机物燃烧
    洛谷 P3692 [PUB1]夏幻的考试
    洛谷 P2117 小Z的矩阵
    洛谷 P1154 奶牛分厩
    洛谷 P1718 图形复原
    洛谷 P1900 自我数
    洛谷 P1964 【mc生存】卖东西
    洛谷 P1123 取数游戏
    hdu_2844_Coins(多重背包)
  • 原文地址:https://www.cnblogs.com/kevin-yuan/p/7693142.html
Copyright © 2011-2022 走看看