Saya memiliki @Autowired
layanan yang harus digunakan dari dalam metode statis. Saya tahu ini salah tetapi saya tidak dapat mengubah desain saat ini karena akan membutuhkan banyak pekerjaan, jadi saya perlu beberapa peretasan sederhana untuk itu. Saya tidak bisa mengubah randomMethod()
menjadi non-statis dan saya perlu menggunakan kacang autowired ini. Ada petunjuk bagaimana melakukan itu?
@Service
public class Foo {
public int doStuff() {
return 1;
}
}
public class Boo {
@Autowired
Foo foo;
public static void randomMethod() {
foo.doStuff();
}
}
Jawaban:
Anda dapat melakukan ini dengan mengikuti salah satu solusi:
Menggunakan konstruktor @Autowired
Pendekatan ini akan membangun kacang yang membutuhkan beberapa kacang sebagai parameter konstruktor. Dalam kode konstruktor Anda menyetel bidang statis dengan nilai yang didapat sebagai parameter untuk eksekusi konstruktor. Sampel:
Menggunakan @PostConstruct untuk memberikan nilai ke bidang statis
Idenya di sini adalah untuk menyerahkan kacang ke bidang statis setelah kacang dikonfigurasi oleh pegas.
sumber
Anda harus mengatasinya melalui pendekatan pengakses konteks aplikasi statis:
Kemudian Anda dapat mengakses instance bean secara statis.
sumber
getBean
sebelum konteks diinisialisasi (NPE) atau setelah konteks dengan biji dihancurkan. Pendekatan ini memiliki keuntungan bahwa akses konteks statis "jelek" diapit dalam satu metode / kelas.Yang dapat Anda lakukan adalah
@Autowired
metode penyetel dan menyetelnya ke bidang statis baru.Ketika kacang diproses, Spring akan memasukkan sebuah
Foo
contoh implementasi ke dalam field contohfoo
. Ini kemudian akan memasukkanFoo
contoh yang sama ke dalamsetStaticFoo()
daftar argumen, yang akan digunakan untuk mengatur bidang statis.Ini adalah solusi yang buruk dan akan gagal jika Anda mencoba menggunakan
randomMethod()
sebelum Spring memproses instanceBoo
.sumber
setStaticFoo()
, tanpaFoo
parameter.Ini menyebalkan tetapi Anda bisa mendapatkan kacang dengan menggunakan
ApplicationContextAware
antarmuka. Sesuatu seperti :sumber
Ini dibangun berdasarkan jawaban @ Pavel , untuk memecahkan kemungkinan konteks Spring tidak diinisialisasi saat mengakses dari metode getBean statis:
Bagian penting di sini adalah
initContext
metodenya. Ini memastikan bahwa konteks akan selalu diinisialisasi. Tapi, perhatikan bahwa ituinitContext
akan menjadi poin pertikaian dalam kode Anda saat disinkronkan. Jika aplikasi Anda sangat diparalelkan (misalnya: bagian belakang situs dengan lalu lintas tinggi), ini mungkin bukan solusi yang baik untuk Anda.sumber
Gunakan AppContext. Pastikan Anda membuat kacang di file konteks Anda.
sumber