2015-10-24 8 views
0

Я новичок в 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).

+2

Если вы хотите сделать это 'The Spring Way' вы должны' читать docs'. Однако, поскольку вы заявили о своем новом для Spring, я * настоятельно рекомендую начать с [Spring Boot] (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql .html) –

+0

Uhhh. Некоторое время я использовал Spring, но эти классы заставляли меня сомневаться в моем уровне знаний по этой теме. –

+0

Что касается совета по Spring Boot: я бы не советовал кому-то начать с этого, не понимая по крайней мере основных понятий DI. Начиная с «вершины», это заставляет людей думать, что это чистая магия под капотом. –

ответ

0

Если вы хотите сделать это весной, вам нужно объявить определение компонента в контексте приложения xml для создания источника данных и ввести класс.

В качестве альтернативы вы можете создать источник данных с помощью пружины jdbc. Проверить эту ссылку:

http://examples.javacodegeeks.com/enterprise-java/spring/jdbc/create-data-source-for-jdbctemplate/

Смежные вопросы