随记20211229 dubbo依赖注入失败

今天脱离项目,整dubbo,老是报NPE,一直依赖注入失败,就算是本地的服务也老是NPE,整的有些崩溃
想好好搞一下spring依赖注入和dubbo案例,记录下

  1. spring依赖注入
    – Spring Boot静态成员注入导致的NullPointerException(NPE) 问题
    – 多线程之线程中无法用@Autowired注解注入bean
    – new出来的对象中无法使用@autowired进行对象bean注入
    随记20211229 dubbo依赖注入失败_第1张图片
    随记20211229 dubbo依赖注入失败_第2张图片

出现这三个问题,主要是准备多线程跑一下rpc调用耗时,本来准备main方法跑,结果老是npe一查静态成员注入导致的,索性test跑,然后又出现两种npe,加上系统不稳定,废了九牛二虎之力才解决。

多线程记录总耗时,使用CountDownLatch

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class})
public class TestGet2 {
    @Test
    public void test() throws InterruptedException {
        int cnt = 5;
        //创建一个CountDownLatch对象,并调用构造器将计数器设置为5
        CountDownLatch latch = new CountDownLatch(cnt);
        //创建一个LatchDemo对象,并将CountDownLatch的实例对象传入
        //记录开始时间
        long start = System.currentTimeMillis();
        //通过循环创建并启动五个线程
        for(int i = 0; i < cnt; i++){
            new Thread(new LatchDemo(latch)).start();
        }
        try {
//调用await()方法,阻塞主线程,当上述启动的5个分线程都执行完后,主线程才会被放行
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //记录下结束时间
        long end = System.currentTimeMillis();
        System.out.println("**********消耗的时间为(毫秒):" + (end - start));
    }
}

主任务


public class LatchDemo implements Runnable {
    //用来存放一个闭锁
    private CountDownLatch latch;
    //构造器初始化
    public LatchDemo(CountDownLatch latch) {
        this.latch = latch;
    }
    @Override
    public void run() {
        try {
            for (int i = 0; i < 10; i++) {
                try {
                //直接@Autowired Xxxx1 会NPE
                    //Xxxx1 bean = (Xxxx1)SpringContextUtil.getBean("xxxx1");
                    //Xxxx2 result = bean.fun();
                } catch (Exception e) {
                    e.printStackTrace();
                    return;
                }
            }
        } finally {
            //将该代码放入finally中,确保这段代码一定能执行,否则主线程无法结束
            latch.countDown();    //让CountDownLatch计数器减1
        }
    }
}
/**
 * 动态加载Spring bean对象
 *
 */
@Component
public class SpringContextUtil  implements ApplicationContextAware {
    //     Spring应用上下文环境
    private static ApplicationContext applicationContext;
 
    /**
     * 实现ApplicationContextAware接口的回调方法,设置上下文环境
     *
     * @param applicationContext
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        SpringContextUtil.applicationContext = applicationContext;
    }
 
    /**
     * @return ApplicationContext
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
 
    /**
     * 获取Spring bean对象
     * 这里重写了bean方法
     * @param name
     * @return Object 一个以所给名字注册的Spring bean的实例
     * @throws BeansException
     */
    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }
    public static <T> T getBean(Class<T> requiredType) {
 
        return applicationContext.getBean(requiredType);
    }
}
参考:
[springBeanUtil]:https://www.codeleading.com/article/67154245024/
[new对象内@Autowired为null]:https://blog.csdn.net/qq_37552636/article/details/117857568 
[多线程总耗时]:https://blog.csdn.net/weixin_48029654/article/details/109958550
  1. dubbo简单案例
    todo

你可能感兴趣的:(java学习,java,spring)