Я новичок в Spring. Изучая его, я решил поиграть с JDBC.Spring JDBC Injecting DataSource в другой компонент
обрывали, у меня есть два класса:
Класс 1 содержит следующее:
import javax.sql.DataSource;
public class class1 extends class2 {
private Connection con;
private DataSource dataSource;
public void setDataSource(DataSource ds) {
dataSource = ds;
}
public void getConnection(){
login(username,password,url);
con = dataSource.getConnection();
}
}
класса 1, в основном, когда я прошу пользователя ввести имя пользователя/пароль/Ur, а затем вызвать метод из class2 передавая эти детали. Я хочу добавить значение DataSource из этого класса в класс1. До сих пор это мой код class2:
import javax.sql.DataSource;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
abstract class class2{
public void login(String username, String password, String url){
GenericApplicationContext context = new GenericApplicationContext();
DefaultListableBeanFactory factory = (DefaultListableBeanFactory) context.getBeanFactory();
BeanDefinitionBuilder bean1 = BeanDefinitionBuilder
.rootBeanDefinition("org.springframework.jdbc.datasource.DriverManagerDataSource");
bean1.addPropertyReference("driverClassName", "dataSource");
bean1.addPropertyValue("driverClassName", "com.mysql.jdbc.Driver");
bean1.addPropertyReference("url", "dataSource");
bean1.addPropertyValue("url", "url");
bean1.addPropertyReference("username", "dataSource");
bean1.addPropertyValue("username", username);
bean1.addPropertyReference("password", "dataSource");
bean1.addPropertyValue("password", password);
bean1.registerBeanDefinition("dataSource", bean1.getBeanDefinition());
BeanDefinitionBuilder bean2 = BeanDefinitionBuilder.rootBeanDefinition("class2");
bean2.addPropertyValue("dataSource", "getCon");
context.refresh();
bean2.addPropertyValue("dataSource", new RuntimeBeanReference("dataSource"));
factory.registerBeanDefinition("getCon", bean2.getBeanDefinition());
}
}
Однако, когда я пытаюсь выполнить метод getConnection()
из class1, это дает NPE. Может ли кто-нибудь сказать мне правильный способ сделать это?
Кроме того, я хочу выполнить эту задачу программно (не используя xml).
Если вы хотите сделать это 'The Spring Way' вы должны' читать docs'. Однако, поскольку вы заявили о своем новом для Spring, я * настоятельно рекомендую начать с [Spring Boot] (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql .html) –
Uhhh. Некоторое время я использовал Spring, но эти классы заставляли меня сомневаться в моем уровне знаний по этой теме. –
Что касается совета по Spring Boot: я бы не советовал кому-то начать с этого, не понимая по крайней мере основных понятий DI. Начиная с «вершины», это заставляет людей думать, что это чистая магия под капотом. –