프로젝트 구조는 다음과 같습니다.
어떻게 생각하나요? 추상화를 향한 프로그래밍?
먼저 시퀀스 다이어그램을 살펴보겠습니다.
위에서 무엇을 알 수 있나요? 초보자라면 뭔지 알면 이상하니까 놔두세요. 구체적인 구현을 살펴보겠습니다.
먼저 모델 패키지 아래에 배치되는 엔터티 클래스인 사용자를 만들어야 합니다.
package com.wwj.model; /** * 엔터티 클래스 * @author wwj * Spring */ public class User { private String 사용자 이름 private String 비밀번호; { this.username = 사용자 이름; } public String getPassword() { 비밀번호 반환 } public void setPassword(String 비밀번호) { this.password = 비밀번호 } }
다음은 추상화를 위한 프로그래밍 방법입니다. 다음으로 인터페이스를 정의합니다.
package com.wwj.dao; import com.wwj.model.User; /** * 추상화 지향 프로그래밍* @author wwj * 장점: 유연성 증가*/ 공용 인터페이스 UserDAO { public void save(User user);
이 인터페이스는 User 객체 매개변수를 갖는 save 메소드라는 메소드를 선언하고 있음을 분명히 알 수 있습니다. User 객체를 데이터베이스에 저장하는 데 사용되는 것으로 생각할 수 있습니다.
특정 구현은 구현 클래스에 맡기세요.
package com.wwj.dao.impl; import com.wwj.model.User /** *인터페이스 구현 클래스* @author wwj * */ public class UserDAOImpl은 UserDAO를 구현합니다. void save(사용자 사용자) { System.out.println("사용자 저장") } }
이것의 장점은 데이터베이스 환경을 변경하려는 경우 다양한 데이터베이스 코드를 유연하게 정의할 수 있다는 것입니다.
위 메소드를 어떻게 호출하나요? 비즈니스 로직을 데이터베이스 작업과 분리하려면 비즈니스 로직 클래스를 정의해야 합니다.
package com.wwj.service; import com.wwj.dao.impl.UserDAOImpl; import com.wwj.model.User /** * 서비스 클래스, 비즈니스 로직 구현* @author wwj * */ 공용 클래스 UserService { 개인 UserDAO userDAO() { 반환 userDAO } 공용 무효; setUserDAO(UserDAO userDAO) { this.userDAO = userDAO } public void add(사용자 사용자) { this.userDAO.save(user) } }
뭔가가 있는 걸 알 수 있죠. 뭔가요? UserDAO, 효과를 보신 적이 있으신가요? DI라고도 하는 IOC의 개념은 중국어로 종속성 주입, 제어 반전이라고도 합니다. 이는 Spring에서 매우 중요한 개념입니다. 봄.
다음은 실제로 공장 패턴과 유사한 Spring 구현을 시뮬레이션합니다. Spring을 사용하면 서로 다른 객체를 함께 조합하여 사용할 수 있습니다.
먼저 구성 파일 beans.xml을 살펴보세요.
<beans> <bean id="u" /> <bean id="userService" > <property name="userDAO" bean="u"/> </bean> </beans>
팩토리 메소드
package com.wwj.spring; 공용 인터페이스 BeanFactory { 공용 개체 getBean(문자열 이름) }
xml 파일을 파싱하고 BeanFactory를 구현하는 클래스
패키지 com.wwj.spring; 가져오기 java.util.HashMap; 가져오기 java.util.Map; 가져오기 org.jdom.Element; ; import org.jdom.input.SAXBuilder 공개 클래스 ClassPathXmlApplicationContext는 BeanFactory를 구현합니다. //객체를 저장할 컨테이너 정의 private Map<String,Object> beans = new HashMap<String, Object>(); public ClassPathXmlApplicationContext() throws Exception{ SAXBuilder sb = new SAXBuilder() Document sb.build (this) .getClass().getClassLoader().getResourceAsStream("beans.xml")); 요소 루트 = doc.getRootElement(); //루트 노드 가져오기 List list = root.getChildren("bean"); //bean이라는 이름의 모든 요소 for(int i = 0; i < list.size(); i++) { 요소 요소 = (요소) list.get(i); String id = element.getAttributeValue("id"); //id 값 가져오기 String cla = element.getAttributeValue("class") //클래스 값 가져오기 o = Class.forName(cla).newInstance(); System.out.println(cla); beans.put(id,o); )element.getChildren("property")){ 문자열 이름 = propertyElement.getAttributeValue("name") //UserDAO String bean = propertyElement.getAttributeValue("bean"); //u Object beanObject = beans.get(bean);//UserDAOImpl 인스턴스 //메서드 이름을 함께 패치하고 setUserDAO 메서드를 구현합니다. String methodName = "set" + name.substring(0 , 1) .toUpperCase() + name.substring(1); System.out.println("메서드 이름 = " + methodName); //메소드 객체를 얻기 위해 리플렉션 메커니즘을 사용합니다. Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]) m.invoke(o, beanObject); 메소드} } } @Override public Object getBean(String name) { return beans.get("id") } }
테스트 수업을 해보자
package com.wwj.service; import com.wwj.model.User; import com.wwj.spring.ClassPathXmlApplicationContext; 작성자 wwj * */ public class UserServiceTest { @Test public void testAdd() throws Exception{ BeanFactory beanFactory = new ClassPathXmlApplicationContext(); UserService 서비스 =(UserService)beanFactory.getBean("userService") 사용자 u = new User() service.add(u);
먼저 테스트 클래스에서 몇 가지 단서를 볼 수 있습니다. 이 객체를 사용하여 getBean 메소드를 교환하여 비즈니스 로직 클래스 객체를 얻으세요. 나중에 add 메소드를 호출하여 사용자 객체를 데이터베이스에 추가할 수 있습니다. 이 서비스 클래스에 들어갑니다. 물론 여기서는 데이터베이스에 대한 삽입이 구현되지 않고 테스트만 구현됩니다. 실제로 전체 프로세스는 매우 명확하며 Spring의 핵심 구성 파일은 객체를 사용하기 위해 서비스 클래스에 주입되어 데이터베이스 관련 작업을 수행할 수 있습니다. 운영.
위 내용은 온라인에 정리된 스프링 구성 내용입니다. 모든 분들께 도움이 되었으면 좋겠습니다.