任何比PetClinic大的开源Spring示例项目?

我已经读完了spring文档和PetClinic示例项目。 就像看到一个更大的现实世界项目是用Spring完成的。 谢谢。

spring来源项目

力石战士

Tudu列表

露天内容pipe理

SpringSide的

PLAZMA

agileexpress

Zksample2

富客户端

阔叶商业

OpenERP的

HISPACTA

Luigi打开search引擎

JOSSO

HSE

Java小型企业平台

jrecruiter

我在一家大型医疗保险公司工作,我们在后台大量使用Spring。 我将向您展示如何构build模块化应用程序。

没有classes目录的骨架 WEB-INF

ar WEB-INF web.xml /** * Spring related settings file */ ar-servlet.xml web moduleA account form.jsp moduleB order form.jsp 

骨架 目录

  classes /** * Spring related settings file */ ar-persistence.xml ar-security.xml ar-service.xml messages.properties br com ar web moduleA AccountController.class moduleB OrderController.class br com ar moduleA model domain Account.class repository moduleA.hbm.xml service br com ar moduleB model domain Order.class repository moduleB.hbm.xml service ... 

注意br.com.ar.web下的每个包如何匹配 WEB-INF / view目录。 这是在Spring MVC中运行convention-over-configuration所需的关键。 如何 ??? 依赖于ControllerClassNameHandlerMapping

WEB-INF / ar-servlet.xml注意basePackage属性意味着查找br.com.ar.view包下的任何@Controller类。 这个属性允许你build立模块化的@控制器

 <!--Scans the classpath for annotated components at br.com.ar.web package--> <context:component-scan base-package="br.com.ar.web"/> <!--registers the HandlerMapping and HandlerAdapter required to dispatch requests to your @Controllers--> <mvc:annotation-driven/> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> <property name="basePackage" value="br.com.ar.web"/> <property name="caseSensitive" value="true"/> <property name="defaultHandler"> <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/> </property> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/view/"/> <property name="suffix" value=".jsp"/> </bean> 

现在让我们来看看,例如,AccountController

 package br.com.ar.web; @Controller public class AccountController { @Qualifier("categoryRepository") private @Autowired Repository<Category, Category, Integer> categoryRepository; @Qualifier("accountRepository") private @Autowired Repository<Account, Accout, Integer> accountRepository; /** * mapped To /account/form */ @RequestMapping(method=RequesMethod.GET) public void form(Model model) { model.add(categoryRepository().getCategoryList()); } /** * mapped To account/form */ @RequestMapping(method=RequesMethod.POST) public void form(Account account, Errors errors) { accountRepository.add(account); } } 

它是如何工作的 ???

假设你提出了http://127.0.0.1:8080/ar/ moduleA / account / form.html的请求

Spring会删除上下文path和文件扩展名之间的path。 让我们从右侧读取提取的path

  • 表单方法名称
  • 帐户控制器后缀的非限定类名
  • moduleA 将被添加basePackage属性的包

这被翻译成

 br.com.ar.web.moduleA.AccountController.form 

好。 但是,Spring如何知道显示哪个视图? 看到这里

而关于持久性相关的问题?

首先,看看我们如何实现仓库。 注意,每个相关的模块查询都存储在其相关的资源库包中 。 见上面的骨架。 这里显示的是ar-persistence.xml注意mappingLocationspackagesToScan属性

 <?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd"> <jee:jndi-lookup id="dataSource" jndi-name="jdbc/dataSource" resource-ref="true"> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mappingLocations"> <util:list> <value>classpath:br/com/ar/model/repository/hql.moduleA.hbm.xml</value> <value>classpath:br/com/ar/model/repository/hql.moduleB.hbm.xml</value> </util:list> </property> <property name="packagesToScan"> <util:list> <value>br.com.ar.moduleA.model.domain</value> <value>br.com.ar.moduleB.model.domain</value> </util:list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop> <prop key="hibernate.connection.charSet">UTF-8</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.validator.autoregister_listeners">false</prop> </props> </property> </bean> </beans> 

注意我正在使用Hibernate。 JPA应该正确configuration。

事务pipe理和组件扫描 ar-service.xml注意在aop中的br.com.ar之后的两个点 :表示切入点的expression式属性

br.com.ar包下的任何包和子包

 <?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:component-scan base-package="br.com.ar.model"> <!--Transaction manager - It takes care of calling begin and commit in the underlying resource - here a Hibernate Transaction --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <tx:advice id="repositoryTransactionManagementAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add" propagation="REQUIRED"/> <tx:method name="remove" propagation="REQUIRED"/> <tx:method name="update" propagation="REQUIRED"/> <tx:method name="find*" propagation="SUPPORTS"/> </tx:attributes> </tx:advice> <tx:advice id="serviceTransactionManagementAdvice" transaction-manager="transactionManager"> <!--Any method - * - in service layer should have an active Transaction - REQUIRED - --> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="servicePointcut" expression="execution(* br.com.ar..service.*Service.*(..))"/> <aop:pointcut id="repositoryPointcut" expression="execution(* br.com.ar..repository.*Repository.*(..))"/> <aop:advisor advice-ref="serviceTransactionManagementAdvice" pointcut-ref="servicePointcut"/> <aop:advisor advice-ref="repositoryTransactionManagementAdvice" pointcut-ref="repositoryPointcut"/> </aop:config> <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> </beans> 

testing

要testing带注释的@Controller方法,请看这里如何

除了web层。 注意我是如何在@Before方法中configuration一个JNDI数据源的

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:ar-service.xml", "classpath:ar-persistence.xml"}) public class AccountRepositoryIntegrationTest { @Autowired @Qualifier("accountRepository") private Repository<Account, Account, Integer> repository; private Integer id; @Before public void setUp() { SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder(); DataSource ds = new SimpleDriverDataSource(new oracle.jdbc.driver.OracleDriver(), "jdbc:oracle:thin:@127.0.0.1:1521:ar", "#$%#", "#$%#"); builder.bind("/jdbc/dataSource", ds); builder.activate(); /** * Save an Account and set up id field */ } @Test public void assertSavedAccount() { Account account = repository.findById(id); assertNotNull(account); } } 

如果您需要一套testing,请执行以下操作

 @RunWith(Suite.class) @Suite.SuiteClasses(value={AccountRepositoryIntegrationTest.class}) public void ModuleASuiteTest {} 

web.xml显示如下

 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:ar-persistence.xml classpath:ar-service.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>ar</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ar</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> <resource-ref> <description>datasource</description> <res-ref-name>jdbc/dataSource</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app> 

我希望它可以是有用的。 更新模式到Spring 3.0。 请参阅Spring参考文档。 mvc模式,据我所知,仅在Spring 3.0中受支持。 记住这一点

一些候选人:

  • spring的PetStore

  • AppFuse – 在AppFuse中,Spring框架一直用于Hibernate / iBATIS支持,声明式事务,依赖绑定和层解耦。

  • Equinox (又名AppFuse Light) – 作为Spring Live的一部分创build的一个简单的CRUD应用程序。

  • Spring by Example – 各种Spring示例以及一些可下载的库。

  • Tudu列表 – Tudu列表是pipe理待办事项列表的J2EE应用程序。 它基于JDK 5.0,Spring,Hibernate和AJAX接口(使用DWR框架)。

  • 弹簧的PetStore

看看Apache CXF 。 它使用Spring。