Vinnaren i pepparkakshustävlingen!
2023-06-16, 05:18
  #1
Medlem
bithaxs avatar
Som jag fattar det är det vissa saker som måste ligga som ”top-level-beans” i sping för att det ska funka som det är tänkt.

T.ex. när man sätter upp köer med rabbit mq ska exchange, queue och topic vara top level beans.

Mina frågor är då.

1. Kan man skapa top level beans programmatiskt i runtime på något sätt?

2. Finns det någon hirarki med beans i en bean och vad kan man göra med dem?

Det jag vill uppnå är t.ex att kunna sätta upp köer med en config fil. Då kan man ju inte deklarera beans med annoteringar eftersom man inte vet villka beans man kommer att ha när man kompilerar koden. Det är bara ett fiktivt exempel.

I C# så kan du göra kod som körs innan man bygger själva IOC containern. Då kan man ha kod som t.ex laddar config filer eller vad du vill och styr villka saker som ska injectas osv.
__________________
Senast redigerad av bithax 2023-06-16 kl. 05:23.
Citera
2023-06-16, 13:17
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av bithax
Som jag fattar det är det vissa saker som måste ligga som ”top-level-beans” i sping för att det ska funka som det är tänkt.

T.ex. när man sätter upp köer med rabbit mq ska exchange, queue och topic vara top level beans.

Mina frågor är då.

1. Kan man skapa top level beans programmatiskt i runtime på något sätt?

2. Finns det någon hirarki med beans i en bean och vad kan man göra med dem?

Det jag vill uppnå är t.ex att kunna sätta upp köer med en config fil. Då kan man ju inte deklarera beans med annoteringar eftersom man inte vet villka beans man kommer att ha när man kompilerar koden. Det är bara ett fiktivt exempel.

I C# så kan du göra kod som körs innan man bygger själva IOC containern. Då kan man ha kod som t.ex laddar config filer eller vad du vill och styr villka saker som ska injectas osv.
Fast konfigurationen ska väl bara innehålla anslutningsparametrar till din kö, inte själva köinitieringen som sådan, den kommer ju vara likadan oavsett miljö och oavsett vilken konfiguration du plockar in?

Vet inte om jag uppfattar problemet rätt här?
Citera
2023-06-16, 21:04
  #3
Medlem
bithaxs avatar
Citat:
Ursprungligen postat av Proton
Fast konfigurationen ska väl bara innehålla anslutningsparametrar till din kö, inte själva köinitieringen som sådan, den kommer ju vara likadan oavsett miljö och oavsett vilken konfiguration du plockar in?

Vet inte om jag uppfattar problemet rätt här?

Ja det är sant att konfigurationen inte ändras, därmed makes sense att hårdkoda den.
Men det är inte najs att ha alla köer i en fil. Jag har brutit ut det nu så att jag har 6 beans i en java fil per kö. T.ex. CreateOrderQueueConfig klassen skapar upp en exchange, en queue och en binding för create_order och en exhange, en queue och en binding för create_order_deadletter och kopplar ihop dem.

Men det är ändå inte så najs att jag bara kan anropa en metod createQueue("create_order"); i min kod utan jag måste ändå skapa den där klassen och deklarera de där 6 bönorna. Och jag hämtar ändå kö namnet från config osv.

Och därför tänkte jag att, det vore najs att kunna skapa bönorna i runtime.
Citera
2023-06-17, 09:23
  #4
Moderator
Protons avatar
Citat:
Ursprungligen postat av bithax
Ja det är sant att konfigurationen inte ändras, därmed makes sense att hårdkoda den.
Men det är inte najs att ha alla köer i en fil. Jag har brutit ut det nu så att jag har 6 beans i en java fil per kö. T.ex. CreateOrderQueueConfig klassen skapar upp en exchange, en queue och en binding för create_order och en exhange, en queue och en binding för create_order_deadletter och kopplar ihop dem.

Men det är ändå inte så najs att jag bara kan anropa en metod createQueue("create_order"); i min kod utan jag måste ändå skapa den där klassen och deklarera de där 6 bönorna. Och jag hämtar ändå kö namnet från config osv.

Och därför tänkte jag att, det vore najs att kunna skapa bönorna i runtime.
Finns väl nån BeanFactory som kan skapa upp bönorna åt dig på kommando tyckte jag jag såg nånstans när jag googlade, fast den kanske inte gör det jag tror den gör?

https://www.geeksforgeeks.org/spring-beanfactory/

Ingen aning om det hjälper i ditt fall?
Citera
2023-06-18, 22:18
  #5
Medlem
PissBusss avatar
Citat:
Ursprungligen postat av bithax
Ja det är sant att konfigurationen inte ändras, därmed makes sense att hårdkoda den.
Men det är inte najs att ha alla köer i en fil. Jag har brutit ut det nu så att jag har 6 beans i en java fil per kö. T.ex. CreateOrderQueueConfig klassen skapar upp en exchange, en queue och en binding för create_order och en exhange, en queue och en binding för create_order_deadletter och kopplar ihop dem.

Men det är ändå inte så najs att jag bara kan anropa en metod createQueue("create_order"); i min kod utan jag måste ändå skapa den där klassen och deklarera de där 6 bönorna. Och jag hämtar ändå kö namnet från config osv.

Och därför tänkte jag att, det vore najs att kunna skapa bönorna i runtime.

Låter som att det är 'application context' som inte startats på rätt sätt. Kolla av lite dokumentation om det och se om det kan stämma.
Citera
2023-06-21, 01:50
  #6
Medlem
Citat:
Ursprungligen postat av bithax
Som jag fattar det är det vissa saker som måste ligga som ”top-level-beans” i sping för att det ska funka som det är tänkt.

T.ex. när man sätter upp köer med rabbit mq ska exchange, queue och topic vara top level beans.

Mina frågor är då.

1. Kan man skapa top level beans programmatiskt i runtime på något sätt?

2. Finns det någon hirarki med beans i en bean och vad kan man göra med dem?

Det jag vill uppnå är t.ex att kunna sätta upp köer med en config fil. Då kan man ju inte deklarera beans med annoteringar eftersom man inte vet villka beans man kommer att ha när man kompilerar koden. Det är bara ett fiktivt exempel.

I C# så kan du göra kod som körs innan man bygger själva IOC containern. Då kan man ha kod som t.ex laddar config filer eller vad du vill och styr villka saker som ska injectas osv.

Om du vill ändra i runtime, då kan du sätta upp en Config Server där din rabbit conf finns.

Det du då kan göra är att ändra konfigurationen, sen trigga en refresh så kommer din applikation att refresha bönorna i runtime. T.e.x sätta på/stänga av flödet. Det beror lite på exakt vad det är du vill ändra i runtime.

https://societe-generale.github.io/r...-boot-starter/
Där finns det exempel på hur confen kan se ut.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback