최근에 나는 이번 봄 입문서 : SpringInaction을 샀다. 나는 거의 탐색하고 꽤 기분이 좋았다. 약간의 시작. 매닝의 책은 여전히 좋습니다. 나는 매닝 책 만 읽는 사람들처럼 매닝에 초점을 맞추지 않지만 경건과 열정으로 책을 읽습니다. 다시 한번, 나는 IOC, DI 및 AOP와 같은 스프링의 핵심 개념을 받아 들였다. IOC와 DI에 대한 나의 의견에 대해 이야기하겠습니다.
IOC (DI) : 사실, 핵심 스프링 아키텍처의 개념은 그다지 복잡하지 않으며 일부 책에 설명 된 것처럼 모호하지 않습니다. Java 프로그래머는 모두 Java 프로그램의 각 비즈니스 논리가 공동 작업을 위해 최소한 두 개 이상의 객체가 필요하다는 것을 알고 있습니다. 일반적으로 각 객체가 파트너 객체를 사용하는 경우 NewObject ()와 같은 구문을 사용하여 파트너 객체의 응용 프로그램 작업을 완료해야합니다. 물체 사이의 커플 링이 높다는 것을 알게 될 것입니다. IOC의 아이디어는 : 이러한 상호 의존적 인 물체의 생성과 조정을 실현하는 스프링 컨테이너입니다. 객체는 관계 비즈니스 논리 자체 만 있으면됩니다. 이와 관련하여, 객체가 자신의 협업 대상을 얻는 방법에 대한 책임은 (IOC, Di)
이것은 봄의 IOC에 대한 나의 경험입니다. DI는 실제로 IOC를 말하는 또 다른 방법입니다. DI는 2004 년 초 논문에서 Martin Fowler가 처음 제안했습니다. 그는 결론을 내 렸습니다. 즉, 종속 객체를 얻는 방법이 반전됩니다.
이 핵심 개념을 아직 이해하지 못하면 : 여기서 우리는 Bromon이라는 블로그에서 찾은 간단하고 이해하기 쉬운 답변을 인용합니다.
Ioc와 di
먼저, IOC (inversionof control, 컨트롤 역전)에 대해 이야기하고 싶습니다. 이것은 전반적으로 봄의 핵심입니다. 스프링 프레임 워크의 경우 Spring은 물체의 수명주기와 물체 간의 관계를 제어 할 책임이 있습니다. 이것이 무엇을 의미합니까? 간단한 예를 들어 여자 친구를 어떻게 찾을 수 있습니까? 일반적인 상황은 우리가 아름답고 잘 보이는 여성이있는 곳을 찾기 위해 어디서나 가고, 그들의 관심사, QQ 번호, 전화 번호, IP 번호, IQ 번호에 대해 문의하고, 알 수있는 방법을 찾고, 그들이 좋아하는 것을주고,이 과정은 복잡하고 심오하며, 우리 자신을 디자인하고 직면해야한다는 것입니다. 전통적인 프로그램 개발도 마찬가지입니다. 객체에서 다른 객체를 사용하려면 객체를 가져와야합니다 (새로운 개체를 혼자서 또는 JNDI에서 쿼리). 사용 후 객체를 파괴해야하며 (예 : 연결 등) 물체는 항상 다른 인터페이스 또는 클래스와 결합됩니다.
그렇다면 IOC는 어떻게해야합니까? 결혼 대행사를 통해 여자 친구를 찾는 것과 나와 내 여자 친구 사이에 제 3 자 : 결혼 대행사를 소개하는 것과 비슷합니다. 결혼 기관은 남성과 여성에 대한 많은 정보를 관리합니다. 나는 결혼 대행사에 목록을 제공하고 Michelle Reis처럼 보이고 Lin Xilei와 같은 인물, Jay Chou와 같은 노래, Carlos와 같은 속도를 가지고 있으며 Zidane과 같은 기술을 갖는 등 어떤 종류의 여자 친구를 찾고 싶은지 말할 수 있습니다. 그런 다음 결혼 대행사는 우리의 요구 사항에 따라 MM을 제공합니다. 우리는 단지 사랑에 빠지고 결혼해야합니다. 간단하고 명확합니다. 우리에게 주어진 후보자가 요구 사항을 충족하지 않으면 예외를 던질 것입니다. 전체 과정은 더 이상 저에 의해 통제되지 않지만 결혼 기관과 같은 컨테이너와 같은 기관에 의해 통제됩니다. 이것은 봄이 옹호하는 개발 방법입니다. 모든 클래스는 스프링 컨테이너에 등록되어 스프링에 자신이 무엇인지, 필요한 것을 알려줍니다. 그러면 Spring은 시스템이 적절한 수준으로 실행될 때 원하는 것을 제공하고 동시에 필요한 다른 것들로 넘겨줍니다. 모든 클래스는 스프링에 의해 생성되고 파괴되므로 물체의 수명주기를 제어하는 물체는 더 이상 그것을 참조하는 대상이 아니라 스프링이라는 것을 의미합니다. 특정 객체의 경우 다른 객체를 제어하는 데 사용되었지만 이제는 모든 객체가 스프링으로 제어되므로이를 제어 역전이라고합니다.
IOC의 핵심 사항 중 하나는 시스템 작동 중에 필요한 다른 객체를 객체에 동적으로 제공하는 것입니다. 이것은 di (의존성 주입)를 통해 달성됩니다. 예를 들어, 객체 A는 데이터베이스를 작동해야합니다. 과거에는 연결 객체를 얻기 위해 항상 코드를 썼습니다. 스프링을 사용하면이 연결을 구성하는 방법과 구성시기에 대해 A에서 연결이 필요하다는 것을 스프링 만 알리면 A가 알 필요가 없습니다. 시스템이 실행될 때 Spring은 적절한 시간에 연결을 생성 한 다음 주입과 같은 주입에 주입하여 각 객체 간의 관계 제어를 완료합니다. A는 정상적으로 실행하려면 연결에 의존해야 하며이 연결은 Spring에 의해 주입되며 종속성 주입의 이름은 이것으로부터 나옵니다. 그렇다면 DI는 어떻게 구현됩니까? Java 1.3 이후의 중요한 기능은 반사이며,이를 통해 프로그램이 객체를 동적으로 생성하고 객체 방법을 실행하며 실행할 때 객체의 속성을 변경할 수 있습니다. 봄은 반사를 통해 주입됩니다. 반사에 관한 관련 정보는 Javadoc을 참조하십시오.
IOC와 DI의 개념을 이해 한 후에는 모든 것이 단순하고 명확 해지고 나머지 작업은 스프링 프레임 워크에 블록을 쌓는 것입니다.
봄이 어떻게 작동하는지 배우겠습니다.
public static void main (string [] args) {ApplicationContext Context = 새 FileSystemXmlApplicationContext ( "ApplicationContext.xml"); 동물 동물 = (동물) context.getBean ( "동물"); Animal.say (); }이 코드에 익숙해야하지만 분석하겠습니다. 먼저 ApplicationContext.xml
<bean id = "동물"> <속성 이름 = "name"value = "kitty" /> < /bean>
그는 phz.springframework.test.cat 클래스를 가지고 있습니다
공개 클래스 고양이 동물을 구현하는 동물 {private string name; public void says () {system.out.println ( "i am" + name + "!");} public void setName (String name) {this.name = name;}}phz.springframework.test.animal 인터페이스를 구현했습니다
공공 인터페이스 동물 {public void says (); }분명히 위의 코드는 IAMKITTY를 출력합니다!
그렇다면 봄은 어떻게합니까?
다음으로 봄이 어떻게 작동하는지 확인하기 위해 스프링을 작성해 봅시다!
먼저 Bean 클래스를 정의합니다. Bean Class는 Bean이 소유 한 속성을 저장하는 데 사용됩니다.
/ * bean id */ 개인 문자열 ID; / * bean 클래스 */ 개인 문자열 유형; / * bean 속성 */ private map <string, object> properties = new Hashmap <String, object> ();
콩에는 ID, 유형 및 속성이 포함됩니다.
내년 봄은 구성 파일로드를 시작하고 구성 정보를 해시 맵에 저장합니다. 해시 맵의 키는 Bean의 ID이고 Hasmap의 값은 Bean입니다. 이런 식으로 만 컨텍스트를 통해 동물 클래스를 얻을 수 있습니다. 우리는 Spirng이 기본 유형을 주입 할 수 있으며 목록 및지도와 같은 유형을 주입 할 수 있다는 것을 알고 있습니다. 다음으로, 스프링이 어떻게 저장되는지 보려면 예를 들어지도합시다.
맵 구성은 다음과 같을 수 있습니다
<bean id = "test"> <property name = "testmap"> <map> <enterd key = "a"> <value> 1 </value> </enterd> <Entry Key = "b"> <value> 2 </value> </enterd> </map> </bean>
스프링은 위의 구성을 어떻게 저장합니까? 코드는 다음과 같습니다.
if (beanproperty.element ( "map")! = null) {map <string, object> propertiesmap = new Hashmap <String, object> (); 요소 propertiesListMap = (요소) beanProperty.elements (). get (0); iterator <?> propertiesiterator = propertieslistmap.elements (). iterator (); while (propertiesiterator.hasnext ()) {element vet = (요소) propertiesiterator.next (); if (vet.getName (). equals ( "enterd")) {String key = vet.attributeValue ( "key"); iterator <?> valueIterator = vet.elements (). iterator (); while (valuesITerator.hasnext ()) {요소 값 = (요소) valueIterator.next (); if (value.getName (). equals ( "value")) {propertiesmap.put (key, value.getText ()); } if (value.getName (). equals ( "ref")) {propertiesMap.put (키, 새 문자열 [] {value.attributeValue ( "bean")}); }}}} bean.getProperties (). put (name, propertiesmap); }다음으로 핵심 부분으로 가자. 스프링이 어떻게 의존성 주입인지 봅시다. 실제로 의존성 주입에 대한 아이디어도 매우 간단합니다. 반사 메커니즘을 통해 구현됩니다. 클래스를 인스턴스화 할 때 클래스의 세트 메소드를 반영하여 해시 맵에 저장된 클래스 속성을 클래스에 주입합니다. 그것이 어떻게 끝났는지 봅시다.
먼저 이와 같은 수업을 인스턴스화하십시오
public static 객체 NewInstance (String classname) {class <?> cls = null; object obj = null; try {cls = class.forname (classname); obj = cls.newinstance ();} catch (classNotfoundException e) {throw new runtiException (e); (불법 행위 ecception e) {새로운 runtimeexception (e);} return obj;}그런 다음이 클래스의 종속성을 이렇게 주입합니다.
public static void setproperty (개체 obj, 문자열 이름, 문자열 값) {class <? 객체> clazz = obj.getClass (); try {String MethodName = returnsetMthodName (name); method [] ms = clazz.getMethods (); for (method m : ms) {if (m.getName (). equals (methodName)) {if (m.getParameterTypes (). clazzParAmeterType ==) M.GetParameterTypes () [0]; setFieldValue (clazzParameterType.getName (), value, m, obj); break;}}}}}} catch (securityException e) {throw new runtimeexception (e);} catch (eLegalArgumentException e) {new runtimeecection (e);}; {새로운 runtimeexception (e);}}}마지막으로,이 클래스의 인스턴스를 우리에게 반환하면 사용할 수 있습니다. 어떻게 끝나는 지 확인하기 위해 예제로지도를 받자. 내가 쓴 코드는 해시 맵을 생성하고 해시 맵을 이와 같이 주입 해야하는 클래스에 주입하는 것입니다.
if (value instanceof map) {iterator <?> rettyiterator = ((map <?,?>) value) .entryset (). iterator (); map <string, object> map = new Hashmap <String, Object> (); while (EntryTerator.hasnext ()) {enterd <?,?> entrymap = (enther <?,?>) entheriterator.next (); if (EntryMap.getValue () instanceof String []) {map.put ((String) entymap.getKey (), getBean (((string []) entryMap.getValue ()) [0]); }} beanprocesser.setProperty (obj, property, map); }좋아, 그래서 우리는 스프링을 사용하여 우리를 위해 수업을 만들 수 있습니다. 어렵지 않습니까? 물론 봄은 이것보다 더 많은 일을 할 수 있습니다. 이 예제 프로그램은 Spring의 가장 핵심 종속성 주입 기능의 일부만 제공합니다.
이 기사는 많은 기사를 언급했으며 하나씩 감사 할 수 없습니다. 함께 감사합니다. 저작권 침해에 대해 사과드립니다. 나는 그것이 모두에게 도움이되기를 바랍니다!
요약
위의 내용은 Spring IOC 원칙에 대한 자세한 설명에 대한이 기사의 모든 내용이며 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구들은이 사이트를 계속 참조 할 수 있습니다.
Spring 's IOC, AOP 및 코드 예제에 대한 간단한 이해
Spring의 IOC 시뮬레이션 구현에 대한 자세한 소개
단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!