2014-12-13 2 views
0

Я создал объект базы данных в соответствии с шаблоном singleton. Объект базы данных содержит 2 метода: connect() и update().convert Singelton to Java Spring

Я хочу конвертировать этот singelton в Spring bean.

Таким образом, я создал файл 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" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <bean id="MySingeltonDB" 
     class="SingeltonDBVersion2.SingeltonDB" factory-method="getInstance"></bean> 

</beans> 

ADN класс SingeltonDB:

package SingeltonDBVersion2; 
public class SingeltonDB { 
    private static DBconnImpl db = null; 
    private static SingeltonDB singalDb = null; 

    private SingeltonDB(String username, String password) { 
     db = new DBconnImpl(); 
    } 

    public static boolean isOpen() { 
     return (db != null); 
    } 

    public synchronized static SingeltonDB getInstance(String username, 
      String password) throws Exception { 

     if (db != null) { 
      return singalDb; 
     } 
     System.out.println("The database is now open"); 
     singalDb = new SingeltonDB(username, password); 
     db.connect(username, password); 
     System.out.println("The database was connected"); 
     return singalDb; 
    } 

    public void create(String tableName) throws Exception { 
     db.create(tableName); 
    } 

    public User query(String tableName, int rowID) throws Exception { 
     if (db == null) { 
      System.out.println("Error: the database is not open"); 
      return null; 
     } 
     return (db.query(tableName, rowID)); 
    } 

    public void update(String tableName, User user) throws Exception { 
     if (db == null) { 
      System.out.println("Error: the database is not open"); 
      return; 
     } 
     db.update(tableName, user); 
    } 

} 

и это Основной класс:

package SingeltonDBVersion2; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     ApplicationContext context =new ClassPathXmlApplicationContext("spring.xml"); 

    } 
} 

, но я получаю эта ошибка: Ошибка при создании bean-компонента с именем «MySingeltonDB» defi ned in resource path resource [spring.xml]: Недопустимая зависимость, выраженная через аргумент конструктора с индексом 1 типа [java.lang.String]: Неоднозначные типы аргументов фабричного метода. Вы указали правильные ссылки на bean-компоненты в качестве аргументов фабричного метода?

Может кто-нибудь, пожалуйста, помогите мне? Я новичок в весне, поэтому я, возможно, не настроил все протрели ... Спасибо!

+0

Хотя он упоминает конструктор (который сбивает с толку), сообщение указывает на то, что проблема: вы Бесполезный Не указывайте аргументы пользователя/пароля для заводского метода. –

+1

Пример доступен [здесь] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-some-examples). –

+0

Спасибо! Другой вопрос. У меня есть эта строка: \t \t ApplicationContext db = new ClassPathXmlApplicationContext ("spring.xml"); , и я хочу, чтобы db действовал как объект SingeltonDB. Смысл я хочу сделать db.updat() .. Я это решаю? – Matoy

ответ

1

Когда пружина, создающая один синглтон, будет использовать метод getInstance, но этот метод ожидает два параметра: имя_пользователя и пароль. Но эти параметры не находятся в конфигурации Spring. Вы должны добавить:

<bean id="MySingeltonDB" 
     class="SingeltonDBVersion2.SingeltonDB" factory-method="getInstance"> 
    <constructor-arg value="userName" /> 
    <constructor-arg value="password" /> 
</bean> 

Тогда вы можете получить MySingletonDB боб из контекста приложения:

ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
SingletonDB singletonDB = (SingletonDB)context.getBean("MySingeltonDB"); 
singletonDB.update(paramters); 
+0

Спасибо! Другой вопрос. У меня есть эта строка: \t \t ApplicationContext db = new ClassPathXmlApplicationContext ("spring.xml"); , и я хочу, чтобы db действовал как объект SingeltonDB. Смысл я хочу сделать db.updat() .. Я это решаю? – Matoy

+0

Я не уверен, в чем проблема. 'db' не инициализируется? или просто null? В любом случае я бы переместил db.connect в конструктор - я вижу его там логически. –

+0

У меня в руке есть объект ApplicationContext (который создает новый SingeltonDB). Я хочу получить ссылку на этот объект, который был только что создан (SingeltonDB), поэтому я могу сделать обновление на нем – Matoy