基于javaConfig的springDataJpa+dubbo+springMvc搭建(一)
来源:互联网 发布:java多线程上传 编辑:程序博客网 时间:2024/06/06 19:07
很遗憾dubbo的几个创始人好像不维护dubbo了,最近有些人更新到了2.8.4:http://code.taobao.org/p/dubbox/src/trunk/dubbox/
dubbo的官网:http://dubbo.io/
此maven项目分三个子模块:sdk,app和web.其中sdk主要放一些公共的文件,app和web都依赖sdk.
一.在sdk模块:声明一个接口
package org.exam.sdk.service;import org.exam.sdk.domain.User;/** * Created by xin on 15.12.27. */public interface UserService { User save(User user);}
二.在app模块:
1.实现这个接口(在这里不赘述spring data jpa的使用)
package org.exam.app.service;import com.alibaba.dubbo.config.annotation.Service;import org.exam.sdk.domain.User;import org.exam.app.repository.UserRepository;import org.exam.sdk.service.UserService;import org.springframework.beans.factory.annotation.Autowired;/** * Created by xin on 15.12.27. */@Servicepublic class UserServiceImpl implements UserService { @Autowired private UserRepository userRepository; @Override public User save(User user){ return userRepository.save(user); }}
2.写单元测试
package org.exam.app.service;import org.exam.app.config.AppConfig;import org.exam.sdk.base.ObjectId;import org.exam.sdk.domain.User;import org.exam.sdk.service.UserService;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.annotation.Rollback;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.support.AnnotationConfigContextLoader;import org.springframework.transaction.annotation.Transactional;/** * Created by xin on 2015/12/27. */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(loader=AnnotationConfigContextLoader.class,classes={AppConfig.class})@Transactional(transactionManager = "transactionManager")public class UserServiceTest { @Autowired private UserService userService; @Test @Rollback(false) public void testInitData(){ User user=new User(); user.setId(new ObjectId().toString()); user.setUsername("username"); user.setPassword("password"); user.setEnable(true); userService.save(user); }}
三.在web模块:
1.单元测试,看一下userService是否注入成功
package org.exam.web.service;import com.alibaba.dubbo.config.annotation.Reference;import org.exam.sdk.service.UserService;import org.exam.web.config.AppConfig;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/** * Created by xin on 2015/12/27. */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes={AppConfig.class})public class UserServiceTest { @Reference private UserService userService; @Test public void testSave(){ System.out.println("userService = " + userService); }}
2.在controller使用
package org.exam.web.controller;import com.alibaba.dubbo.config.annotation.Reference;import org.exam.sdk.domain.User;import org.exam.sdk.service.UserService;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("user")public class UserController { @Reference private UserService userService; @RequestMapping(value = "save") public String save(User user) { if (user.getId()==null){ user.setId(new Object().toString()); } userService.save(user); return "user/test"; }}
四.再看看最关键的配置:
1.app的主要配置
package org.exam.app.config;import com.alibaba.dubbo.config.ApplicationConfig;import com.alibaba.dubbo.config.RegistryConfig;import com.alibaba.dubbo.config.spring.AnnotationBean;import com.mchange.v2.c3p0.ComboPooledDataSource;import org.springframework.context.EnvironmentAware;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.core.env.Environment;import org.springframework.data.jpa.repository.config.EnableJpaRepositories;import org.springframework.orm.jpa.JpaTransactionManager;import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;import org.springframework.orm.jpa.vendor.Database;import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;import org.springframework.transaction.PlatformTransactionManager;import org.springframework.transaction.annotation.EnableTransactionManagement;import javax.sql.DataSource;import java.beans.PropertyVetoException;/** * Created by xin on 15.12.27. */@Configuration@PropertySource("classpath:config.properties")@EnableTransactionManagement@EnableJpaRepositories(basePackages = {"org.exam.app.repository"})public class AppConfig implements EnvironmentAware { private Environment env; @Override public void setEnvironment(Environment environment) { env = environment; } /*与<dubbo:annotation/>相当.提供方扫描带有@com.alibaba.dubbo.config.annotation.Service的注解类*/ @Bean public static AnnotationBean annotationBean() { AnnotationBean annotationBean = new AnnotationBean(); annotationBean.setPackage("org.exam.app.service");//所以含有@com.alibaba.dubbo.config.annotation.Service的注解类都应在此包中,多个包名可以使用英文逗号分隔. return annotationBean; } /*与<dubbo:application/>相当.*/ @Bean public ApplicationConfig applicationConfig() { ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setLogger("slf4j"); applicationConfig.setName(env.getProperty("dubbo.applicationName")); return applicationConfig; } /*与<dubbo:registry/>相当*/ @Bean public RegistryConfig registryConfig() { RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setAddress(env.getProperty("dubbo.registryAddress")); return registryConfig; } /*与<dubbo:protocol/>相当*/ @Bean public ProtocolConfig protocolConfig(){ ProtocolConfig protocolConfig=new ProtocolConfig("dubbo",20880); protocolConfig.setSerialization("java");//默认为hessian2,但不支持无参构造函数类,而这种方式的效率很低 return protocolConfig; } @Bean(destroyMethod = "close") public DataSource dataSource() { ComboPooledDataSource dataSource = new ComboPooledDataSource(); try { dataSource.setDriverClass(env.getProperty("db.driverClass")); } catch (PropertyVetoException e) { e.printStackTrace(); } dataSource.setJdbcUrl(env.getProperty("db.jdbcUrl")); dataSource.setUser(env.getProperty("db.user")); dataSource.setPassword(env.getProperty("db.password")); dataSource.setInitialPoolSize(Integer.valueOf(env.getProperty("db.initialPoolSize"))); dataSource.setAcquireIncrement(Integer.valueOf(env.getProperty("db.acquireIncrement"))); dataSource.setMinPoolSize(Integer.valueOf(env.getProperty("db.minPoolSize"))); dataSource.setMaxPoolSize(Integer.valueOf(env.getProperty("db.maxPoolSize"))); dataSource.setMaxIdleTime(Integer.valueOf(env.getProperty("db.maxIdleTime"))); dataSource.setIdleConnectionTestPeriod(Integer.valueOf(env.getProperty("db.idleConnectionTestPeriod"))); return dataSource; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); jpaVendorAdapter.setDatabase(Database.valueOf(env.getProperty("jpa.database"))); jpaVendorAdapter.setGenerateDdl(Boolean.parseBoolean(env.getProperty("jpa.generateDdl"))); jpaVendorAdapter.setShowSql(Boolean.parseBoolean(env.getProperty("jpa.showSql"))); LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); emf.setDataSource(dataSource()); emf.setPackagesToScan("org.exam.sdk.domain"); emf.setJpaVendorAdapter(jpaVendorAdapter); return emf; } @Bean public PlatformTransactionManager transactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); return transactionManager; }}
app模块的config.properties
#DATABASE STARTdb.driverClass=com.mysql.jdbc.Driverdb.jdbcUrl=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8db.user=rootdb.password=123456#db.driverClass=oracle.jdbc.driver.OracleDriver#db.jdbcUrl=jdbc:oracle:thin:@127.0.0.1:1521:orcl#db.user=ieco2o#db.password=ieco2odb.initialPoolSize=5db.acquireIncrement=3db.minPoolSize=3db.maxPoolSize=50db.maxIdleTime=60db.idleConnectionTestPeriod=120#DATABASE END#JPA STARTjpa.generateDdl=truejpa.showSql=true#DEFAULT,DB2,DERBY,H2,HSQL,INFORMIX,MYSQL,ORACLE,POSTGRESQL,SQL_SERVER,SYBASEjpa.database=MYSQL#JPA END#DUBBO STARTdubbo.applicationName=provider-mall-appdubbo.registryAddress=zookeeper://127.0.0.1:2181#DUBBO END
2.web的主要配置
package org.exam.web.config;import com.alibaba.dubbo.config.ApplicationConfig;import com.alibaba.dubbo.config.RegistryConfig;import com.alibaba.dubbo.config.spring.AnnotationBean;import org.springframework.context.EnvironmentAware;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.core.env.Environment;/** * Created by xin on 15/12/27. */@Configuration@PropertySource("classpath:config.properties")@ComponentScan(basePackages = "org.exam.web.controller")public class AppConfig implements EnvironmentAware { private Environment env; @Override public void setEnvironment(Environment environment) { env = environment; } /*与<dubbo:annotation/>相当.提供方扫描带有@com.alibaba.dubbo.config.annotation.Reference的注解类*/ @Bean public static AnnotationBean annotationBean() { AnnotationBean annotationBean = new AnnotationBean(); annotationBean.setPackage("org.exam.web.service,org.exam.web.controller"); return annotationBean; } /*与<dubbo:application/>相当.*/ @Bean public ApplicationConfig applicationConfig() { ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setLogger("slf4j"); applicationConfig.setName(env.getProperty("dubbo.applicationName")); return applicationConfig; } /*与<dubbo:registry/>相当*/ @Bean public RegistryConfig registryConfig() { RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setAddress(env.getProperty("dubbo.registryAddress")); return registryConfig; } /*与<dubbo:protocol/>相当*/ @Bean public ProtocolConfig protocolConfig(){ ProtocolConfig protocolConfig=new ProtocolConfig("dubbo",20880); protocolConfig.setSerialization("java");//默认为hessian2,但不支持无参构造函数类,而这种方式的效率很低 return protocolConfig; } /*dubbo end*/}
web模块的config.properties
#DUBBO STARTdubbo.applicationName=consumer-mall-webdubbo.registryAddress=zookeeper://127.0.0.1:2181#DUBBO END
五.其它不重要的,就省略,过行测试.先启动zookeeper(即使开发环境,注册中心也不使用广播,因为不稳定),再启动app的单元测试是否正常,再启动App,再启动web的单元测试是否正常,最后测试controller是否注入成功.
源码下载:http://download.csdn.net/detail/xiejx618/9383015
0 0
- 基于javaConfig的springDataJpa+dubbo+springMvc搭建(一)
- 基于javaConfig的springDataJpa+dubbo+springMvc搭建(二)
- 基于maven的spring+springMvc+MyBatis+Dubbo架构的搭建
- spring+springMVC+mybatis +dubbo架构的开发环境搭建(一)
- springmvc的javaconfig的配置
- 手把手教你从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate(含源码下载)
- 手把手教你从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate(含源码下载)
- zookeeper、dubbo整合搭建rpc(基于springMVC)
- dubbo起步搭建Spring+SpringMVC+dubbo的开发环境
- 搭建 maven+springmvc+dubbo
- dubbo+SpringMVC环境搭建
- SSH(进阶) SpringDataJPA + SpringMVC 快速搭建企业框架
- SpringMVC form表单中文乱码解决方案(基于JavaConfig)
- 基于dubbo + maven 的项目搭建
- 基于dubbo + maven 的项目搭建
- 基于dubbo + maven 的项目搭建
- Spring+SpringMVC+Springdatajpa+Freemarker
- dubbo学习(一)-dubbo基于SPI思想的实现
- idea 使用 问题
- box2d
- Linux Network
- 致敬:伤情迷茫的2015
- 自学Python之变量
- 基于javaConfig的springDataJpa+dubbo+springMvc搭建(一)
- JVM的垃圾回收
- java的流和编码
- 弱水三千,岂非本源?
- 定时任务 设置时间语法
- 258. Add Digits
- hibernate框架学习(关联关系)
- iso uinavigationcontrollerdemo2
- 最近5年133个Java面试问题列表