이전 섹션에서 "SSH 프레임 워크 온라인 쇼핑몰 프로젝트의 첫 번째 전투 : Struts2, Hibernate4.3 및 Spring4.2의 통합"에서 Struts2, Hibernate 및 Spring의 개발 환경을 구축하여 성공적으로 통합했습니다. 이 섹션에서는 주로 서비스, DAO 및 조치 추출뿐만 아니라 몇 가지 기본 추가, 삭제, 수정 및 검색을 완료합니다.
1. 서비스 계층의 추출
이전 섹션에서는 서비스 계층에 저장 및 업데이트 메소드를 작성했습니다. 여기서 우리는이 부분의 코드를 개선 한 다음 서비스 계층에서 코드를 추출하기 시작합니다.
1.1 카테고리 서비스 계층을 향상시킵니다
데이터베이스의 작동은 추가, 삭제, 수정 및 확인에 지나지 않습니다. 먼저 카테고리 서비스 계층의 인터페이스 및 구현을 향상시켜 봅시다.
// CategoryService 인터페이스 공용 인터페이스 범주를 확장하여 BaseService <범주> {public void save (category category); // 공개 void 업데이트 삽입 (범주 범주); // 공개 void delete (int id) 업데이트; // 공개 범주 삭제 get (int id); // 카테고리 공개 목록을 가져옵니다 <범주> Query (); // 모든 카테고리 얻기} 카테고리 서비스 인터페이스의 특정 구현 :
공개 클래스 카테고리 viceimpl은 baseServiceimpl <category>를 구현하는 범주를 구현합니다. // Spring은 공개 void setsesssessionFactory (sessionFactory sessionFactory) {this.sessionFactory = sessionFactory; } protected session getsession () {// 현재 스레드에서 세션을 가져옵니다. 그렇지 않은 경우 새 세션 return sessionfactory.getCurrentSession ()을 만듭니다. } @override public void save (category category) {getsession (). save (category); } @override public void update (카테고리 카테고리) {getsession (). 업데이트 (카테고리); } @override public void delete (int id) { /*첫 번째 메소드에는 단점이 있습니다. 즉, 삭제하기 전에 한 번 쿼리해야합니다. Object obj = getsession (). get (category.class, id); if (obj! = null) {getsession (). delete (obj); }*/ string hql = "id = : id"라는 범주 삭제; getSession (). Createquery (HQL) // .setInteger ( "id", id) // .ExecuteUpdate (); } @override public category get (int id) {return (category) getsession (). get (category.class, id); } @override public list <Cat return getsession (). Createquery (HQL) .list (); }} 1.2 서비스 계층 추출 구현
카테고리 서비스를 완료하면 서비스 계층의 기본 구현을 추출합니다. 아이디어는 다음과 같습니다. 우리는 기본 인터페이스베이스 서비스와 BaseServiceimpl을 추출합니다. 나중에 개발할 때 새로운 서비스가 필요한 경우 두 단계 만 수행하면됩니다. 먼저 새 인터페이스 xxxservice를 정의하여 기본 서비스 인터페이스를 상속 하여이 인터페이스에 새 추상 방법을 추가 할 수 있습니다. 그런 다음 새 구현 클래스 xxxserviceimpl은 baseServiceimpl을 상속하고 XXXService 인터페이스를 구현합니다. 이를 통해 프로젝트를 더 쉽게 유지할 수 있습니다.
먼저 위의 카테고리 서비스 인터페이스를 기반으로 BaseService 인터페이스를 작성하겠습니다.
// 기본 인터페이스 BASESERVICE, 일반 공개 인터페이스 BASESERVICE <T> {public void save (t t); 공개 무효 업데이트 (t t); 공개 void delete (int id); 공개 t get (int id); 공개 목록 <T> Query (); } 그런 다음 CategoryServiceImpl 구현 클래스에 따라 BaseService 인터페이스 구현 클래스 BaseServiceImpl을 만듭니다.
/ ** * @description todo (공공 모듈의 추출) * @author eson_15 * */ @suppresswarnings ( "확인되지 않은") public class baseeserviceimpl <t>는 baseService <t> {개인 클래스 클라 그를; // 현재 작동의 유형은 클레이크에 저장됩니다. Public BaseServiceimpl () {// 다음 세 가지 인쇄 정보를 제거 할 수 있습니다. 다음은 system.out.println입니다 ( "이것은 현재 생성자라고하는 객체를 나타냅니다" + this); System.out.println ( "현재 객체의 부모 클래스 정보를 가져옵니다." + this.getClass (). getSuperClass ()); System.out.println ( "현재 객체의 부모 클래스 정보를 받기 (일반 정보 포함)" + this.getClass (). getGenericSuperClass ()); // 일반 매개 변수 유형의 매개 변수 유형을 가져옵니다. Clazz = (class) type.getActualTyPearguments () [0]; } public void setsessionSessionFactory (SessionFactory SessionFactory) {this.sessionFactory = SessionFactory; } protected session getsession () {// 현재 스레드에서 세션을 가져옵니다. 그렇지 않은 경우 새 세션 return sessionfactory.getCurrentSession ()을 만듭니다. } @override public void save (t t) {getsession (). 저장 (t); } @override public void update (t t) {getsession (). update (t); } @override public void delete (int id) {system.out.println (clazz.getSimplename ()); 문자열 HQL = "delete" + clazz.getSimplename () + "as c.id = : id"; getSession (). Createquery (HQL) // .setInteger ( "id", id) // .ExecuteUpdate (); } @override public t get (int id) {return (t) getsession (). get (clazz, id); } @override public list <t> query () {string hql = "from" + clazz.getSimplename (); return getsession (). Createquery (HQL) .list (); }} 추출이 완료되면 CategoryService 인터페이스 및 CategoryServiceImpl 구현 클래스를 다시 작성할 수 있습니다. 다음과 같이 :
// CategoryService Interface는 BaseService 인터페이스 공개 인터페이스 범주를 상속받습니다. 기본 서비스 <범주> { / * * CategoryService 자체에 필요한 새로운 방법을 추가하십시오. 공개 메소드는 이미 baseService * /} / ** * @description todo (모듈 자체의 비즈니스 로직) * @author eson_15 * * / public clatesoryserviceimpl을 확장합니다. 공개 방법은 BaseServiceimpl */}에서 구현되었습니다. 코드에서 볼 수 있듯이 새로 추가 된 서비스는 BaseService 인터페이스를 상속 한 다음 서비스에 필요한 비즈니스 로직을 인터페이스에 추가하면됩니다. 새로 추가 된 ServiceMPL은 BaseServiceImpl을 상속하고 새로 추가 된 비즈니스 논리를 구현하면됩니다.
그러나 중요한 점을 잊지 마십시오. Spring의 구성 파일 Beans.xml에서 Bean을 수정하는 것입니다.
<!-제네릭 클래스는 인스턴스화 할 수 없으므로 Lazy-Init 속성을 추가 할 수 없으므로-> <bean id = "baseService"lazy-init = "true"> <property name = "sessionFactory"ref = "sessionFactory"/> </bean> <bean id = "CategoryService"parent = "BaseService"/>
원래 카테고리 서비스에서 속성을 죽인 다음 부모 속성을 추가하여 BaseService의 상속을 나타냅니다. 그런 다음 BaseService를 구성하고 SessionFactory를 BaseService에 구성하십시오. 또한 주목할만한 점 : BaseService는 일반적인 클래스이고 일반적인 클래스를 인스턴스화 할 수 없기 때문에 Lazy-Init 속성을 True로 설정하십시오. 이 시점에서 서비스 계층의 추출이 완료됩니다.
2. 서비스 계층에 계정을 추가하십시오
서비스 계층이 방금 추출되었으므로 이제 계정 서비스를 작성하는 것은 매우 간단합니다.
먼저 BaseService를 상속하기 위해 계정 서비스 인터페이스를 작성하십시오.
Public InterfaceService 확장 BaseService <계정> {// baseService의 제네릭은 이제 계정입니다. 그런 다음 계정 erviceimpl 구현 클래스를 작성하여 BaseServiceImpl 구현 클래스를 상속하고 계정 서비스 인터페이스를 구현하십시오.
공개 클래스 계정 erviceimpl은 baseServiceImpl <cound>를 확장하여 계정 서비스 { / * * 계정 서비스 인터페이스에서 새로 추가 된 메소드를 구현합니다. 공개 방법은 BaseServiceimpl */////로그인 기능 관리에서 구현되었으며 나중에 개선됩니다} 마지막으로 Beans.xml 파일에 다음 구성을 추가하십시오.
<bean id = "accountservice"parent = "baseService" />
이런 식으로 새로운 서비스가 작성되었습니다. 향후 서비스를 추가 해야하는 경우이 프로세스를 따라갈 것입니다. 이는 매우 편리합니다.
3. 행동 추출
3.1 도메인의 작업에 데이터 저장 (요청, 세션, 응용 프로그램 등)
실제로 ActionContext.getContext ()를 통해 ActionContext 객체를 직접 얻은 다음 객체를 통해 해당 도메인 객체를 얻을 수 있음을 알고 있습니다. xxxaware 인터페이스를 구현하여 해당 도메인 객체를 주입 할 수도 있습니다. 이 두 가지 방법을 먼저 살펴 보겠습니다.
공개 클래스 카테고리 actionAction은 ActionSupport Ampess RequestAware, SessionAware, ApplicationAware {개인 카테고리 범주; 개인 카테고리 서비스 카테고리 서비스; public void setCategoryService (CategoryService CategoryService) {this.categoryService = CategoryService; } public String update () {System.out.println ( "---- 업데이트 ----"); CategoryService.update (카테고리); "색인"을 반환합니다. } public String save () {system.out.println ( "---- 저장 ----"); "색인"을 반환합니다. } public String query () {// Solution 1, 해당 맵을 사용하여 원래 내장 객체를 대체하여 JSP에 종속성이 없지만 코드의 양은 비교적 큽니다. // 요청 필드에 넣습니다. // actionContext.getContext (). getSession (). put ( "CategoryList", CategoryService.query ()); // 세션 필드에 넣습니다. // actionContext.getContext (). getApplication (). put ( "categoryService.query ()); // 응용 프로그램 도메인에 넣고 Solution 2에 해당 인터페이스 (requestaware, SessionAware, ApplicationAware)를 구현 한 다음 해당 맵이 요청을 주입하십시오. session.put ( "CategoryList", CategoryService.query ()); application.put ( "CategoryList", CategoryService.query ()); "색인"을 반환합니다. } 공개 범주 getCategory () {return 카테고리; } public void setCategory (범주 범주) {this.category = 범주; } 개인지도 <문자열, 개체> 요청; 개인지도 <문자열, 객체> 세션; 개인지도 <문자열, 객체> 응용 프로그램; @override public void setApplication (map <string, object> application) {this.application = application; } @override public void setsession (map <string, object> session) {this.session = session; } @override public void setRequest (map <string, object> request) {this.request = request; }} 이전 섹션의 세 가지 주요 프레임 워크를 통합하는 것은 여전히 범주 작용 클래스입니다. 이 방법에 쿼리 메소드를 추가했습니다. 이 방법에서는 쿼리 결과를 요청 도메인, 세션 도메인 및 응용 프로그램 도메인에 저장합니다. 첫 번째 방법은 ActionContext를 직접 사용하여 구현하는 것입니다. 인터페이스가 필요하지 않지만 코드는 크다. 두 번째 방법은 Requestaware, SessionAware 및 ApplicationAware 인터페이스를 구현하고 인터페이스 주입 요청, 세션 및 응용 프로그램을 구현 한 다음 해당 멤버 변수에 할당하여 쿼리 결과를 쿼리 방법의 도메인에 저장할 수 있도록합니다. 이 코드 볼륨은 첫 번째 방법보다 큰 것 같습니다. 그러나 우리는 그것을 추출하여 먼저 읽을 수 있습니다.
쿼리 결과를 표시 할 수 있는지 테스트하기 위해 Index.jsp에 새 쿼리 연결을 추가합니다.
<%@ page language = "java"import = "java.util.*"pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core"prefix = "c"%> <! arttype html public "-//01. <html> <head> <title> my jsp 'index.jsp'시작 페이지 </title> </head> <bod> <a href = "$ {pageconText.Request.ContextPath} /category_update.action?category.id=2&category.type=gga&category.hot=false"> Access=False "> href = "category_save.action"> 액세스 저장 </a> <a href = "car $ {category.type} | $ {category.hot} <br/> </c : foreach> <c : foreach items = "$ {sessionscope.categoryList}"var = "category"> $ {category.id} | $ {category.type} | $ {category.hot} <br/> </c : foreach> <c : foreach items = "$ {applicationscope.categoryList}"var = "category"> $ {category.id} | $ {category.type} | $ {category.hot} <br/> </c : foreach> </body> </html> 3.2 추출물 배지
지금 당장 언급했듯이 두 번째 방법은 코드 볼륨이 더 큽니다. 그러나 이러한 도메인과 관련된 작업을 구체적으로 처리하기 위해 Baseection을 추출 할 수 있습니다.
공개 클래스 Baseaction은 ActionSupport Ampess RequestAware, SessionAware, ApplicationAware {Protected Map <String, Object> Request; 보호 맵 <문자열, 객체> 세션; 보호 된 맵 <문자열, 객체> 응용 프로그램; @override public void setApplication (map <string, object> application) {this.application = application; } @override public void setsession (map <string, object> session) {this.session = session; } @override public void setRequest (map <string, object> request) {this.request = request; }} 그런 다음 우리 자신의 조치가 이러한 도메인 객체를 사용하여 데이터를 저장 해야하는 경우 Baseection을 직접 상속받을 수 있으며 요청, 세션 및 응용 프로그램 개체를 직접 사용할 수 있습니다. 따라서 수정 된 범주 작용은 다음과 같습니다.
공개 클래스 카테고리 actionAction은 Baseection {private category category; <pre name = "code"> private categoryService categoryService; public void setCategoryService (CategoryService CategoryService) {this.categoryService = CategoryService; } public String update () {System.out.println ( "--- update ----"); CategoryService.update (Category); "색인"을 반환합니다. } public String save () {system.out.println ( "---- 저장 -----"); return "index"; } public string query () {request.put ( "CategoryList", CategoryService.query ()); session.put ( "CategoryList", CategoryService.query ()); application.put ( "CategoryList", CategoryService.query ()); "색인"을 반환합니다. } 공개 범주 getCategory () {return 카테고리; } public void setCategory (범주 범주) {this.category = 범주; }} 요청, 세션 및 애플리케이션 필드를 사용해야하는 모든 작업은 직접 상속되어 매우 편리합니다.
3.3 매개 변수 가져 오기 (ModelDriven)
위의 범주 작용 클래스를 계속 살펴 보겠습니다. 멤버 변수 카테고리가 있으며,이 카테고리는 Pojo입니다. 이 변수를 정의하고 세트를 작성하고 Get 메소드를 작성하는 것은 JSP 페이지를 URL에 첨부 한 매개 변수를 통해 전달되는 것입니다. 매개 변수는 ID, 유형 등과 같은 카테고리 객체의 속성이지만 URL의 매개 변수는 Category.Id, Category.Type 등으로 작성되어야합니다. 이러한 방식으로 Struts는이 쓰기 매개 변수를 카테고리 객체에 자동으로 주입하면이 범주 객체를 직접 사용할 수 있습니다. ModelDriven을 사용하여 문제를보다 쉽게 해결할 수 있습니다.
공개 클래스 카테고리 션은 BASEEACTION PELMENTS MODELDREVEN <카테고리> {개인 카테고리 범주; // ModelDriven 인터페이스를 사용하여 getModel () 메소드를 구현해야합니다. 이 메소드는 반환 된 항목을 스택 @override public category getModel () {category = new Category ()의 상단으로 푸시합니다. 반환 카테고리; } <pre name = "code"> private categoryService categoryService; public void setCategoryService (CategoryService CategoryService) {this.categoryService = CategoryService; } public String update () {System.out.println ( "---- 업데이트 ----"); CategoryService.update (카테고리); "색인"을 반환합니다. } public String save () {system.out.println ( "---- 저장 ----"); "색인"을 반환합니다. } public string query () {request.put ( "CategoryList", CategoryService.query ()); session.put ( "CategoryList", CategoryService.query ()); application.put ( "CategoryList", CategoryService.query ()); "색인"을 반환합니다. }} 이런 식으로, 우리는 프론트 데스크 JSP 페이지에 category.id와 같은 지루한 매개 변수를 포함 할 필요가 없습니다. JSP 페이지의 ModelDriven 부분을보십시오.
<%@ page language = "java"import = "java.util.*"pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core"prefix = "c"%> <! arttype html public "-//01. <html> <head> <title> my jsp 'index.jsp'시작 페이지 </title> </head> <bod> <a href = "$ {pageconText.Request.ContextPath} /category_update.action?category.id=2&category.type=gga&category.hot=false"> Access=False "> href = "category_save.action? id = 1 & type = haha & hot = true = true"> test modeldriven </a> <a href = "car $ {category.type} | $ {category.hot} <br/> </c : foreach> <c : foreach items = "$ {sessionscope.categoryList}"var = "category"> $ {category.id} | $ {category.type} | $ {category.hot} <br/> </c : foreach> <c : foreach items = "$ {applicationscope.categoryList}"var = "category"> $ {category.id} | $ {category.type} | $ {category.hot} <br/> </c : foreach> </body> </html> 테스트 결과는 Catgory를 얻을 수 있고 모든 ID, 유형 및 핫 속성이 잘 지정됩니다. ModelDriven 인터페이스를 구현함으로써 URL에서 매개 변수를 쉽게 전달할 수 있음을 알 수 있습니다. 실제로, 우리는 getModel 메소드를 구현하고 사용할 새 개체를 반환하면됩니다. 이 시점에서, 스트럿에는 얻어야하는 많은 모델이있을 것이라고 생각하기가 쉽기 때문에이 부분을 배출로 추출해야합니다.
3.4 추출 모델은 바지 반응으로 추출됩니다
먼저 다음과 같이 모델 드라이브 파트의 코드를 Baseection에 추가합니다.
// ModelDriven이 필요한 여러 모델이 있으므로 일반적인 공개 클래스 BASEECIP <T> 확장 ActionSupport empless requestAware, SessionAware, ApplicationAware, ModelDriven <t> {Protected Map <String, Object> Request; 보호 맵 <문자열, 객체> 세션; 보호 된 맵 <문자열, 객체> 응용 프로그램; 보호 된 T 모델; @override public void setApplication (map <string, object> application) {this.application = application; } @override public void setsession (map <string, object> session) {this.session = session; } @override public void setRequest (map <string, object> request) {this.request = request; } @override public t getModel () {// 여기, 새로운 A는 전달 된 t를 구문 분석하여 해당 인스턴스를 새로 잡아. 클래스 Clazz = (class) type.getActualTyPearguments () [0]; try {model = (t) clazz.newinstance (); } catch (예외 e) {throw new runtimeexception (e); } 반환 모델; }} 추출 후 카테고리 action의 코드가 감소하고 감소합니다.
// BASEEATION을 상속하고 일반적인 공개 클래스 카테고리 actionAction은 BASEEACTION <카테고리> {private categoryService categoryService; public void setCategoryService (CategoryService CategoryService) {this.categoryService = CategoryService; } public String update () {System.out.println ( "---- 업데이트 ----"); CategoryService.update (Model); // 모델 사용 "index"를 직접 반환합니다. } public String save () {system.out.println ( "---- 저장 ----"); System.out.println (모델); // 모델을 직접 사용하여 "색인"을 반환합니다. } public string query () {request.put ( "CategoryList", CategoryService.query ()); session.put ( "CategoryList", CategoryService.query ()); application.put ( "CategoryList", CategoryService.query ()); "색인"을 반환합니다. }} 이 시점에서, 그것에 대해 기분이 좋지 않은 또 다른 것이 있습니다. 이것은 항상 카테고리에 존재하는 멤버 변수 카테고리 서비스 서비스입니다. CategoryAction은 CategoryService 객체에서 메소드를 사용하기 때문에이 객체를 만들어야하고 설정 방법을 주입 할 수 있습니다. 이로 인해 불리한 점이 발생합니다. 많은 작업이 범주 서비스를 사용해야하는 경우 객체 및 세트 방법을 동작에서 생성해야합니다. 또한, 여러 가지 다른 서비스 객체가 작업에 사용되면 모두 생성해야하며 이는 매우 복잡해집니다.
3.5 배지 서비스 추출
위의 문제에 대한 응답으로 프로젝트의 모든 서비스 객체를 Baseection으로 추출하여이를 생성합니다. 이런 식으로, 다른 조치 후에는 Baseection을 상속 받으면 사용하려는 모든 서비스를 사용할 수 있습니다.
// BASEECTION 공개 클래스 BASEECIPT <T> actionSupport empless requestAware, SessionAware, ApplicationAware, ModelDriven <t> {// 서비스 개체 보호 범주를 서비스 카테고리 서비스; 보호 된 계정 서비스 계정 서비스; public void setCategoryService (CategoryService CategoryService) {this.categoryService = CategoryService; } public void setAccountservice (accountservice) ac } // 도메인 객체 보호 된 맵 <String, Object> Request; 보호 맵 <문자열, 객체> 세션; 보호 된 맵 <문자열, 객체> 응용 프로그램; @override public void setApplication (map <string, object> application) {this.application = application; } @override public void setsession (map <string, object> session) {this.session = session; } @override public void setRequest (map <string, object> request) {this.request = request; } // ModelDriven Protected T 모델; @override public t getModel () {ParameterizedType type = (ParameterizedType) this.getClass (). getGenericSuperClass (); 클래스 Clazz = (class) type.getActualTyPearguments () [0]; try {model = (t) clazz.newinstance (); } catch (예외 e) {throw new runtimeexception (e); } 반환 모델; }} 이것은 카테고리 action을보다 새롭게 만듭니다. 공개 클래스 카테고리 actionAction은 baseeaction <category> {public string update () {system.out.println ( "--- update ----"); CategoryService.update (모델); "색인"을 반환합니다. } public String save () {system.out.println ( "--- save ----"); System.out.println (모델); "색인"을 반환합니다. } public string query () {request.put ( "CategoryList", CategoryService.query ()); session.put ( "CategoryList", CategoryService.query ()); application.put ( "CategoryList", CategoryService.query ()); "색인"을 반환합니다. }} 어떤 사람들은 많은 서비스 객체가 바지에 주입되면 중복되지 않습니까? Baseection으로 쓰여지지 않더라도 스프링 컨테이너는이 객체를 만들 것이기 때문에 이것은 사실이 아닙니다. 반대로, 서비스 객체는 바지에 배치되며 다른 작업의 개발에 더 편리합니다. 또한, JSP가 Baseection을 요청하지 않기 때문에 Baseection을 struts.xml 파일에 할당 할 필요가 없습니다. 다른 조치가 상속하는 것입니다.
잊을 또 다른 사항 : Beans.xml에서 구성을 수정하는 것입니다.
<!-프로토 타입 유형 인 경우, 시작시가 아닌 경우-> <bean id = "baseeaction"scope = "프로토 타입"> <property name = "categoryService"ref = "categoryService"> </property name = "accountservice"ref = "ac
새 Baseeaction Bean을 추가하고 프로젝트의 모든 서비스 객체를 속성으로 일치시키고 원래 범주에서 속성을 제거하십시오.
앞으로 새로운 XXXAction을 작성하려면 Baseection을 직접 상속받을 수 있습니다. XXXAction에서 서비스를 사용하는 경우 직접 사용할 수 있습니다. Beans.xml 파일에 xxxaction에 해당하는 Bean을 추가하고 struts.xml 파일에서 점프를 구성하면됩니다.
4. XML을 주석으로 변경하십시오
우리는 프로젝트가 점점 커짐에 따라 Beans.xml에 점점 더 많은 구성이있을 것이며 많은 구성이 중복됨을 알 수 있습니다. 쉽게 개발하기 위해 XML의 구성을 주석으로 변경합니다. 먼저 beans.xml의 구성을 살펴 보겠습니다.
이것들은 우리가 환경을지고 추출했을 때 우리가 쓴 콩입니다. 이들은 주석으로 변환해야합니다. 조각으로 교체하겠습니다. 먼저 서비스 부품을 교체하십시오. 여기에는베이스 서비스, 카테고리 서비스 및 계정 서비스의 세 부분이 있습니다. 다음과 같이 교체하십시오.
그런 다음 Beans.xml에서 해당 부품을 죽입니다. 다음으로, 조치 부분, 주로 Baseeation, CategoryAction 및 AccountAction을 수정하고이를 다음과 같이 바꿉니다.
그런 다음 Beans.xml에서 작업 부품의 구성을 죽이고 Beans.xml 파일에 다음 구성을 추가하면 주석을 사용할 수 있습니다.
<context : component-scan base-package = "cn.it.shop .."/>
어떤 사람들은 주석을 사용할 때 왜 서비스와 행동이 다른가? @Service는 서비스에 사용되며 @Controller는 작업에 사용됩니까? 실제로, 그것은 쉽게 읽을 수 있도록 다른 콩 층과 구별하는 것만으로 동일합니다.
전체 프로젝트의 소스 코드 다운로드 주소 : //www.vevb.com/article/86099.htm
원본 주소 : http://blog.csdn.net/eson_15/article/details/51297698
위의 것은 SSH 프레임 워크 온라인 쇼핑몰 프로젝트의 두 번째 전투의 전체 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.