1. 程式人生 > 實用技巧 >new和@Autowired的區別

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);
        }
    }