의존성 주입 소개
먼저 의존성 주입의 개념을 검토합시다.
의존성 주입 및 제어의 역전은 종종 언급 한 것과 동일한 개념입니다. 구체적인 의미는 다음과 같습니다. 역할 (아마도 Java 인스턴스, 발신자)이 다른 역할 (또 다른 Java 인스턴스, 발신자)의 도움이 필요할 때 전통적인 프로그래밍 프로세스에서 발신자는 일반적으로 발신자가 생성합니다. 그러나 봄에는 칼리를 만드는 작업은 더 이상 발신자가 수행하지 않으므로 대조 역전이라고합니다. Callee 인스턴스를 만드는 작업은 일반적으로 스프링 컨테이너에 의해 수행 된 다음 발신자에 주입되므로 종속성 주입이라고도합니다.
실제로, 종속성 주입의 역할은 원래 코드에서 객체 간의 종속성을 분리하고 스프링 프레임 워크 처리를 추가하여 종속성을 유연하고 중앙에서 관리 할 수 있도록하는 것입니다.
의존성 주입 프레임 워크
의존성 주입 프레임 워크는 신비하지 않으며 실제로는 매우 간단합니다. 스프링 의존성 주입 소스 코드를 보지 마십시오. 왜냐하면 당신이가는 한, 당신은 다시는 쓰지 않을 것이며 스스로 시작하지 않을 것이기 때문입니다. 기능이 너무 강력하므로 디자인이 너무 복잡합니다. 일반 프로그래머는 그것을 보면 한숨을 쉬게 할 수 있습니다.
스프링 소스 코드를주의 깊게 읽지 않았습니다. 그럼에도 불구하고 기본적으로 표준 의존성 주입 표준 "JSR-330"을 충족하는 작은 프레임 워크 iockids를 적용하는 데 반나절이 걸렸습니다. 이 작은 프레임 워크에는 약 200 줄의 코드가있는 메인 클래스 인젝터가 하나 뿐이며 다음 기능이 있습니다.
약간 더 복잡한 사용 예를 살펴 보겠습니다.
import javax.inject.inject; import javax.inject.named; import javax.inject.singleton; import iockids.injector; @singletonclass root {@inject @named ( "a") 노드 a; @inject @named ( "b") 노드 b; @override public String tostring () {return string.format ( "root ( %s, %s)", a.name (), b.name ()); }} interface 노드 {문자열 이름 ();}@singleton@named nodea implements 노드 {@inject leaf leaf; @inject @named ( "b") 노드 b; @override public String name () {if (b == null) return string.format ( "Nodea (%s)", Leaf); 그렇지 않으면 string.format ( "nodeawithb (%s)", 리프); }}@singleton@name ( "b") 클래스 노드B는 노드 {리프 리프; @inject @named ( "A") 노드 A; @inject public nodeb (잎 잎) {this.leaf = 잎; } @override public String name () {if (a == null) return string.format ( "nodeb (%s)", 리프); 그렇지 않으면 string.format ( "nodebwitha (%s)", 리프); }} 클래스 리프 {@inject root root; int index; 정적 INT 시퀀스; public Leaf () {index = 시퀀스 ++; } public string toString () {if (root == null) return "leaf" + index; 그렇지 않으면 "LeafWithRoot" + 색인을 반환합니다. }} public class demo {public static void main (String [] args) {var injector = new injector (); injector.registerQualifiedClass (node.class, nodea.class); injector.registerQualifiedClass (node.class, nodeb.class); var root = injector.getInstance (root.class); System.out.println (루트); }}위의 코드는 iockids가 제공하는 모든 기능을 사용합니다.
위의 코드에 대한 이해를 용이하게하기 위해 종속성 다이어그램을 그렸습니다.
위의 코드 출력은 다음과 같습니다
root (nodeawithb (LeafwithRoot0), nodebwitha (LeafWithRoot1))
이 출력에서도 종속성 구조를 대략 상상할 수 있습니다.
iockids는 사용자 주입 구성 오류를 방지하기 위해 풍부한 사격 오류 예외 보고서를 제공합니다.
예를 들어, 위의 NODEA 및 NODEB의 이름을 동일한 A로 구성하면 아래 오류 스택이 노출됩니다.
iockids.injectexception : 복제 된 Qualified javax.inject.Node는 iockids.injector.injector.injector.registerqualifiedClass (injector.java:70)의 iockids.injector.gisterqualifiedClass (injectuqualifiedClass (injector.java:87)와 동일한 클래스 iockids.demo.node로 이름이 붙어 있습니다. iockids.demo.demo.main (demo.java:106)
Nodeb의 생성자에 매개 변수를 추가하면
@inject public nodeb (잎 잎, int k) {this.leaf = 잎; }실행할 때 다음 오류가 발생합니다
iockids.injectexception : iockids.injector.injector.createnew (injector.java:120)에서 주입 클래스 int에 대한 액세스 가능한 생성자 없음 iockids.injector.createnew (injector.java:94) at iockids.injector.createfromparameter (injectefromparameter (injector.java:167) at at at at iockids.injector.createfromconstructor (injectefromconstructor (injector.java:145)에서 iockids.injector.createnew (injector.java:123)에서 iockids.injector.createfromqualified (injector.java:216)에서 iockids.injectefromffield (Injector.injectefffield) iockids.injector.injectmembers (injector.java:233) at iockids.injector.createnew (injector.java:136)의 iockids.injector.injectefromqualified (injectefromqualified (injector.java:216) at iockids.injector.createfromfiff iockids.injector.injectmembers (injector.java:233) at iockids.injector.createnew (injector.java:136) at iockids.injector.createnew (injector.java:94) at iockids.injector.getinstance (injector.java:245) at iockids.demo.demo.main (demo.java:107)
프로젝트 오픈 소스 주소 : https://github.com/pyloque/iockids (로컬 다운로드)
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.