Spring IoC

IoC β€” Inversion of Control, Ρ‚Π°ΠΊ ΠΆΠ΅ извСстноС ΠΊΠ°ΠΊ Dependency Injection (DI) β€” процСсс, согласно ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ свои зависимости, Ρ‚.Π΅. ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, Ρ‡Π΅Ρ€Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ конструктора/Ρ„Π°Π±Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠ»ΠΈ свойства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ установлСны ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Ρ‹ Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ. Π—Π°Ρ‚Π΅ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ inject(Π΄Π°Π»Π΅Π΅ "внСдряСт") эти зависимости ΠΏΡ€ΠΈ создании Π±ΠΈΠ½Π°. Π­Ρ‚ΠΎΡ‚ процСсс ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½, поэтому ΠΈ Π½Π°Π·Π²Π°Π½ Inversion of Control, Ρ‚.ΠΊ. Π±ΠΈΠ½ сам ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ располоТСниС своих зависимостСй, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ прямоС созданиС классов ΠΈΠ»ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠ°ΠΊ шаблон Service Locator.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ Spring Framework IoC ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ org.springframework.beans ΠΈ org.springframework.context. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ BeanFactory прСдоставляСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ Π»ΡŽΠ±Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ApplicationContext - наслСдуСт нитСрфСйс BeanFactory ΠΈ добавляСт Π±ΠΎΠ»Π΅Π΅ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Π—Π°ΠΌΠ΅Ρ‡Π΅Π½ΠΈΠ΅: Аннотации @Autowired, @Inject, @Resource ΠΈ @Value ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Spring Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ BeanPostProcessor, поэтому Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π² своих собствСнных BeanPostProcessor ΠΈ BeanFactoryPostProcessor, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ лишь явной ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· XML ΠΈΠ»ΠΈ @Bean ΠΌΠ΅Ρ‚ΠΎΠ΄.

Настройка IoC ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

@Configuration & @Bean

ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ°ΠΌΠΈ ΠΈ частями Java-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ IoC ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ классы с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Configuration ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Bean. Аннотация @Bean ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для указания Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ создаСт, настраиваСт ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, управляСмый Spring IoC ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ. Π’Π°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π² классах с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Configuration, Ρ‚Π°ΠΊ ΠΈ Π² классах с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Component(ΠΈΠ»ΠΈ Π΅Ρ‘ наслСдниках). Класс с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Configuration Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ являСтся источником опрСдСлСния Π±ΠΈΠ½ΠΎΠ². Бамая ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ°Ρ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

package lessons;

import org.springframework.context.annotation.Configuration;

/**
 * ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ класс Spring IoC ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°
 */
@Configuration
public class LessonsConfiguration {
}

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ настройкС ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ Spring IoC ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ApplicationContext, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ зависимостСй. Для ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Java-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ примСняСтся AnnotationConfigApplicationContext, Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ пСрСдаСтся класс, Π»ΠΈΠ±ΠΎ список классов с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Configuration, Π»ΠΈΠ±ΠΎ с любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ JSR-330, Π² Ρ‚ΠΎΠΌ числС ΠΈ @Component:

public class Starter {

    private static final Logger logger = LogManager.getLogger(Starter.class);

    public static void main(String[] args) {
        logger.info("Starting configuration...");

        ApplicationContext context = new AnnotationConfigApplicationContext(LessonsConfiguration.class);
    }
}

@Import

Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ строится ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅, раздСлСнная ΠΏΠΎ слоям, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ DAO, сСрвисы, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ ΠΈ Π΄Ρ€. Боздавая ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π΅Ρ‘ Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° составныС части, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΠ°Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ вашСго прилоТСния. Для этого Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Import, Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ классы с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Configuration, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

// src/main/java/lessons/AnotherConfiguration.java
@Configuration
public class AnotherConfiguration {
    @Bean
    BeanWithDependency beanWithDependency() {
        return new BeanWithDependency();
    }
}

// src/main/java/lessons/LessonsConfiguration.java
@Configuration
@ComponentScan
@Import(AnotherConfiguration.class)
public class LessonsConfiguration {
    @Bean
    GreetingService greetingService() {
        return new GreetingServiceImpl();
    }
}

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ контСкста Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ AnotherConfiguration, всС останСтся Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΈ Π±Ρ‹Π»ΠΎ:

public class Starter {

    private static final Logger logger = LogManager.getLogger(Starter.class);

    public static void main(String[] args) {
        logger.info("Starting configuration...");

        ApplicationContext context = new AnnotationConfigApplicationContext(LessonsConfiguration.class);
        GreetingService greetingService = context.getBean(GreetingService.class);
        BeanWithDependency withDependency = context.getBean(BeanWithDependency.class);
        logger.info(greetingService.sayGreeting()); // "Greeting, user!"
        logger.info(withDependency.printText()); // "Some text!"
    }
}

@Autowired

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ случаи, ΠΊΠΎΠ³Π΄Π° Π±ΠΈΠ½ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ Π±ΠΈΠ½Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ конфигурация являСтся источником опрСдСлСния Π±ΠΈΠ½ΠΎΠ², Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π½Π΅ являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, достаточно ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π΅ класса ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Autowired(Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описано Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Π»Π°Π²Π΅):

// src/main/java/lessons/AnotherConfiguration.java
@Configuration
public class AnotherConfiguration {

    @Autowired GreetingService greetingService;

    @Bean
    BeanWithDependency beanWithDependency() {
        //Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Π΅Π»Π°Π΅ΠΌ с greetingService...
        return new BeanWithDependency();
    }
}

// src/main/java/lessons/LessonsConfiguration.java
@Configuration
@ComponentScan
@Import(AnotherConfiguration.class)
public class LessonsConfiguration {
    @Bean
    GreetingService greetingService() {
        return new GreetingServiceImpl();
    }
}

@Profile ΠΈ @Conditional

Π­Ρ‚ΠΎ способ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ SpringBoot, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π±ΠΈΠ½ΠΎΠ² ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… условиях. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ с Π₯Π°Π±Ρ€Π°.

РСализуя интСрфСйс Condition, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ свои ΠΏΡ€Π°Π²ΠΈΠ»Π° опрСдСлСния Π±ΠΈΠ½ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΠ½, Ссли Π΅Ρ‰Π΅ Π½Π΅ зарСгистрирован Π΄Ρ€ΡƒΠ³ΠΎΠΉ:

public class UserDAOBeanNotPresentsCondition implements Condition
{
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata metadata)
    {
         UserDAO userDAO = conditionContext.getBeanFactory().getBean(UserDAO.class);
         return (userDAO == null);
    }
}

XML ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

ΠšΠ»Π°ΡΡΡ‹ с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Configuration Π½Π΅ стрСмятся Π½Π° 100% Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° XML, ΠΏΡ€ΠΈ этом, Ссли Π²Π°ΠΌ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΠ»ΠΈ имССтся какая-Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² использовании XML ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎ ΠΊ вашСй Java-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @ImportResource, Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ΅ Π²Π°ΠΌ количСство XML-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ. Выглядит это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ способом:

// src/main/java/lessons/LessonsConfiguration.java
@Configuration
@ImportResource("classpath:/lessons/xml-config.xml")
public class LessonsConfiguration {
    @Value("${jdbc.url}")
    String url;
    //...
}

// src/main/java/lessons/xml-config.xml
<beans>
    <context:property-placeholder location="classpath:/jdbc.properties"/>
</beans>

// jdbc.properties
jdbc.url=jdbc:hsqldb:hsql://localhost/xdb

Last updated