เหตุใดเราจึงไม่สามารถกำหนดตัวแปรอินสแตนซ์แบบคงที่ใน Spring bean ได้โดยอัตโนมัติ ฉันรู้ว่ามีวิธีอื่นในการบรรลุเป้าหมายนี้ แต่แค่อยากรู้ว่าทำไมเราถึงทำไม่ได้ด้วยวิธีด้านล่างนี้
เช่น
@Autowired
public static Test test;
เหตุใดเราจึงไม่สามารถกำหนดตัวแปรอินสแตนซ์แบบคงที่ใน Spring bean ได้โดยอัตโนมัติ ฉันรู้ว่ามีวิธีอื่นในการบรรลุเป้าหมายนี้ แต่แค่อยากรู้ว่าทำไมเราถึงทำไม่ได้ด้วยวิธีด้านล่างนี้
เช่น
@Autowired
public static Test test;
คำตอบ:
เนื่องจากการใช้ฟิลด์แบบคงที่จะสนับสนุนการใช้วิธีการแบบคงที่ และวิธีการคงที่เป็นสิ่งชั่วร้าย จุดประสงค์หลักของการฉีดแบบพึ่งพาคือให้คอนเทนเนอร์สร้างวัตถุให้คุณและวางสาย นอกจากนี้ยังทำให้การทดสอบง่ายขึ้น
เมื่อคุณเริ่มใช้วิธีการคงที่คุณไม่จำเป็นต้องสร้างอินสแตนซ์ของวัตถุอีกต่อไปและการทดสอบจะยากกว่ามาก นอกจากนี้คุณไม่สามารถสร้างอินสแตนซ์ของคลาสที่กำหนดได้หลายอินสแตนซ์แต่ละคลาสจะมีการแทรกการพึ่งพาที่แตกต่างกัน (เนื่องจากฟิลด์ถูกแชร์โดยปริยายและสร้างสภาวะโลก - ชั่วร้ายด้วย)
@BeforeClass
ใน SpringJUnit4ClassRunner และมีวิธีการเข้าถึงถั่ว@Autowired
ในการทดสอบ .. โดยพื้นฐานแล้วคุณไม่สามารถทำได้ ซึ่งน่ารำคาญ.
เนื่องจากเมื่อตัวโหลดคลาสโหลดค่าคงที่บริบท Spring จึงยังไม่จำเป็นต้องโหลด ดังนั้นตัวโหลดคลาสจะไม่ฉีดฟิลด์คงที่ใน bean อย่างถูกต้องและจะล้มเหลว
ตามแนวคิด OOP จะเป็นการออกแบบที่ไม่ดีหากมีการกำหนดตัวแปรคงที่โดยอัตโนมัติ
ตัวแปรคงไม่ใช่คุณสมบัติของ Object แต่เป็นคุณสมบัติของ Class การเดินสายสปริงอัตโนมัติทำบนวัตถุและนั่นทำให้การออกแบบดูสะอาดตาในความคิดของฉัน คุณสามารถปรับใช้อ็อบเจ็กต์ bean แบบมีสายอัตโนมัติเป็นซิงเกิลตันและบรรลุเช่นเดียวกับการกำหนดแบบคงที่
ด้วยโซลูชันนี้คุณสามารถกำหนดฟิลด์คงที่โดยอัตโนมัติในฤดูใบไม้ผลิ
@Component
public class TestClass {
private static Test test;
@Autowired
public void setTest(Test test) {
TestClass.test = test;
}
}