【问题标题】:Any open source Spring sample project that's bigger than PetClinic? [closed]任何比 PetClinic 更大的开源 Spring 示例项目? [关闭]
【发布时间】:2011-02-05 23:22:28
【问题描述】:

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

【问题讨论】:

    标签: spring open-source spring-mvc


    【解决方案1】:

    部分候选人:

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

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

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

    • Tudu Lists - Tudu Lists 是一个用于管理待办事项列表的 J2EE 应用程序。它基于 JDK 5.0、Spring、Hibernate 和 AJAX 接口(使用 DWR 框架)。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 我给你投票 (+1) 只是因为你对基于 Spring 的项目进行了非常好的谷歌搜索。
      • 这个已编译的列表是从我的笔记中复制粘贴的,我保留作为参考
      【解决方案3】:

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

      骨架 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 中运行约定优于配置所需的关键。如何 ???靠ControllerClassNameHandlerMapping

      WEB-INF/ar-servlet.xml 注意 basePackage 属性,这意味着在 br.com.ar.view 下查找任何 @Controller 类em> 包。此属性允许您构建模块化的@Controller

      <!--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 将删除 上下文路径和文件扩展名之间的路径 - 上面突出显示。让我们读取提取的路径从右到左

      • form 方法名
      • 帐户不合格的类名没有控制器后缀
      • moduleA 包,将被添加basePackage 属性

      翻译成

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

      好的。但是 Spring 怎么知道要显示哪个视图???见here

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

      首先,请参阅here 我们如何实现存储库。 请注意,每个相关的模块查询都存储在其相关的存储库包中。见上面的骨架。这里显示 ar-persistence.xml 注意 ma​​ppingLocationspackagesToScan 属性

      <?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。

      事务管理和组件扫描 ar-service.xml 注意aop:pointcut的表达式属性br.com.ar后面的两个点意思是

      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>
      

      测试

      要测试带注释的@Controller 方法,请参阅here 如何

      网页层除外。请注意我如何在 @Before 方法中配置 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);
          }
      
      }
      

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

      @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 参考文档。据我所知,仅在 Spring 3.0 中支持 mvc 模式。记住这一点

      【讨论】:

      • 这正是我想要的。解释得很好,尤其是。配置部分的约定。
      【解决方案4】:

      看看Apache CXF。它使用 Spring。

      【讨论】:

      • 感谢您的及时回复。我会看看它。但是,我认为它更像是一个构建在 Spring 之上的框架,我真正喜欢看到的是一些基于 Spring 构建的多层 Web 应用程序。
      • 我无法在 webapps 方面为您提供帮助。 CXF有很多Spring应用上下文配置的例子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多