Wie man DataSource in JdbcDaoSupport automatisiert

So verdrahten Sie DataSource automatisch in JdbcDaoSupport

Eine einfache DAO-Klasse erweitertJdbcDaoSupport, aber da keine "dataSource" eingefügt oder @autowired ist, ist die MethodesetDataSource endgültig und kann nicht überschrieben werden.

UserDetailsDaoImpl.java

package com.example.users.dao;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

@Repository
public class UserDetailsDaoImpl extends JdbcDaoSupport implements UserDetailsDao {

    //Error, cannot override the final method from JdbcDaoSupport
    @Autowired
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

}

Lösung

Um dies schnell zu beheben, werden@PostConstruct verwendet, umdataSourcewie folgt zu injizieren:

UserDetailsDaoImpl.java

package com.example.users.dao;
import javax.sql.DataSource;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

@Repository
public class UserDetailsDaoImpl extends JdbcDaoSupport implements UserDetailsDao {

    @Autowired
    private DataSource dataSource;

    @PostConstruct
    private void initialize() {
        setDataSource(dataSource);
    }

}

Alternativ können Sie eine eigene Implementierung der KlasseJdbcDaoSupporterstellen und alles tun, was Sie wollen. Tauchen Sie in den Quellcode vonJdbcDaoSupport ein. Es ist nur eine einfache Hilfsklasse, umjdbcTemplate zu erstellen.

Note
In Spring io befindet sich einjira report, um die endgültigen Modifikatoren zu entfernen, aber die Auflösung ist "wird nicht behoben".