Phrancol's blog
To be surprised,to wonder,is to begin to understand.
BlogJava
首頁
聯系
聚合
管理
隨筆 - 1 文章 - 37 trackbacks - 0
<
2025年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
留言簿
(16)
給我留言
查看公開留言
查看私人留言
隨筆分類
反匯編(1)
隨筆檔案
2008年5月 (1)
文章分類
Eclipse(2)
iOS(1)
Mir3gAnyWhere(1)
OSGI(16)
反匯編(5)
文章檔案
2011年11月 (1)
2009年11月 (2)
2009年8月 (1)
2009年7月 (2)
2009年5月 (2)
2009年4月 (3)
2009年3月 (1)
2008年11月 (1)
2008年10月 (1)
2008年7月 (1)
2008年6月 (6)
2008年5月 (1)
2008年4月 (5)
2007年11月 (1)
2007年10月 (1)
2007年9月 (4)
2007年8月 (2)
test
搜索
最新評論
1.?re: 精武館——在線棋牌游戲平臺[未登錄]
好
--五味子
2.?re: 精武館——在線棋牌游戲平臺[未登錄]
很好玩
--五味子
3.?re: [原]一個例子理解AccessController.doPrivileged()
謝謝分享,我第一遍沒看懂,后來去其他地方看了有關權限檢查的的文章以后才看懂,建議解釋一下調用棧,和權限檢查(取調用棧中權限的交集)。
--Flexin
4.?re: [原]MIR3G二次加解密反匯編分析(四)——還原
@Mir3
好久沒有研究這個...
--phrancol
5.?re: [原]MIR3G二次加解密反匯編分析(四)——還原
ll4bb903 這其實是srand 函數
--Mir3
Developing Equinox/Spring-osgi/Spring Framework Web Application Part 2 - 使用Spring-OSGI
一、域模型
先從最底層開始,把域模型建立起來,創建一個Plug-in project -
org.phrancol.osgi.jpetstore.domain,不創建Activator,創建一個package - org.phrancol.osgi.jpetstore.domain,將src\org\springframework\samples\jpetstore\domain 里面的java文件copy進去(重構一下package的名字,java文件里的package自動就變了,不用改每個文件),在MANIFEST.MF里面把依賴包導入一下并export這個package
domain里面的logic,引用了dao,dao也引用了domain,會導致一個錯誤,于是將logic做為一個獨立的bundle,就稱為域邏輯吧
二、域邏輯
創建一個Plug-in project - org.phrancol.osgi.jpetstore.domain.logic,不創建Activator,創建一個同名package,將jpetstore\src\org\springframework\samples\jpetstore\domain\logic里面的java文件copy進去,在MANIFEST.MF里面把依賴包導入
三、DAO
該做dao部分了,創建一個 Plug-in project - org.phrancol.osgi.jpetstore.dao 并創建一個同名package,將jpetstore\src\org\springframework\samples\jpetstore\dao里面的東西全部copy進去,在MANIFEST.MF里面導入依賴包(有一些包需要導入成bundle,例如 spring-jdbc,spring-ibatis),啟動看看,發現spring-ibatis和persistence沒有啟動,手動啟動spring-ibatis,發現缺少ibatis,于是 New-> Other -> Plug-in from existing JAR archives ,導入ibatis,再啟動,發現少 javax.transaction,于是用相同方法導入。
四、配置文件
關于spring的配置文件,只有3個
petstore-servlet.xml - 用于mvc的,定義dispatch bean
applicationContext.xml - 用于域邏輯的
dataAccessContext-local.xml - 用于DAO的,定義了DataSource
(一)dataAccessContext-local.xml
1,將 jdbc.properties和sql-map-config.xml拷貝到META-INF目錄里,sql-map-config.xml里面的資源路徑可能需要修改一下,maps里面的模型的class屬性也需要改一下
2,在META-INF目錄中創建一個目錄spring,將dataAccessContext-local.xml拷貝進去,將applicationContext.xml里面的加載jdbc.properties的bean移植過來,放在DataSource的上面
<
bean
id
="propertyConfigurer"
class
="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
>
<
property
name
="locations"
>
<
list
>
<
value
>
META-INF/jdbc.properties
</
value
>
</
list
>
</
property
>
</
bean
>
再把dataAccessContext-local.xml里面的dao-bean->class屬性值修改一下,再把sqlMapClient的configLocation的值修改成META-INF/sql-map-config.xml,例如
<!--
SqlMap setup for iBATIS Database Layer
-->
<
bean
id
="sqlMapClient"
class
="org.springframework.orm.ibatis.SqlMapClientFactoryBean"
>
<
property
name
="configLocation"
value
="META-INF/sql-map-config.xml"
/>
<
property
name
="dataSource"
ref
="dataSource"
/>
</
bean
>
<!--
========================= DAO DEFINITIONS: IBATIS IMPLEMENTATIONS =========================
-->
<
bean
id
="accountDao"
class
="org.phrancol.sogi.jpetstore.dao.ibatis.SqlMapAccountDao"
>
<
property
name
="sqlMapClient"
ref
="sqlMapClient"
/>
</
bean
>
3,啟動,報錯,找不到ibatis的某個類,報錯信息如下
org.springframework.beans.BeanInstantiationException: Could not instantiate bean
class
[org.springframework.orm.ibatis.SqlMapClientFactoryBean]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig
Caused by: java.lang.NoClassDefFoundError: com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig
at org.springframework.orm.ibatis.SqlMapClientFactoryBean.
class
$(SqlMapClientFactoryBean.java:
72
)
看來是spring-ibatis找不到com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig,來看看spring-ibatis的MANIFEST.MF,Dependencies的Import Packages, 加上com.ibatis.sqlmap.engine.transaction.external,再啟動,找不到DBCP,導入common-DBCP和common-pool,再啟動,正常,SS一下,還是正常
(二)applicationContext.xml
1,在org.phrancol.osgi.jpetstore.domain.logic的META-INF目錄中創建一個目錄spring,將applicationContext.xml拷貝進去,并改名為 logic-context.xml,刪除propertyConfigurer這個bean,因為它已經被移到了dataAccessContext-local.xml里面,將里面的bean的class屬性修改一下,啟動,發現缺少org.aspectj,導入一個,再啟動,報錯
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named
'
accountDao
'
is defined
無法找到 accountDao,accountDao被定義在org.phrancol.osgi.jpetstore.dao里面了,于是現在需要使用spring-osgi 來進行跨bundle的引用了。
2,org.phrancol.osgi.jpetstore.dao/META-INF/spring目錄中創建一個spring配置文件dataAccessContext-local-osgi.xml,使用<osgi:service>將accountDao和其他被引用的DAO注冊成為OSGI Service
<?
xml version="1.0" encoding="UTF-8"
?>
<
beans
xmlns
="http://www.springframework.org/schema/beans"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi
="http://www.springframework.org/schema/osgi"
xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd"
>
<
osgi:service
id
="accountDaoOsgi"
ref
="accountDao"
interface
="org.phrancol.osgi.jpetstore.dao.AccountDao"
>
</
osgi:service
>
<
osgi:service
id
="categoryDaoOsgi"
ref
="categoryDao"
interface
="org.phrancol.osgi.jpetstore.dao.CategoryDao"
>
</
osgi:service
>
<
osgi:service
id
="productDaoOsgi"
ref
="productDao"
interface
="org.phrancol.osgi.jpetstore.dao.ProductDao"
>
</
osgi:service
>
<
osgi:service
id
="itemDaoOsgi"
ref
="itemDao"
interface
="org.phrancol.osgi.jpetstore.dao.ItemDao"
>
</
osgi:service
>
<
osgi:service
id
="orderDaoOsgi"
ref
="orderDao"
interface
="org.phrancol.osgi.jpetstore.dao.OrderDao"
>
</
osgi:service
>
</
beans
>
3,在org.phrancol.osgi.jpetstore.domain.logic/META-INF/spring 也創建一個spring配置文件logic-context-osgi.xml,使用<osgi:reference>獲取服務
<?
xml version="1.0" encoding="UTF-8"
?>
<
beans
xmlns
="http://www.springframework.org/schema/beans"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi
="http://www.springframework.org/schema/osgi"
xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd"
>
<
osgi:reference
id
="accountDaoOsgi"
interface
="org.phrancol.osgi.jpetstore.dao.AccountDao"
/>
<
osgi:reference
id
="categoryDaoOsgi"
interface
="org.phrancol.osgi.jpetstore.dao.CategoryDao"
/>
<
osgi:reference
id
="productDaoOsgi"
interface
="org.phrancol.osgi.jpetstore.dao.ProductDao"
/>
<
osgi:reference
id
="itemDaoOsgi"
interface
="org.phrancol.osgi.jpetstore.dao.ItemDao"
/>
<
osgi:reference
id
="orderDaoOsgi"
interface
="org.phrancol.osgi.jpetstore.dao.OrderDao"
/>
</
beans
>
將logic-context.xml里面的bean petStore的屬性引用修改一下
<
bean
id
="petStore"
class
="org.phrancol.osgi.jpetstore.domain.logic.PetStoreImpl"
>
<
property
name
="accountDao"
ref
="accountDaoOsgi"
/>
<
property
name
="categoryDao"
ref
="categoryDaoOsgi"
/>
<
property
name
="productDao"
ref
="productDaoOsgi"
/>
<
property
name
="itemDao"
ref
="itemDaoOsgi"
/>
<
property
name
="orderDao"
ref
="orderDaoOsgi"
/>
</
bean
>
再啟動看看,還是報錯
org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'
txAdvice
'
: Cannot resolve reference to bean
'
transactionManager
'
while
setting bean property
'
transactionManager
'
; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named
'
transactionManager
'
is defined
原來是transactionManager的問題,在DAO里面將transactionManager注冊成osgi service,在domain.logic里面引用,然后給txAdvice加上
transaction-manager
屬性
<
tx:advice
id
="txAdvice"
transaction-manager
="transactionManagerOsgi"
>
<
tx:attributes
>
<
tx:method
name
="insert*"
/>
<
tx:method
name
="update*"
/>
<
tx:method
name
="*"
read-only
="true"
/>
</
tx:attributes
>
</
tx:advice
>
OK,啟動,正常了
(三)petstore-servlet.xml
最后到spring-mvc的配置文件了,在前面已經將這個配置文件拷貝到org.phrancol.osgi.jpetstore.springmvc/META-INF/dispatcher目錄下了,并且做了一些修改,讓DispatcherServlet加載用以顯示首頁
1,新建一個package org.phrancol.osgi.jpetstore.springmvc.controller,將jpetstore\src\org\springframework\samples\jpetstore\web\spring里面的java文件拷貝進去,將依賴包導入,然后在petstore-servlet.xml里面加上一個dispatch-bean,
<
bean
name
="/shop/addItemToCart.do"
class
="org.phrancol.osgi.jpetstore.springmvc.controller.AddItemToCartController"
>
<
property
name
="petStore"
ref
="petStore"
/>
</
bean
>
啟動看看效果,報錯
Caused by: java.lang.ClassNotFoundException: org.phrancol.osgi.jpetstore.springmvc.controller.AddItemToCartController
居然找不到這個類,來看看ClassLoader
Thread.currentThread().getContextClassLoader()
->
org.eclipse.core.runtime.internal.adaptor.ContextFinder
Activator
'
s ClassLoader -> org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader
原來如此,那就這樣
Thread.currentThread().setContextClassLoader(
this
.getClass().getClassLoader())
其實這樣也是可以的,但是為了不繞彎路,而且既然是Spring的配置文件,Spring-osgi也提供得有Bundle的ClassLoader ->
org.springframework.osgi.context.support.BundleDelegatingClassLoader
交給Spring的ClassLoader吧
2,看一段代碼 org.springframework.osgi.context.support.BundleContextAwareProcessor
public
boolean
postProcessAfterInstantiation(Object bean, String beanName)
throws
BeansException
{
if
(bean
instanceof
BundleContextAware)
{
if
(
this
.bundleContext
==
null
)
{
throw
new
IllegalStateException(
"
Cannot satisfy BundleContextAware for bean '
"
+
beanName
+
"
' without BundleContext
"
);
}
if
(logger.isDebugEnabled())
{
logger.debug(
"
Invoking setBundleContext on BundleContextAware bean '
"
+
beanName
+
"
'
"
);
}
((BundleContextAware) bean).setBundleContext(
this
.bundleContext);
}
return
true
;
}
3,再來看看這個接口
org.springframework.osgi.context
.BundleContextAware
Interface that enables beans to find the bundle context they are defined in. Note that in most circumstances there is no need
for
a bean to implement
this
interface
.
OK,那就寫個BundleContextAware,然后配置成Bean就可以了
4,創建一個 Plug-in project org.phrancol.osgi.jpetstore.util,并創建同名package,新建一個Interface HttpServiceRegister 用于注冊Servlet或Resource,這個過程在方法 public void serviceRegister(BundleContext context);里進行,新建一個Class BundleServiceRegister
public
class
BundleServiceRegister
implements
BundleContextAware
{
private
HttpServiceRegister httpServiceRegister;
public
BundleServiceRegister(HttpServiceRegister httpServiceRegister)
{
this
.httpServiceRegister
=
httpServiceRegister;
}
public
void
setBundleContext(BundleContext context)
{
this
.httpServiceRegister.serviceRegister(context);
}
}
5,生成一個類org.phrancol.osgi.jpetstore.springmvc.SpringmvcHttpServiceRegister implements HttpServiceRegister
將Activator.start方法里的內容拷貝到SpringmvcHttpServiceRegister.serviceRegister方法里,刪除Activator(MANIFEST.MF)
6,在org.phrancol.osgi.jpetstore.springmvc/META-INF/下建立一個目錄spring,從別的地方copy一個bean配置文件過來,改名為logic-context.xml,加入如下配置
<
beans
>
<
bean
id
="springHttpServiceRegister"
class
="org.phrancol.osgi.jpetstore.util.BundleServiceRegister"
>
<
constructor-arg
>
<
bean
class
="org.phrancol.osgi.jpetstore.springmvc.SpringmvcHttpServiceRegister"
/>
</
constructor-arg
>
</
bean
>
</
beans
>
啟動,報錯,petstore-servlet.xml里面的bean petStore 找不到,這個bean被定義在org.phrancol.osgi.jpetstore.domain.logic里面,于是使用<osgi:service>和<osgi:reference>來獲取
在logic-context-osgi.xml里面加上
<
osgi:service
id
="petStoreOsgi"
ref
="petStore"
interface
="org.phrancol.osgi.jpetstore.domain.logic.PetStoreFacade"
>
</
osgi:service
>
在springmvc-context.xml加入如下內容(注意namespaces)
<
osgi:reference
id
="petStoreOsgi"
interface
="org.phrancol.osgi.jpetstore.domain.logic.PetStoreFacade"
/>
修改一下petstore-servlet.xml
<
property
name
="petStore"
ref
="petStore"
/>
改成
<
property
name
="petStore"
ref
="petStoreOsgi"
/>
OK,這次應該沒問題了,啟動看看效果,還是報錯
org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'
/shop/addItemToCart.do
'
defined in ServletContext resource [
/
META
-
INF
/
dispatcher
/
petstore
-
servlet.xml]: Cannot resolve reference to bean
'
petStoreOsgi
'
while
setting bean property
'
petStore
'
; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named
'
petStoreOsgi
'
is defined
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named
'
petStoreOsgi
'
is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:
353
)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:
916
)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:
243
)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:
160
)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:
261
)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:
109
)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:
1100
)
居然找不到petStoreOsgi這個bean......
posted on 2007-09-07 10:26
Phrancol Yang
閱讀(3990)
評論(0)
編輯
收藏
所屬分類:
OSGI
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
Tomcat-OSGi Demo: JPetStoreOSGi(Spring-osgi 1.2.0)
Extwind——支持OSGi應用的Tomcat
[譯]OSGi Service Platform Core Specification Release 4 - Package Admin Service Specification
[譯]OSGi Service Platform Core Specification Release 4 - Service Layer
[譯]OSGi Service Platform Core Specification Release 4 - Life Cycle Layer
[譯]OSGi Service Platform Core Specification Release 4 - Module Layer ( Part I 3.7-)
[譯]OSGi Service Platform Core Specification Release 4 - Module Layer ( Part I 3.1-3.6)
構建模塊化的動態Web應用(演示版)
Spring-OSGI 1.0 M3 中文手冊(Spring Dynamic Modules Reference Guide for OSGi(tm) Service Platforms)
Eric Newcomer on the future of OSGi
Copyright ©2025 Phrancol Yang Powered by:
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
亚洲精品456播放
|
四虎免费久久影院
|
亚洲午夜精品一区二区
|
99久久99这里只有免费的精品
|
成人免费激情视频
|
亚洲国产精品婷婷久久
|
久久99精品视免费看
|
亚洲大片在线观看
|
91精品免费久久久久久久久
|
亚洲欧洲日本天天堂在线观看
|
18女人水真多免费高清毛片
|
亚洲欧洲国产综合
|
最近2019中文字幕mv免费看
|
亚洲精品国产首次亮相
|
又粗又大又硬又爽的免费视频
|
一级a性色生活片久久无少妇一级婬片免费放
|
在线观看亚洲精品国产
|
a级日本高清免费看
|
日韩精品一区二区亚洲AV观看
|
亚洲欧洲日产国码www
|
在线观看无码的免费网站
|
黄网站色成年片大免费高清
|
久久久久亚洲AV成人网
|
国产精品免费高清在线观看
|
亚洲欧洲高清有无
|
免费国产精品视频
|
成人免费乱码大片A毛片
|
亚洲一区二区成人
|
午夜高清免费在线观看
|
www永久免费视频
|
亚洲精品自拍视频
|
四虎永久成人免费影院域名
|
怡红院免费全部视频在线视频
|
久久久久亚洲精品日久生情
|
日本无卡码免费一区二区三区
|
麻豆一区二区三区蜜桃免费
|
亚洲短视频男人的影院
|
午夜小视频免费观看
|
a毛看片免费观看视频
|
亚洲精品第一国产综合野
|
国产日产亚洲系列最新
|