title: 把大象放進冰箱--spring自動掃瞄並發布rmi tags:
對於需要暴露大量rmi的應用來說,每次新增加乙個service都需要手寫一段xml也是蠻累的……
偷懶的程式設計師想到了如下的辦法
利用component-scan發布service同時發布rmi呢?說做就做
開啟冰箱門
首先需要把所有的@service註解掃瞄,設定beandefinition的相關屬性包括service,servicename等
把大象塞進冰箱
將beandefinition註冊到spring容器中
關上冰箱門
初始化對應的beandefinition
具體**如下
/**
* created by qixiaobo on 2016/10/8.
*/public
class
publishrmibean
implements
") private
int port;
private metadatareade***ctory metadatareade***ctory = new cachingmetadatareade***ctory(this.resourcepatternresolver);
private
static
final listincludefilters = new linkedlist<>();
private
static
final string default_resource_pattern = "**/*.class";
public string getbasepkg
()
public
void
setbasepkg
(string basepkg)
static
@postconstruct
public
void
init
()throws ioexception else
string beanname = rminamegenerator.getbeanname(clazzname.substring(clazzname.lastindexof(".") + 1));
registerrmi(clazz, beanname);}}
} catch (throwable e) }}
try catch (exception ex)
}private
void
registerrmi
(class clazz, string beanname)
builder.addpropertyvalue("serviceinte***ce", clazz.getinte***ces()[0]);
builder.addpropertyvalue("servicename", beanname);
builder.addpropertyvalue("registryport", port);
builder.addpropertyreference("remoteinvocationexecutor", "clientinforemoteinvocationexecutor");
builder.addpropertyvalue("service", context.getbean(clazz));
builder.setlazyinit(false);
getbeandefinitionregistry().registerbeandefinition(beanname + "exporter", builder.getrawbeandefinition());
logger.info("publish rmi:" + beanname);
}private beandefinitionregistry getbeandefinitionregistry
()
private
boolean
iscandidatecomponent
(metadatareader metadatareader)
throws ioexception
}return
false;
}private
boolean
iscandidatecomponent
(annotatedbeandefinition beandefinition)
@override
public
void
throws bean***ception
private string resolvebasepackage
(string basepackage)
}複製**
在spring的xml中註冊如下
複製**
class="com.***.publishrmibean" >
name="basepkg"
value="com.***.service.*.impl"/>
bean>
複製**
複製**
把大象放進冰箱裡 資源的開啟 應用與關閉
冰箱名是記憶體上的臨時資料,是乙個字串或者乙個整數,是資源的乙個代號。冰箱是對資源的乙個引用,對此引數操作會對實際資源產生影響。誰建立了資源的引用,誰就有義務關閉資源引用,以避免影響其它程式使用。使用資源管理類 如資料庫連線池 統一管理資源的引用,需要使用資源的函式向資源管理類申請,只使用而不用關心...
物件導向之把大象裝進冰箱
將大象裝進冰箱 面向過程 定義乙個類,class demo 將上面的三個功能使用方法改進 public static void open public static void in public static void close 物件導向 需求 將大象裝進冰箱 1 這個需求中有幾個類,使用uml語...
把大象裝進冰箱的N種方法
一物理學的辦法 小學生 已知冰箱的高為10公尺,底面為邊長30公尺的正方形 初中生 大象在凸透鏡2倍焦距外,在冰箱里成倒立放大實象。高中生 把大象看成乙個質點 成績好的高中生 老師這道題不會做,請給我們講解一下 高中老師 這道題屬於怪題,考試中遇到一定要果斷的捨棄。大學生 讓大象高速通過冰箱,根據尺...