new和@Autowired的区别

  1. controller层:

    @RequestMapping("/payment")
    @RestController
    public class WxPayController {
    
        public WxPayServiceImpl wxPayService = new WxPayServiceImpl();
    
        @RequestMapping("/wxpay/{product_id}")
        public String getWxQrCode(@PathVariable("product_id") Integer productId) {
            System.out.println(productId);
            return wxPayService.getWxQrCode(productId);
        }
    }
    

    service层:

    @Service
    public class WxPayServiceImpl implements WxPayService {
    
        @Autowired
        public WxPayConfigBean wxPayConfigBean;
    
        @Override
        public String getWxQrCode(Integer productId) {
            System.out.println("wxPayConfigBean:" + wxPayConfigBean);
            HashMap<String, String> map = new HashMap<String,String>();
            map.put("appid",wxPayConfigBean.getAppID());
            map.put("mch_id",wxPayConfigBean.getMchID());
            //这里获得的是以秒为单位的时间戳
            Long timeStamp =  WXPayUtil.getCurrentTimestamp();
            map.put("time_stamp",timeStamp.toString());
            map.put("product_id",productId.toString());
            try {
                map.put("sign",WXPayUtil.generateSignature(map,wxPayConfigBean.getKey()));
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            String str = "//wxpay/bizpayurl?"
                    + "sign=" + map.get("sign")
                    + "&appid=" + map.get("appid")
                    + "&mch_id= " + map.get("mch_id")
                    + "&product_id=" + map.get("product_id")
                    + "&time_stamp=" + map.get("time_stamp")
                    + "&nonce_str=" + map.get("nonce_str");
            return JsonUtil.ajaxReturn(str);
        }
    }
    
    

    测试该接口可以发现:wxPayConfigBean:null,显然即便这里用了@Autowired但还是注入失败了.然是如果我们通过junit直接测试:

    @Autowired
    public WxPayConfigBean wxPayConfigBean;
    
    @Test
    void contextLoads() {
        System.out.println(wxPayConfigBean.toString());
    }
    

    此时,数据注入又是成功的.

  2. 查询了比较多的资料后我突然明白自己对于new和@Autuwired的理解还是有很大问题.new创建了一个新对象,但Autowired不是,它是通过先匹配类型再匹配名字的方式(这个顺序正好和@Resource相反)取出由spring管理的对象.回到上面的代码,可以发现在controller层我们拿到的WxPayServiceImpl对象是new出来的,而不是从spring管理的对象中取出的,那么WxPayServiceImpl中的wxPayConfigBean对象更不可能是spring中配置好的对象(相当于无参构造),所以导致最后输出为Null,只要稍微修改一下即可

    @RequestMapping("/payment")
    @RestController
    public class WxPayController {
    
        @Autowired
        public WxPayServiceImpl wxPayService;
    
        @RequestMapping("/wxpay/{product_id}")
        public String getWxQrCode(@PathVariable("product_id") Integer productId) {
            System.out.println(productId);
            return wxPayService.getWxQrCode(productId);
        }
    }
    
原文地址:https://www.cnblogs.com/Arno-vc/p/13509676.html