OSGI企业应用开发(九)整合Spring和Mybatis框架(二)
上篇文章中,我们完成了在OSGI应用中整合Spring和Mybatis框架的准备工作,本节我们继续Spring和Mybatis框架的整合。
一、解决OSGI整合Spring中的Placeholder问题
使用Spring框架的朋友应该都知道,我们可以在Bean的配置文件中,使用${key}的形式访问properties文件中对应的value值,需要用到Spring中的PropertyPlaceholderConfigurer类,使用方式如下,首先需要配置placeholder,例如:
<bean id="placeholder"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>conf/jdbc.properties</value>
</property>
</bean>
conf/jdbc.properties文件内容如下:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/mysqldb?useUnicode=true&characterEncoding=UTF-8&
jdbc.username=root
jdbc.password=123456
然后我们定义Bean的时候,就可以使用${key}的方式访问jdbc.properties文件中的内容,例如:
<bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
<property name="driverClassName"value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}"/>
<property name="password"value="${jdbc.password}" />
</bean>
但是在OSGI应用中,并没有全局的Classpath的概念,其中一个Bundle的属性文件在其他Bundle中无法访问,而且不同Bundle中的ApplictionContext也是独立的,PropertyPlaceholderConfigurer实例在不同的Bundle中不是共享的,所以Spring框架中的Placeholder配置也就存在一定的问题。
Gemini Blueprint为OSGI应用中使用Placeholder提供了一种解决方案,但是基于Key-Value的配置信息需要定义在XML文件中,例如:
<?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:osgix="http://www.springframework.org/schema/osgi-compendium"
xmlns:ctx="http://www.springframework.org/schema/context"
xmlns:osgi="http://www.eclipse.org/gemini/blueprint/schema/blueprint"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/osgi-compendium
http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium.xsd
http://www.eclipse.org/gemini/blueprint/schema/blueprint
http://www.eclipse.org/gemini/blueprint/schema/blueprint/gemini-blueprint.xsd">
<osgix:cm-properties id="dbInfo" persistent-id="com.csdn.osgi.common">
<prop key="driver">com.mysql.jdbc.Driver</prop>
<prop key="url">jdbc:mysql://127.0.0.1:3306/osgi</prop>
<prop key="username">root</prop>
<prop key="password"></prop>
</osgix:cm-properties>
<ctx:property-placeholder properties-ref="dbInfo" />
</beans>
接下来在Bean的定义中,就可以一${Key}的形式访问Value值了,例如:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</bean>
二、Spring与Mybatis框架整合
1、首先新建一个Plug-in Project,名称为com.csdn.osgi.database,该Bundle用于操作数据库。
2、接着在com.csdn.osgi.database工程中新建META-INF/spring目录,然后在该目录下新建database.xml文件,用于配置数据源及Mybatis-Spring插件提供的SqlSessionFactoryBean和SqlSessionTemplate的实例,以及事务管理器等。
database.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:sqlMap.xml"/>
</bean>
<!-- 创建SqlSessionTemplate -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
<!-- 事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--事务模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<!--ISOLATION_DEFAULT 表示由使用的数据库决定 -->
<property name="isolationLevelName" value="ISOLATION_DEFAULT"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
</bean>
</beans>
3、接下来在META-INF/spring目录下,新建一个dmconfig.xml文件,用于配置placeholder及注册sqlSessionTemplate这个Bean,这样在其他Bundle中就可以通过引用我们注册的sqlSessionTemplate来操作数据库了。
dmconfig.xml文件内容如下:
<?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:osgix="http://www.springframework.org/schema/osgi-compendium"
xmlns:ctx="http://www.springframework.org/schema/context"
xmlns:osgi="http://www.eclipse.org/gemini/blueprint/schema/blueprint"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/osgi-compendium
http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium.xsd
http://www.eclipse.org/gemini/blueprint/schema/blueprint
http://www.eclipse.org/gemini/blueprint/schema/blueprint/gemini-blueprint.xsd">
<osgix:cm-properties id="dbInfo" persistent-id="com.csdn.osgi.common">
<prop key="driver">com.mysql.jdbc.Driver</prop>
<prop key="url">jdbc:mysql://127.0.0.1:3306/osgi</prop>
<prop key="username">root</prop>
<prop key="password"></prop>
</osgix:cm-properties>
<ctx:property-placeholder properties-ref="dbInfo" />
<osgi:service id="sqlMapService" ref="sqlSessionTemplate" interface="org.apache.ibatis.session.SqlSession" />
</beans>
4、接下来就是Mybatis主配置文件和SQL的配置了,在sqlSessionFactory这个Bean的配置中,我们指定了Mybatis配置文件为sqlMap.xml,如下:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:sqlMap.xml"/>
</bean>
所以需要在com.csdn.osgi.database工程的src目录下新建一个sqlMap.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<mappers>
<mapper resource="user.xml"/>
</mappers>
</configuration>
上面配置中,我们指定了SQL配置文件为user.xml,接着在com.csdn.osgi.database工程的src目录下新建user.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="user">
<insert id="saveUser" parameterType="java.util.HashMap">
insert into user(username,password) values(#{UserName},#{Password});
</insert>
<select id="getPasswordByName" parameterType="java.lang.String" resultType="java.lang.String">
select password from user where username = #{UserName}
</select>
</mapper>
5、整个工程目录及文件结构如下图所示:
6、然后还需要对com.csdn.osgi.database工程的MANIFEST.MF文件新建修改,添加如下Bundle的依赖:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Database
Bundle-SymbolicName: com.csdn.osgi.database
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: CSDN
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.springframework.jdbc;bundle-version="3.0.0",
org.mybatis.mybatis;bundle-version="3.1.1",
com.springsource.org.apache.commons.dbcp;bundle-version="1.2.2",
com.springsource.org.apache.commons.pool;bundle-version="1.3.0",
org.springframework.transaction;bundle-version="3.0.0",
com.springsource.com.mysql.jdbc;bundle-version="5.1.6",
org.mybatis.mybatis-spring;bundle-version="1.2.3"
上面MANIFEST.MF文件中,Require-Bundle元数据头为新增。
7、最后一步,启动OSGI容器。需要单击Run=>Debug Configurations…菜单,如下图所示:
单击Validate Bundles按钮,查看是否存在Bundle依赖问题,笔者单击后如下图所示:
说明存在依赖问题,解决方法非常简单,单击面板上的Add Required Bundles按钮即可。
启动后输出控制台输出日志内容如下:
一月 07, 2017 3:40:33 下午 org.eclipse.gemini.blueprint.extender.internal.boot.ChainActivator <init>
信息: Blueprint API detected; enabling Blueprint Container functionality
一月 07, 2017 3:40:33 下午 org.eclipse.gemini.blueprint.extender.internal.activator.LoggingActivator start
信息: Starting [org.eclipse.gemini.blueprint.extender] bundle v.[2.0.0.M02]
osgi> 一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.internal.support.ExtenderConfiguration start
信息: No custom extender configuration detected; using defaults...
一月 07, 2017 3:40:34 下午 org.springframework.scheduling.timer.TimerTaskExecutor afterPropertiesSet
信息: Initializing Timer
hello world!
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.support.DefaultOsgiApplicationContextCreator createApplicationContext
信息: Discovered configurations {osgibundle:/META-INF/spring/*.xml} in bundle [Common (com.csdn.osgi.common)]
Hello World!!
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.support.DefaultOsgiApplicationContextCreator createApplicationContext
信息: Discovered configurations {config/*.xml} in bundle [Helloworld (com.csdn.osgi.helloworld)]
一月 07, 2017 3:40:34 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.common, config=osgibundle:/META-INF/spring/*.xml): startup date [Sat Jan 07 15:40:34 CST 2017]; root of context hierarchy
一月 07, 2017 3:40:34 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.helloworld, config=config/*.xml): startup date [Sat Jan 07 15:40:34 CST 2017]; root of context hierarchy
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.context.support.AbstractOsgiBundleApplicationContext unpublishContextAsOsgiService
信息: Application Context service already unpublished
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.internal.blueprint.activator.support.BlueprintContainerCreator createApplicationContext
信息: Discovered configurations {bundleentry://43.fwk2082351774/OSGI-INF/blueprint/beans.xml} in bundle [Helloworld (com.csdn.osgi.helloworld)]
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.context.support.AbstractOsgiBundleApplicationContext unpublishContextAsOsgiService
信息: Application Context service already unpublished
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.support.DefaultOsgiApplicationContextCreator createApplicationContext
信息: Discovered configurations {osgibundle:/META-INF/spring/*.xml} in bundle [Database (com.csdn.osgi.database)]
一月 07, 2017 3:40:34 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.database, config=osgibundle:/META-INF/spring/*.xml): startup date [Sat Jan 07 15:40:34 CST 2017]; root of context hierarchy
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.context.support.AbstractOsgiBundleApplicationContext unpublishContextAsOsgiService
信息: Application Context service already unpublished
一月 07, 2017 3:40:34 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.helloworld, config=bundleentry://43.fwk2082351774/OSGI-INF/blueprint/beans.xml): startup date [Sat Jan 07 15:40:34 CST 2017]; root of context hierarchy
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.context.support.AbstractOsgiBundleApplicationContext unpublishContextAsOsgiService
信息: Application Context service already unpublished
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from OSGi resource[bundleentry://43.fwk2082351774/OSGI-INF/blueprint/beans.xml|bnd.id=43|bnd.sym=com.csdn.osgi.helloworld]
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from URL [bundleentry://37.fwk2082351774/META-INF/spring/beans.xml]
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from URL [bundleentry://46.fwk2082351774/META-INF/spring/database.xml]
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from URL [bundleentry://43.fwk2082351774/config/beans.xml]
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from URL [bundleentry://43.fwk2082351774/config/company.xml]
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from URL [bundleentry://46.fwk2082351774/META-INF/spring/dmconfig.xml]
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from URL [bundleentry://37.fwk2082351774/META-INF/spring/dmconfig.xml]
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor stageOne
信息: No outstanding OSGi service dependencies, completing initialization for OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.helloworld, config=bundleentry://43.fwk2082351774/OSGI-INF/blueprint/beans.xml)
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from URL [bundleentry://43.fwk2082351774/config/dmconfig.xml]
================Hello World================
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from URL [bundleentry://37.fwk2082351774/META-INF/spring/employee.xml]
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@215dd7af: defining beans [helloWorld,blueprintBundle,blueprintBundleContext,blueprintContainer,blueprintConverter]; root of factory hierarchy
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor stageOne
信息: No outstanding OSGi service dependencies, completing initialization for OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.common, config=osgibundle:/META-INF/spring/*.xml)
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.blueprint.container.support.BlueprintContainerServicePublisher registerService
信息: Publishing BlueprintContainer as OSGi service with properties {Bundle-SymbolicName=com.csdn.osgi.helloworld, Bundle-Version=1.0.0.qualifier, osgi.blueprint.container.version=1.0.0.qualifier, osgi.blueprint.container.symbolicname=com.csdn.osgi.helloworld}
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@68bf15f1: defining beans [object,length,buffer,current-time,list,employee,programmer]; root of factory hierarchy
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.context.support.AbstractOsgiBundleApplicationContext publishContextAsOsgiServiceIfNecessary
信息: Publishing application context as OSGi service with properties {org.eclipse.gemini.blueprint.context.service.name=com.csdn.osgi.helloworld, org.springframework.context.service.name=com.csdn.osgi.helloworld, Bundle-SymbolicName=com.csdn.osgi.helloworld, Bundle-Version=1.0.0.qualifier}
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyServiceManager doFindDependencies
信息: Adding OSGi service dependency for importer [&employee] matching OSGi filter [(objectClass=com.csdn.osgi.domain.Employee)]
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.internal.support.DefaultOsgiBundleApplicationContextListener onOsgiApplicationEvent
信息: Application context successfully refreshed (OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.helloworld, config=bundleentry://43.fwk2082351774/OSGI-INF/blueprint/beans.xml))
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyServiceManager findServiceDependencies
信息: OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.helloworld, config=config/*.xml) is waiting for unsatisfied dependencies [[&employee]]
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor stageOne
信息: No outstanding OSGi service dependencies, completing initialization for OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.database, config=osgibundle:/META-INF/spring/*.xml)
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@30d1126b: defining beans [dataSource,sqlSessionFactory,sqlSessionTemplate,transactionManager,transactionTemplate,dbInfo,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,sqlMapService]; root of factory hierarchy
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.service.exporter.support.OsgiServiceFactoryBean registerService
信息: Publishing service under classes [{com.csdn.osgi.domain.Employee}]
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyServiceManager$DependencyServiceListener serviceChanged
信息: No unsatisfied OSGi service dependencies; completing initialization for OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.helloworld, config=config/*.xml)
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.context.support.AbstractOsgiBundleApplicationContext publishContextAsOsgiServiceIfNecessary
信息: Publishing application context as OSGi service with properties {org.eclipse.gemini.blueprint.context.service.name=com.csdn.osgi.common, org.springframework.context.service.name=com.csdn.osgi.common, Bundle-SymbolicName=com.csdn.osgi.common, Bundle-Version=1.0.0.qualifier}
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.internal.support.DefaultOsgiBundleApplicationContextListener onOsgiApplicationEvent
信息: Application context successfully refreshed (OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.common, config=osgibundle:/META-INF/spring/*.xml))
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
一月 07, 2017 3:40:34 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@4f805c92: defining beans [helloWorld1,helloWorld2,company,employee]; root of factory hierarchy
================Hello World================
================Hello World================
=========Company=========
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.context.support.AbstractOsgiBundleApplicationContext publishContextAsOsgiServiceIfNecessary
信息: Publishing application context as OSGi service with properties {org.eclipse.gemini.blueprint.context.service.name=com.csdn.osgi.helloworld, org.springframework.context.service.name=com.csdn.osgi.helloworld, Bundle-SymbolicName=com.csdn.osgi.helloworld, Bundle-Version=1.0.0.qualifier}
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.internal.support.DefaultOsgiBundleApplicationContextListener onOsgiApplicationEvent
信息: Application context successfully refreshed (OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.helloworld, config=config/*.xml))
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.service.exporter.support.OsgiServiceFactoryBean registerService
信息: Publishing service under classes [{org.apache.ibatis.session.SqlSession}]
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.context.support.AbstractOsgiBundleApplicationContext publishContextAsOsgiServiceIfNecessary
信息: Publishing application context as OSGi service with properties {org.eclipse.gemini.blueprint.context.service.name=com.csdn.osgi.database, org.springframework.context.service.name=com.csdn.osgi.database, Bundle-SymbolicName=com.csdn.osgi.database, Bundle-Version=1.0.0.qualifier}
一月 07, 2017 3:40:34 下午 org.eclipse.gemini.blueprint.extender.internal.support.DefaultOsgiBundleApplicationContextListener onOsgiApplicationEvent
信息: Application context successfully refreshed (OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.database, config=osgibundle:/META-INF/spring/*.xml))
从日志文件中可以分析出,Mybatis相关的Bean已经实例化成功,本节内容先介绍这么多,下篇文件中我们在其他Bundle中通过Mybatis-Spring插件提供的模版类操作数据库。
注意:上篇文章提到使用Mybatis-Spring插件版本为1.2.0,与Spring 3.0整合存在一定的问题,本文中笔者將Mybatis-Spring插件版本改为1.2.3。
OSGI企业应用开发(九)整合Spring和Mybatis框架(二)的更多相关文章
- OSGI企业应用开发(八)整合Spring和Mybatis框架(一)
到目前为止,我们已经学习了如何使用Blueprint將Spring框架整合到OSGI应用中,并学习了Blueprint&Gemini Blueprint的一些使用细节.本篇文章开始,我们將My ...
- OSGI企业应用开发(十)整合Spring和Mybatis框架(三)
上篇文章中,我们已经完成了OSGI应用中Spring和Mybatis框架的整合,本文就来介绍一下,如何在其他Bundle中,使用Mybatis框架来操作数据库. 为了方便演示,我们新建一个新的Plug ...
- 框架整合——Spring与MyBatis框架整合
Spring整合MyBatis 1. 整合 Spring [整合目标:在spring的配置文件中配置SqlSessionFactory以及让mybatis用上spring的声明式事务] 1). 加入 ...
- OSGI企业应用开发(十二)OSGI Web应用开发(一)
前面文章中介绍了如何在OSGI应用中整合Spring和Mybatis框架,本篇文章开始介绍如何使用OSGI技术开发Web应用.对于传统的Java EE应用,应用中涉及到的Web元素无非就是Servle ...
- 搭建Spring + SpringMVC + Mybatis框架之二(整合Spring和Mybatis)
整合Spring和Mybatis 首先给出完整的项目目录: (1)引入项目需要的jar包 使用http://maven.apache.org作为中央仓库即可. Spring核心包,mybatis核心包 ...
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(2 配置spring-dao和测试)
用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 搭建目录环境和依赖) 四:在\resources\spring 下面 ...
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 构建目录环境和依赖)
引言:在用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建一 的基础上 继续进行项目搭建 该部分的主要目的是测通MyBatis 及Spring-dao ...
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建一:建立MAVEN Web项目
一:创建maven web项目er
- 使用maven整合spring+springmvc+mybatis
使用maven整合spring+springmvc+mybatis 开发环境: 1. jdk1.8 2. eclipse4.7.0 (Oxygen) 3. mysql 5.7 在pom.xml文件中, ...
随机推荐
- python并发编程之进程池,线程池concurrent.futures
进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多, 这会对 ...
- 【sping揭秘】3、Spring容器中bean默认是保持一个实例
Spring容器中bean默认是保持一个实例 这里做一个测试,基础代码 package cn.cutter.start.provider; import org.springframework.con ...
- sql 导入导出表数据 命令
那么在我们使用BCP命令之前,我们首先要在Sql Server数据库中执行下列语句,以修改Sql Server的配置,启用对BCP命令的支持. --允许配置高级选项 exec sp_configure ...
- oracle 闪回、归档的设置建议
闪回与归档的相关测试 参考博客:http://www.cnblogs.com/hellojesson/p/7050097.html 数据库在归档模式下的管理 参考博客:http://www.cnblo ...
- 在Ubuntu Server上安装Postgresql
首先更新一下源: sudo apt-get update 如果你不知道Postgresql具体的包的名称,可以使用一下语句进行查找: apt-cache search ^Postgresql 使用上述 ...
- 一口一口吃掉Hexo(三)
如果你想得到更好的阅读效果,请访问我的个人网站 ,版权所有,未经许可不得转载! 相信通过前一节的学习,你已经在你的本地部署好了你的网站,那么接下来就让你的朋友们通过网络访问你的网站吧!通过这一节你将免 ...
- Silverlight中使用MVVM(2)-(提高)
在第一篇文章中的示例中,我们已经简单的了解了应用MVVM模式的流程,我的本意是你已经了解了一点MVVM的概念,然后又没有一个较好的例子学习,可以跟着我一起学习MVVM模式,所以这个部分,都是没有理论知 ...
- 快速选择算法/Select 寻找第k大的数
参考算法导论9.3节的内容和这位大神的博客:http://blog.csdn.net/v_JULY_v上对这一节内容代码的实现进行了学习 尝试实现了以查找中位数为前提的select算法. 算法功能:可 ...
- 文件句柄FileDescriptor的hanle/fd两个字段分析
对于FileInputStream/FileOutputStream/RandomAccessFile,使用handle来表示底层的文件句柄 对于ServerSocket/Socket,使用fd来表示 ...
- 交换排序:冒泡排序vs快速排序
在开发的过程中, 经常会遇到集合排序, 那么一般情况下, 我们都是使用list.OrderBy()的方式来排序, 也无需关注到里面算法的实现是个什么样子. 正好这几天准备回顾一下数据结构与算法. 首先 ...