Spring 의 매력 을 음미 하 다

Spring 의 철학 은 자바 대상 의 디자인 에 영향 을 주지 않 고 자바 대상 을 프레임 에 넣 는 것 이다.EJB 의 프레임 워 크 는 침략 적(Invasive)방법 으로 대상 을 설계 하 는데 디자인 에 EJB 규범 에 맞 는 코드 를 넣 으 라 고 요구한다.일부 경량급 COP 프레임 워 크,예 를 들 어 Avalon 도 대상 이 디자인 할 때 반드시 특정한 규범 에 부합 해 야 한다.예 를 들 어 Serviceable 인터페이스 등 은 전형 적 인 Type 1 방법 이다.이런 디자인 사고방식 은 스프링 이 동태 적 이 고 유연 한 방식 으로 구 조 를 설계 하도록 요구한다.그래서 스프링 은 반 사 를 대량으로 채택 했다.우선 spring 이 해결 해 야 할 문 제 는 bean 을 어떻게 관리 하 느 냐 하 는 것 이다.IOC 의 사상 은 bean 간 에 직접 호출 할 수 없고 수 동적 인 방식 으로 협력 해 야 하기 때문이다.그래서 bean 의 관 리 는 spring 의 핵심 부분 입 니 다.반사 와 내성 은 코드 의 차원 에서 문 제 를 사고 할 때 의외 의 유연성 을 가 져 올 수 있다.그러나 그의 사용 은 가끔 철학 적 인 문제 이기 도 한다.ORM 디자인 이 든 AOP 디자인 이 든 모두 비슷 한 문제 가 발생 했다.도대체 반 사 를 사용 하 든 코드 를 사용 하여 생 성 하 든.Spring 에서 이 문 제 를 처리 하 는 핵심 은 org.spring from work.beans 가방 에 있 습 니 다.그 중 가장 핵심 적 인 부분 은 빈 래 퍼 다.Bean Wrapper 는 말 그대로 bean 의 포장 기 입 니 다.따라서 그 주요 작업 은 모든 bean 에 대해 속성(내장 속성 포함)의 설정 과 방법 을 호출 하 는 것 입 니 다.BeanWrapper 의 기본 구현 클래스 인 BeanWrapper Impl 에서 코드 가 비교적 길지 만 완 성 된 작업 은 매우 집중 적 이다.BeanWrapper 의 깊이 있 는 연 구 를 통 해 이 BeanWrapper 가 어떻게 작 동 하 는 지 살 펴 보 겠 습 니 다.만약 에 우리 가 두 개의 bean:Public class Company{private String name 이 있다 고 가정 합 니 다.  private Employee managingDirector;   public String getName() {   return this.name;   }   public void setName(String name) {   this.name = name;   }   public Employee getManagingDirector() {   return this.managingDirector;   }   public void setManagingDirector(Employee managingDirector) {   this.managingDirector = managingDirector;   }   }   public class Employee {   private float salary;   public float getSalary() {   return salary;   }   public void setSalary(float salary) {   this.salary = salary; }}그리고 우 리 는 BeanWrapper 를 사용 하여 이 두 개의 bean:Company c=new Company()를 호출 합 니 다.  BeanWrapper bwComp = BeanWrapperImpl(c);   // setting the company name...   bwComp.setPropertyValue("name", "Some Company Inc.");   // ... can also be done like this:   PropertyValue v = new PropertyValue("name", "Some Company Inc.");   bwComp.setPropertyValue(v);   // ok, let's create the director and tie it to the company:   Employee jim = new Employee();   BeanWrapper bwJim = BeanWrapperImpl(jim);   bwJim.setPropertyValue("name", "Jim Stravinsky");   bwComp.setPropertyValue("managingDirector", jim);   // retrieving the salary of the managingDirector through the company   Float salary = (Float)bwComp.getPropertyValue("managingDirector.salary"); 많이 번 거 로 워 보이 지만,이렇게 하면 spring 은 통 일 된 방식 으로 bean 의 속성 을 관리 할 수 있 습 니 다.빈 의 제조 공장 은 하나의 빈 에 대한 포장 이 있 고 여러 개의 빈 을 관리 해 야 한다.spring 에서 bean 을 핵심 라 이브 러 리 에 포함 시 켜 관리 합 니 다.bean 의 생산 은 두 가지 방법 이 있 습 니 다.하 나 는 하나의 bean 이 여러 개의 인 스 턴 스 를 만 드 는 것 이 고 하 나 는 하나의 bean 이 하나의 인 스 턴 스 만 생 성 하 는 것 입 니 다.디자인 모델 에 익숙 하 다 면 전 자 는 Prototype 을 사용 할 수 있 고 후 자 는 Singleton 을 사용 할 수 있다 는 생각 이 들 것 이다.반사 기술 의 사용 으로 인해 우 리 는 더 이상 원시 적 인 공장 방법 모델 처럼 대상 을 만 들 지 않 는 다 는 것 을 알 게 되 었 다.반 사 는 클래스 의 이름 에 따라 대상 을 매우 유연 하 게 만 들 수 있다.그래서 스프링 은 프로 토 타 입 과 싱글 톤 이라는 두 가지 기본 모델 만 사용 했다.spring 은 바로 이렇게 처리 되 었 습 니 다.그러나 저 희 는 사용자 가 통 일 된 인 터 페 이 스 를 유지 할 수 있 기 를 바 랍 니 다.현재 bean 이 prototype 에서 발생 하 는 독립 된 bean 인지,아니면 Singleton 에서 발생 하 는 공유 bean 인지 에 관심 을 가 질 필요 가 없습니다.그래서 org.spring from work.beans.factory 가방 에 있 는 Bean Factory 는 통 일 된 getBean 방법 을 정의 했다.JDBC 는 JDBC 를 우아 하 게 바 텀 데이터 베 이 스 를 봉 인 했 지만 JDBC 는 여전히 많은 변 함 이 없다.CRUD 작업 을 수행 하기 위해 서 는 많은 코드 를 작성 해 야 합 니 다.그리고 JDBC 는 어떤 문제 가 발생 하 더 라 도 SQLException 을 던 집 니 다.이 방법 은 이상 사용 에 있어 서 완비 되 지 않 은 정보 라 고 합 니 다.문 제 는 매우 복잡 할 수 있 기 때문에 데이터 베 이 스 를 연결 하 는 문제 일 수도 있 고 병행 제어 의 문제 일 수도 있 으 며 SQL 구문 만 잘못 되 었 을 수도 있 습 니 다.간단 한 SQLException 으로 모든 문 제 를 해결 할 이유 가 없다 는 것 은 무책임 하 다.이 두 가지 문제 에 대해 Spring Framework 는 두 가지 해결 방법 을 제시 했다.먼저,하나의 프레임 워 크 를 제공 하고 JDBC 응용 에서 의 획득 연결,이상 처리,방출 등 비교적 통용 되 는 조작 을 모두 집중 시 키 며 사용 자 는 특정한 실현 만 제공 하면 된다.실 현 된 구체 적 인 세부 사항 은 템 플 릿 방법 을 사용한다.예 를 들 어 org.springframework.jdbc.object 패키지 에서 MappingSqlQuery 류 는 SQL 조 회 를 구체 적 인 업무 대상 으로 표시 합 니 다.JavaDoc 에 이렇게 적 혀 있 습 니 다:Reusable query in which concrete subclasses must implement the abstract mapRow(ResultSet,int)method to convert each row of the JDBC ResultSet into an object.사용 자 는 mapRow 방법 을 구현 해 야 합 니 다.이것 은 전형 적 인 템 플 릿 방법의 적용 입 니 다.구체 적 인 예 를 들 어 볼 게 요.class UserQuery extends MappingSqlQuery{public UserQuery(DataSource datasource){super(datasource,"SELECT*FROM PUBUSER_ADDRESS WHERE USER_ID = ?");   declareParameter(new SqlParameter(Types.NUMERIC));   compile();   }   // Map a result set row to a Java object   protected Object mapRow(ResultSet rs, int rownum) throws SQLException {   User user = new User();   user.setId(rs.getLong("USER_ID"));   user.setForename(rs.getString("FORENAME"));   return user;   }   public User findUser(long id) {   // Use superclass convenience method to provide strong typing   return (User) findObject(id); }}두 번 째 질문 입 니 다.가장 번 거 로 운 점 은 JDBC 의 이상 을 차단 한 다음 이상 한 유형 을 판단 하고 다시 이상 을 던 져 야 한 다 는 것 입 니 다.잘못된 문 제 는 연결 을 통 해 얻 을 수 있 기 때문에 이상 을 어떻게 차단 하 는 지 귀 찮 습 니 다.Spring Framework 에서 사용 하 는 방법 은 리 셋 입 니 다.리 셋 을 처리 하 는 클래스 는 Spring Framework 에서 template JdbcTemplate template=new JdbcTemplate(dataSource)라 고 합 니 다.  final List names = new LinkedList();   template.query("SELECT USER.NAME FROM USER",   new RowCallbackHandler() {   public void processRow(ResultSet rs) throws SQLException {   names.add(rs.getString(1));   }   }); 리 셋 함 수 는 익명 클래스 로 템 플 릿 방법 도 사 용 했 고 이상 한 처 리 는 부모 클래스 에서 이 루어 졌 습 니 다.층 간 송 결합 은 오픈 소스 코드 계 에서 이미 대량의 MVC 기반 웹 용기 가 나 타 났 다.그러나 이런 용 기 는 모두 웹 의 범위 에 국한 되 고 웹 차원 백 엔 드 의 연결 과 관련 되 지 않 는 다.spring 은 전체 적 인 프레임 워 크 로 서 웹 층 과 백 엔 드 업무 층 의 연결 방식 을 정의 했다.이 사 고 는 그림 MVC 의 범 주 를 소통 시 키 지만 결합 이 더욱 느슨 하 다.구체 적 인 집적 차원 에 의존 하지 않 는 다.  public class GoogleSearchController   implements Controller {   private IGoogleSearchPort google;   private String googleKey;   public void setGoogle(IGoogleSearchPort google) {   this.google = google;   }   public void setGoogleKey(String googleKey) {   this.googleKey = googleKey;   }   public ModelAndView handleRequest(   HttpServletRequest request, HttpServletResponse response)   throws ServletException, IOException {    String query = request.getParameter("query");    GoogleSearchResult result =    // Google property definitions omitted...    // Use google business object    google.doGoogleSearch(this.googleKey, query,start, maxResults, filter, restrict, safeSearch, lr, ie, oe);    return new ModelAndView("googleResults", "result", result); }}리 셋 함 수 는 익명 클래스 이 며,템 플 릿 방법 도 사용 되 었 으 며,이상 한 처 리 는 부모 클래스 에서 이 루어 졌 습 니 다.

좋은 웹페이지 즐겨찾기