2012-04-13 6 views
21

저는 몇 달 전부터 Spring을 사용하고 있습니다. @Autowired 주석을 사용한 의존성 주입에도 필드 주입기가 필요했습니다. 아니,스프링 의존성 삽입 @Autowired with setter

@Controller 
public class MyController { 

    @Autowired 
    MyService injectedService; 

    ... 

}

그리고 오 놀라운 일이 오늘

@Controller 
public class MyController { 

    @Autowired 
    MyService injectedService; 

    public void setMyService(MyService injectedService) { 
     this.injectedService = injectedService; 
    } 

    ... 

}

그러나 나는 시도했다 :

그래서, 나는 이런 식으로 사용하고 컴파일 오류, 시작시 오류 없음, 응용 프로그램이 완벽하게 실행 중입니다 ...

제 질문은 SetA가 @Autowired 주석을 사용하여 종속성 주입에 필요합니까?

저는 Spring 3.1.1을 사용하고 있습니다.

+3

자신 만의 질문에 답변 한 것 같습니다. – darrengorman

답변

35

@Autowired와 함께 설정기를 할 필요가 없습니다. 값은 리플렉션에 의해 설정됩니다.

확인 완전한 설명은이 게시물에 자바 보안 정책이 봄 세터가 필요하지 않은 패키지 보호 필드에 대한 액세스 권한을 변경할 수 있습니다 경우 How does Spring @Autowired work

+0

빠른 답장을 보내 주셔서 감사합니다! – Tony

+0

링크 된 게시물을 잊지 마세요.) –

+0

필드는 private 일 수 있으며 Spring Autowired는 setter없이 작동합니다. – chalimartines

3

없음.

2
package com.techighost; 

public class Test { 

    private Test2 test2; 

    public Test() { 
     System.out.println("Test constructor called"); 
    } 

    public Test2 getTest2() { 
     return test2; 
    } 
} 


package com.techighost; 

public class Test2 { 

    private int i; 

    public Test2() { 
     i=5; 
     System.out.println("test2 constructor called"); 
    } 

    public int getI() { 
     return i; 
    } 
} 


package com.techighost; 

import java.lang.reflect.Field; 

public class TestReflection { 

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 
     Class<?> class1 = Class.forName("com.techighost.Test"); 
     Object object = class1.newInstance(); 
     Field[] field = class1.getDeclaredFields(); 
     field[0].setAccessible(true); 
     System.out.println(field[0].getType()); 
     field[0].set(object,Class.forName(field[0].getType().getName()).newInstance()); 
     Test2 test2 = ((Test)object).getTest2(); 
     System.out.println("i="+test2.getI()); 

    } 
} 

리플렉션을 사용하는 방법입니다.

관련 문제