Инъекция зависимостей Kotlin в Spring - PullRequest
0 голосов
/ 25 сентября 2018

Я узнаю о spring data и потому что я также изучаю kotlin, поэтому я решил поработать с kotlin во время весеннего обучения.Поэтому я хочу спросить, как мы можем реализовать setter внедрение зависимостей в kotlin?как в Java, мы можем это, как показано ниже.

@Component
public class StudentDaoImp {

    public DataSource dataSource;

    public JdbcTemplate jdbcTemplate;

    public DataSource getDataSource() {
        return dataSource;
    }

    @Autowired
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
}

А вот мой файл spring.xml.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">


    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.h2.Driver" />
        <property name="url" value="jdbc:h2:~/test" />
    </bean>

    <context:component-scan base-package="com.package.*" />
</beans>

Затем я попробовал его в kotlin.

@Component
class StudentDao {

    @Autowired
    lateinit var dataSource: DataSource

    var jt = JdbcTemplate(dataSource)

}

Тогда я получаю исключение.

Причина: kotlin.UninitializedPropertyAccessException: свойство данных lateinit не было инициализировано

Я знаю об этом исключении, потому что я 'м, используя dataSource до того, как autowired произойдет.Так что я тоже попробовал это.

@Autowired
fun setDataSource(dataSource: DataSource) {
    this.jt = JdbcTemplate(dataSource)
}

Это тоже ошибка, потому что у JVM уже есть эта подпись за сценой.

Так как я могу инициализировать JdbcTemplate спараметр dataSource?

Примечание: Мне нужен только пример / решение на стороне кода.Я знаю о решении XML.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Хотя я считаю, что ответ zapl правильный, я бы также посоветовал вам рассмотреть введение аргументов конструктора:

@Component
class StudentDao @Autowired constructor(
    private val dataSource: DataSource
) {

    private val jt = JdbcTemplate(dataSource)

}

Таким образом, вы можете получить неизменяемые переменные без предупреждения о поздней инициализации.

Кроме того, если вам требуется переменная dataSource только для инициализации jt, вы можете удалить ключ val из конструктора.

0 голосов
/ 25 сентября 2018

Как и в Java, вы не можете использовать свойства, которые вводятся после создания при времени создания.В Java вы получите NullPointerException, когда будете делать эквивалент, например,

@Autowired
private Datasource datasource;
private JdbcTemplate jt = new JdbcTemplace(dataSource);

Но вы можете позволить Spring вызывать метод по вашему выбору после того, как он введет все:

lateinit var jt: JdbcTemplate
@PostConstruct
fun initAfterAutowireIsDone() {
    jt = JdbcTemplate(dataSource)
}

Существует также интерфейс InitializingBean, который можно использовать вместо аннотации.То же самое работает в Java.

Другой вариант, который у вас есть в Kotlin, - это использовать свойство lazy, когда вы гарантируете, что не обращаетесь к нему во время создания экземпляра.

val jt: JdbcTemplate by lazy { JdbcTemplate(dataSource) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...