펫클리닉보다 더 큰 오픈소스 스프링 샘플 프로젝트가 있습니까?
스프링 서류와 펫클리닉 샘플 프로젝트를 다 읽었습니다.스프링과 함께 진행되는 더 큰 실제 프로젝트를 보는 것과 같습니다.감사해요.
저는 스프링을 백엔드로 많이 사용하는 대형 건강보험회사에서 일하고 있습니다.모듈화된 애플리케이션이 어떻게 구축되는지 보여드리겠습니다.
클래스 디렉터리가 없는 스켈레톤 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에서 컨벤션 오버 구성을 실행하는 데 필요한 핵심입니다.어떻게 하죠??의존 컨트롤러 클래스 이름핸들러 매핑
WEB-INF/ar-servlet.xml NoticebasePackage 속성은 br.com.ar .view package에서 @Controller 클래스를 찾습니다.이 속성을 통해 모듈화된 @Controller's를 구축할 수 있습니다.
<!--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.0.1:8080/ar/moduleA/account/form.html을 요청한다고 가정합니다.
스프링은 위에서 강조 표시한 컨텍스트 경로와 파일 확장명 사이의 경로를 제거합니다.오른쪽에서 왼쪽으로 추출된 경로를 읽어보겠습니다.
- 양식방법명
- 계정 컨트롤러 접미사가 없는 정규화되지 않은 클래스 이름
- modulebasePackage 속성에 추가될 패키지
번역하면 다음과 같습니다.
br.com.ar.web.moduleA.AccountController.form
좋아요. 하지만 스프링은 어떤 장면을 보여줘야 하는지 어떻게 알죠?여기를 보시오
그리고 지속성과 관련된 문제들에 대해서 ?
먼저, 저장소 구현 방법을 참조하십시오.각 관련 모듈 쿼리는 관련 저장소 패키지에 저장됩니다.위의 골격 참조.다음은 ar-persistence.xml Notice mapping 위치 및 패키지입니다.ToScan 속성
<?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 Notice br.com.ar 뒤에 있는 두 개의 점 aop:pointcut의 식 속성은 다음을 의미합니다.
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 메서드를 테스트하려면 여기를 참조하십시오.
웹 계층 이외의.@Before 메서드에서 JNDI dataSource를 구성하는 방법을 주목하십시오.
@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 참조 문서 참조. mvc 스키마는 Spring 3.0에서만 지원되는 것으로 알고 있습니다.참고하세요.
일부 후보:
AppFuse - AppFuse에서 스프링 프레임워크는 최대 절전 모드/iB에 사용됩니다.ATIS 지원, 선언 트랜잭션, 종속성 바인딩 및 계층 분리.
이쿼녹스(일명: Equinox)AppFuse Light) - Spring Live의 일부로 만들어진 간단한 CRUD 앱입니다.
Tudu Lists - Tudu Lists는 작업관리 목록을 관리하기 위한 J2EE 응용프로그램입니다.JDK 5.0, Spring, Hibernate 및 AJAX 인터페이스(DWR 프레임워크 사용)를 기반으로 합니다.
Apache CXF를 보십시오.스프링을 사용합니다.
언급URL : https://stackoverflow.com/questions/2604655/any-open-source-spring-sample-project-thats-bigger-than-petclinic
'programing' 카테고리의 다른 글
IE9에서 이진 데이터를 읽는 방법? (0) | 2023.09.13 |
---|---|
유연한 배열 부재로 구조를 초기화하는 방법 (0) | 2023.09.13 |
Android 응용 프로그램에서 텍스트 뷰의 첫 글자를 대문자로 쓰는 방법 (0) | 2023.09.13 |
ORDER BY 절을 사용하거나 사용하지 않는 파티션에 대한 분석 카운트 (0) | 2023.09.13 |
#로 재미있는 표기법 (0) | 2023.09.13 |