• spring bean-- autowired的正确用法


    这两天用idea写spring注入的时候每一次

     @Autowired 
     Worker worker;

    都会报黄,用过这个ide的都知道,说明你代码需要重构了。
    然后提示的信息是

    Spring Team recommends: “Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies”

    大致意思是 ,每一次的依赖注入都用构造方法吧,并且每一次对强制依赖关系使用断言,大白话就是我们这样可以在构造方法里面做点校验了,这样在spring容器启动的时候就会发现错误。就类似于编译器那些在编译器就可以发现的错误,这样防止在使用的时候出现运行时异常。导致程序崩掉。强制依赖关系可以理解为,B的方法中调用A的方法

    群里面还发了个例子

    // Fieldinjection/NullPointerException example:  
    class MyComponent {
    
      @Inject MyCollaborator collaborator;
    
      public void myBusinessMethod() {
        collaborator.doSomething(); // -> NullPointerException
      }
    }
      Constructor injection should be used:  
    class MyComponent {
    
      private final MyCollaborator collaborator;
    
      @Inject
      public MyComponent(MyCollaborator collaborator) {
        Assert.notNull(collaborator, "MyCollaborator must not be null!");
        this.collaborator = collaborator;
      }
    
      public void myBusinessMethod() {
        collaborator.doSomething(); // -> safe
      }
    }

    本来实现一个null的bean很简单

    显示用BeanFactoryPostProcessor实现,发现如果添加一个null会直接报错

    因为在register里面会进行判断

    Assert.hasText(beanName, "Bean name must not be empty");
    Assert.notNull(beanDefinition, "BeanDefinition must not be null");

    后来无奈搜索引擎一发

    发现了可以 factorybean一发(原理后面补,,最近在研究源码,还没看这一块

    @Component
    public class Worker implements FactoryBean<Void> {
    
        public void doWork(){
            System.out.println("do Work...");
        }
    
        @Override
        public Void getObject() throws Exception {
            return null;
        }
    
        @Override
        public Class<?> getObjectType() {
            return Worker.class;
        }
    
        @Override
        public boolean isSingleton() {
            return true;
        }
    }

    那么我的依赖注入先这么写

    @Component
    public class Factory {
        @Autowired Worker worker;
    
        public void createProduct(){
            System.out.println("生产中....");
            worker.doWork();
            System.out.println("生产完成...");
        }
    }

    运行,可以运行,报NPL
    打印结果

    生产中....
    Exception in thread "main" java.lang.NullPointerException
    @Component
    public class Factory {
        final Worker worker;
    
        @Autowired
        public Factory(Worker worker) {
            Assert.notNull(worker, "worker must not be null!");
            this.worker = worker;
        }
    
        public void createProduct(){
            System.out.println("生产中....");
            worker.doWork();
            System.out.println("生产完成...");
        }
    }

    结果 无法运行,容器启动失败

    Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'factory' defined in file [F:codegithub2017-upspring-code	argetclassescomwuhulalastudySpring	estnullFactory.class]: Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.wuhulala.studySpring.testnull.Factory]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: worker must not be null!
    

    善用断言,在程序中启动的时候就发现错误。

    原文地址:https://blog.csdn.net/u013076044/article/details/70880718
  • 相关阅读:
    javaweb基础(6)_servlet配置参数
    javaweb基础(5)_servlet原理
    读书笔记:java特种兵(上)
    基础算法(四):海量数据的处理方法
    基础算法(三)动态规划和贪心算法
    基础算法(二):堆排序,快速排序
    基本算法(一):插入排序,归并排序
    JVM基础和调优(六)
    JVM基础和调优(五)
    JVM基础和调优(四)
  • 原文地址:https://www.cnblogs.com/jpfss/p/11533628.html
Copyright © 2020-2023  润新知