Java开发工作问题整理与记录

1、为什么@Autowired不能注入static成员属性

扫描Class类需要注入的元数据的时候,直接选择忽略掉了static成员(包括属性和方法)
Spring 依赖注入是依赖set方法, set方法是普通的对象方法,static变量是类的属性
AutowiredAnnotationBeanPostProcessor:
 
// 构建@Autowired注入元数据方法
// 简单的说就是找到该Class类下有哪些是需要做依赖注入的
private InjectionMetadata buildAutowiringMetadata(final Class clazz) {
    ...
    // 循环递归,因为父类的也要管上
    do {
        // 遍历所有的字段(包括静态字段)
        ReflectionUtils.doWithLocalFields(targetClass, field -> {
            if (Modifier.isStatic(field.getModifiers())) {
                logger.info("Autowired annotation is not supported on static fields: " + field);
            }
            return;
            ...
        });
        // 遍历所有的方法(包括静态方法)
        ReflectionUtils.doWithLocalMethods(targetClass, method -> {
            if (Modifier.isStatic(method.getModifiers())) {
                logger.info("Autowired annotation is not supported on static methods: " + method);
            }
            return;
            ...
        });
        ...
        targetClass = targetClass.getSuperclass();
    } while (targetClass != null && targetClass != Object.class);
    ...
}

2、static方法里用@Autowire或者@Resource注入的属性

    首先 类加@Component注解,使当前类成为bean
    然后 定义statis类成员
    然后 创建 init()方法,用@PostConstruct注解修饰
    最后init()方法中,把需要加载的类复制给static类

@Component
public class DemoCode {

    @Autowired
    private DemoService demoService;

    public static DemoService demoServiceNew;

    /**
     * 解决 static方法调用  注入的service为null
     */
    @PostConstruct
    public void init(){
        demoServiceNew = demoService;
    }
 }

3、处理string类型的json串中的反斜杠

导入commons-lang3的jar包


org.apache.commons
commons-lang3
3.8.1

public static void main(String[] args) {
        String s="{\\\"displayName\\\":\\\"\\\",\\\"id\\\":1401524465412907010,\\\"name\\\":\\\"名称\\\",\\\"source\\\":\\\"\\\",\\\"type\\\":\\\"text\\\",\\\"value\\\":\\\"红细胞计数\\\"}";
        String tmp = StringEscapeUtils.unescapeJava(s);
        System.out.println(tmp);
    }

//输出结果
//{"displayName":"","id":1401524465412907010,"name":"名称","source":"","type":"text","value":"红细胞计数"}

4、对象拷贝的方法

    import org.springframework.beans.BeanUtils;

    BeanUtils.copyProperties(原始对象, 新对象);

你可能感兴趣的:(java,开发语言)