Cloud Foundry samples学习笔记 2:hello-spring-mysql

本样例程序是一个简单的Java Spring应用实例,旨在演示如何开发一个能部署到Cloud Foundry上的、使用了Mysql数据库的Java Spring应用。

程序功能:程序启动时初始化一个Mysql数据库,创建一张表并插入若干记录,当接收到用户请求时即返回该数据源的信息以及表中的所有条目。

使用技术:Spring,Mysql

程序repository地址:https://github.com/SpringSource/cloudfoundry-samples/tree/master/hello-spring-mysql

程序源码位于“hello-spring-mysql / src / main/“目录下,包含三个子目录:java,resources,webapp。java目录下存放控制器及相关引用类文件;resources下存放sql脚本,用于程序初始化时创建数据表和数据条目;webapp下存放Spring配置文件和视图文件等。

我们以webapp/WEB-INF/web.xml文件为入口,开始对此样例程序进行分析。

web.xml文件

其中配置了要载入的应用程序上下文配置 /WEB-INF/spring/root-context.xml,和view、controller配置 /WEB-INF/spring/appServlet/servlet-context.xml。这些配置文件与一般的Spring应用配置文件并无太大差异,相信很多人比我更熟悉。这里,我们重点关注一下root-context.xml文件。

root-context.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:jdbc="http://www.springframework.org/schema/jdbc"
	xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/test" />
		<property name="username" value="spring" />
		<property name="password" value="spring" />
	</bean>

	<jdbc:initialize-database data-source="dataSource">
		<jdbc:script location="classpath:db-schema.sql"/>
	</jdbc:initialize-database>
		
</beans>
这里对数据源进行了配置,使用本机的Mysql数据库作为数据源,并使用“db-schema.sql“脚本对”test“数据库进行初始化。该脚本位于resources目录下,创建“current_states”表并插入4条记录。

create table if not exists current_states (id smallint primary key, state_code char(2), name varchar(50));
insert into current_states(id, state_code, name) values(1, 'MA', 'Massachusetts') ON DUPLICATE KEY UPDATE id=id;
insert into current_states(id, state_code, name) values(2, 'NH', 'New Hampshire') ON DUPLICATE KEY UPDATE id=id;
insert into current_states(id, state_code, name) values(3, 'ME', 'Maine') ON DUPLICATE KEY UPDATE id=id;
insert into current_states(id, state_code, name) values(4, 'VT', 'Vermont') ON DUPLICATE KEY UPDATE id=id;
我们对这种数据源的配置方式并不陌生,但考虑到此应用是要部署到Cloud Foundry上运行的,就不免产生疑惑:数据源配置为开发者本地的Mysql数据库,数据库名字、username和password也都是自己定义的,Cloud Foundry如何能识别呢?这就不得不提Cloud Foundry的一项功能:自动重配置 auto-reconfiguration。

Cloud Foundry的自动重配置

Cloud Foundry支持对Spring应用的自动重配置。该功能允许开发者在自己本地开发环境中开发并测试Spring应用,无需做任何改动而直接将其部署到Cloud Foundry上,由后者自动完成本地配置的迁移。具体来说,当你的Spring应用需要使用某项服务(如这里的Mysql数据库)时,你完全可以将相关的Bean定义为自己本地环境中的对象,当原封不动部署到Cloud Foundry上时,Cloud Foundry会自动检测所调用的服务类型并修改这些Bean的定义(如这里dataSource的url、username、password等属性),使应用程序与自己内部的云服务实例绑定。(点击此处学习更多)

这就是为什么在root-context.xml中定义了一个本地数据源也可以在Cloud Foundry上正常运行。

Controller

看完了Spring配置文件,剩下的controller就很简单了。“java/org/cloudfoundry/samples“目录下的HomeController.java文件中定义了控制类HomeController

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

	@Inject
	private ReferenceDataRepository referenceRepository;
	
	@RequestMapping(value="/", method=RequestMethod.GET)
	public String home(Model model) {
		logger.info("Welcome home!");
		model.addAttribute("dbinfo", referenceRepository.getDbInfo());
		model.addAttribute("states", referenceRepository.findAll());
		return "home";
	}

}
该类持有一个 ReferenceDataRepository类对象的引用,用于进行数据库相关的操作。当应用程序接收到用户请求后调用home方法进行处理,通过该引用对象获得数据源的url属性,并查询数据库得到所有记录(由之前db-schema.sql脚本所创建),将结果放入home.jsp页面返回。

运行应用

使用VMC将应用程序部署到Cloud Foundry。(注意部署时需要绑定mysql服务)

访问应用部署url,看到如下页面:


可以看到,Database Info下所显示的数据源url并非在配置文件中所定义的 127.0.0.1:3306/test,而是Cloud Foundry环境(我的dev_setup)地址。这也验证了自动重配置的发生。

总结

本样例程序演示了如何开发一个能部署到Cloud Foundry上的、使用了Mysql数据库的Java Spring应用。Cloud Foundry的自动重配置机制允许开发者在本地环境开发Spring应用并使用本地服务,然后不做任何改动地部署。部署之后的应用程序,使用的是Cloud Foundry内部提供的同类型服务。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值