Dowiązanie własnego Beana w construktorze komponentu - Spring.

0

Dobry.
Jest możliwość wstrzyknięcia własnego beana do konstruktora komponentu?
Tworze połączenie z bazą danych i zwracany jest obiekt sesji. Następnie tego obiektu potrzebuję w klasie DAO.
Wygląda to tak:
Konfiguracja:

@Configuration
public class DatabaseConfig {

    @Autowired
    Environment env;

    private Cluster cluster;

    private Session session;

    public DatabaseConfig()
    {
        cluster = Cluster.builder()
                .addContactPoint("127.0.0.1")
                .build();
        Metadata metadata = cluster.getMetadata();
        System.out.printf("Connected to cluster: %s\n",
                metadata.getClusterName());
        for ( Host host : metadata.getAllHosts() ) {
            System.out.printf("Datacenter: %s; Host: %s; Rack: %s\n",
                    host.getDatacenter(), host.getAddress(), host.getRack());
        }
        session = cluster.connect("app");
        session.init();
    }

    @Bean
    public Cluster getCluster() {
        return cluster;
    }

    @Bean
    public Session getSession() {
        return session;
    }
}

DAO:

@Component
public class ServiceDaoImpl {

    @Autowired
    Session session;

    private Mapper<Service> mapper;

    private MappingManager mappingManager;

    private ServiceAccessor accessor;

    public ServiceDaoImpl() {
        //tu mi jest potrzebny obiekt sesji
        mappingManager = getMappingManager();
        mapper = getMapper();
    }
    private MappingManager getMappingManager() {
        return new MappingManager(session);
    }
    ....

W metodzie testowej opatrzonej adnotacją @PostConstruct obiekt sesji już jest i mogę go używać.
Da się jakoś zrobić aby wymusić kolejność tworzenia komponentów lub coś innego aby obiekt sesji był już utworzony gdy go potrzebuję?

1

Ale kolejność tutaj nie ma nic do rzeczy. Spring nie jest magikiem jakimś, on też musi zawołać konstruktor, a potem poustawiać te pola! Niemniej możesz po prostu wstrzykiwać tego beana przez konstruktor i wtedy osiągniesz dokładnie taki efekt jakiego oczekujesz.

@Component
public class ServiceDaoImpl {
 
    
    private final Session session;
    private final Mapper<Service> mapper;
    private final MappingManager mappingManager;
    private final ServiceAccessor accessor;
 
    @Autowired
    public ServiceDaoImpl(Session session) {
        this.session = session;
        mappingManager = getMappingManager();
        mapper = getMapper();
    }
    private MappingManager getMappingManager() {
        return new MappingManager(session);
    }
    ....

1 użytkowników online, w tym zalogowanych: 0, gości: 1