反射注入失敗的原因!
阿新 • • 發佈:2019-01-24
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">因為前一段時時間公司沒有什麼新專案,個人閒著無聊就寫自己人生中第一個框架(方便自己以後偷懶...)。可能是自己的技術還是不夠吧,這期間遇到很多問題,而且網上基本找不到這種問題的答案,這也是我寫這篇博文的原因。</span>
下面來講一下我在其中遇到主要的問題,注入失敗(主要是對spring不熟悉造成的)
框架是通過配置文減裡指定的類裡面指定的方法去對頁面靜態化處理
<ftl-factory> <ftl id="news" impl="com.kun.ftl.News"> <template id="news.student" template="template/news.ftl" savePath="html/student_news.shtml"/> <template id="news.teacher" template="template/news.ftl" savePath="html/teacher_news.shtml"/> <template id="news.art" template="template/news.ftl" savePath="html/art/"/> </ftl> <ftl id="test" impl="com.kun.ftl.Test"> <template id="test.student" template="template/news.ftl" savePath="html/student_test.shtml"/> <template id="test.teacher" template="template/news.ftl" savePath="html/teacher_test.shtml"/> </ftl> </ftl-factory> </root>
比如上面的 指定類: com.kun.ftl.News 指定的方法:news.art 指定模板:template 生成的檔案存放於/html/ate/下 下面貼上News類
package com.kun.ftl; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.inject.Named; import com.kun.DTO.NewsDTO; import com.kun.sevice.NewsService; import com.kun.template.statics.FtlBase; @Named("news") public class News extends FtlBase { @Inject private NewsService ns; public Map student(Object arg){ Map root = new HashMap(); root.put("user","王二小"); return root; } public Map teacher(Object arg){ Map root = new HashMap(); for (int i = 0; i < 5; i++) { root.put(""+i,new HashMap()); } root.put("user","王王小二"); return root; } public Map art(Object arg){ Map<String,Map> root = new HashMap<String,Map>(); List<NewsDTO> list = ns.findNews(); for (int i =0 ;i<list.size() ;i++) { Map map =new HashMap<>(); map.put("news", list.get(i)); root.put("news"+i, map); } return root; } public NewsService getNs() { return ns; } public void setNs(NewsService ns) { this.ns = ns; } }
大家可以看到news中的art方法 這時候友們多同學就認為:啊我知道了, 直接利用反射對com.kun.ftl.News例項化不就可以呼叫art了嗎?
然而事實很殘酷,(鄙人當初也是這麼做的),這樣可是會用大大的空指標異常。為什麼呢?
原因是 我們用反射機制例項化出來的物件並不是 spring容器裡管理的bean,因此我們的News物件裡的 ns物件是null,
要解決這個 很簡單 要不你把ns物件弄出來(不可取,後面還有個dao與資料庫相連呢,你有種就試試這種方法),要不你就在spring容器裡取出你要的 ns 或者 News 物件。
取出spring容積裡的bean 不能只要繼承實現一下 ApplicationContextAware 這位先生就行了。
今天說這個 1 是想給大家提供一下這類問題的決絕方法, 2這裡面可以學到spring框架的一些架構知識。
希望這個能幫助到大家(這個是半年前寫的,有很多東西已經忘了,裡面有哪裡講錯的,或者不好的,希望大家多諒解一下,我才畢業一年而已...)