2012-04-13 26 views
21

Tôi đang sử dụng Spring kể từ vài tháng trước và tôi cho rằng việc tiêm phụ thuộc với chú thích @Autowired cũng yêu cầu trình thiết lập cho trường cần chèn.tiêm phụ thuộc vào mùa xuân @Autowired mà không cần setter

Vì vậy, tôi đang sử dụng nó như thế này:

@Controller 
public class MyController { 

    @Autowired 
    MyService injectedService; 

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

    ... 

}

Nhưng tôi đã cố gắng ngày hôm nay:

@Controller 
public class MyController { 

    @Autowired 
    MyService injectedService; 

    ... 

}

Và oh bất ngờ, không có lỗi biên dịch, không có lỗi khi khởi động, ứng dụng đang chạy hoàn hảo ...

Vì vậy, câu hỏi của tôi là, thiết lập được yêu cầu cho việc tiêm phụ thuộc với chú thích @Autowired?

Tôi đang sử dụng Spring 3.1.1.

+3

Có vẻ như bạn đã trả lời câu hỏi của riêng bạn. – darrengorman

Trả lời

35

Bạn không cần setter với @Autowired, giá trị được đặt bằng phản ánh.

Kiểm tra bài này cho giải thích đầy đủ How does Spring @Autowired work

+0

Cảm ơn bạn đã trả lời nhanh! – Tony

+0

Đừng quên đăng bài liên kết;) –

+0

Trường có thể là riêng tư và Spring Autowired hoạt động mà không cần thiết lập. – chalimartines

3

Không, nếu chính sách bảo mật Java cho phép xuân để thay đổi quyền truy cập cho các lĩnh vực bao bì bảo vệ một setter là không cần thiết.

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()); 

    } 
} 

Đây là cách thực hiện bằng cách sử dụng sự phản chiếu.

Các vấn đề liên quan