BAEL-359: Introduction to Spring Groovy Configuration (#12864)
* BAEL-359: Introduction to Spring Groovy Configuration * BAEL-359: Removed unused import * BAEL-359: Moved groovy files under src/main/groovy * BAEL-359: Upgraded Groovy version to 3.0.13
This commit is contained in:
parent
6ba4332f87
commit
1cd1a6cf24
|
@ -27,6 +27,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.groovy</groupId>
|
<groupId>org.codehaus.groovy</groupId>
|
||||||
<artifactId>groovy</artifactId>
|
<artifactId>groovy</artifactId>
|
||||||
|
<version>${groovy.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
@ -70,6 +71,7 @@
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<start-class>com.baeldung.springwithgroovy.SpringBootGroovyApplication</start-class>
|
<start-class>com.baeldung.springwithgroovy.SpringBootGroovyApplication</start-class>
|
||||||
|
<groovy.version>3.0.13</groovy.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.baeldung.springgroovyconfig
|
||||||
|
|
||||||
|
|
||||||
|
beans {
|
||||||
|
|
||||||
|
// Declares a simple bean with a constructor argument
|
||||||
|
companyBean(Company, name: 'ABC Inc');
|
||||||
|
|
||||||
|
// The same bean can be declared using a simpler syntax: beanName(type, constructor-args)
|
||||||
|
company String, 'XYZ Inc'
|
||||||
|
|
||||||
|
// Declares an employee object with setters referencing the previous bean
|
||||||
|
employee(Employee) {
|
||||||
|
firstName = 'Lakshmi'
|
||||||
|
lastName = 'Priya'
|
||||||
|
|
||||||
|
// References to other beans can be done in both the ways
|
||||||
|
company = company // or vendor = ref('company')
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allows import of other configuration files, both XML and Groovy
|
||||||
|
importBeans('classpath:xml-bean-config.xml')
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package com.baeldung.springgroovyconfig;
|
||||||
|
|
||||||
|
interface NotificationService {
|
||||||
|
|
||||||
|
String getMessage();
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
package com.baeldung.springgroovyconfig;
|
||||||
|
|
||||||
|
class NotificationServiceImpl implements NotificationService {
|
||||||
|
|
||||||
|
String message;
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.baeldung.springgroovyconfig
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean
|
||||||
|
import org.springframework.context.annotation.Configuration
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
class SpringGroovyConfiguration {
|
||||||
|
|
||||||
|
public static void main(String[] args) { }
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
List<String> fruits() {
|
||||||
|
[
|
||||||
|
'Apple',
|
||||||
|
'Orange',
|
||||||
|
'Banana',
|
||||||
|
'Grapes'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
Map<Integer, String> rankings() {
|
||||||
|
[1: 'Gold', 2: 'Silver', 3: 'Bronze']
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
package com.baeldung.springgroovyconfig;
|
||||||
|
|
||||||
|
public class Company {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private String contact;
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
public Company() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Company(String name) {
|
||||||
|
super();
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContact() {
|
||||||
|
return contact;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContact(String contact) {
|
||||||
|
this.contact = contact;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.baeldung.springgroovyconfig;
|
||||||
|
|
||||||
|
public class Employee {
|
||||||
|
|
||||||
|
private String firstName;
|
||||||
|
private String lastName;
|
||||||
|
private Company company;
|
||||||
|
|
||||||
|
public String getFirstName() {
|
||||||
|
return firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFirstName(String firstName) {
|
||||||
|
this.firstName = firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastName() {
|
||||||
|
return lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastName(String lastName) {
|
||||||
|
this.lastName = lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Company getCompany() {
|
||||||
|
return company;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCompany(Company company) {
|
||||||
|
this.company = company;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
class StringJoiner {
|
||||||
|
|
||||||
|
String join(String arg1, String arg2) {
|
||||||
|
arg1 + arg2;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
arg1 + arg2;
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?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:lang="http://www.springframework.org/schema/lang"
|
||||||
|
xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
|
||||||
|
http://www.springframework.org/schema/lang https://www.springframework.org/schema/lang/spring-lang.xsd">
|
||||||
|
|
||||||
|
<lang:groovy id="notification" script-source="file:src/main/groovy/com/baeldung/springgroovyconfig/NotificationServiceImpl.groovy" refresh-check-delay="10000">
|
||||||
|
<lang:property name="message" value="Hello" />
|
||||||
|
</lang:groovy>
|
||||||
|
|
||||||
|
<lang:groovy id="notifier">
|
||||||
|
<lang:inline-script>
|
||||||
|
|
||||||
|
package com.baeldung.springgroovyconfig;
|
||||||
|
import com.baeldung.springgroovyconfig.NotificationService;
|
||||||
|
|
||||||
|
class Notifier implements NotificationService {
|
||||||
|
String message
|
||||||
|
}
|
||||||
|
|
||||||
|
</lang:inline-script>
|
||||||
|
<lang:property name="message" value="Have a nice day!" />
|
||||||
|
</lang:groovy>
|
||||||
|
|
||||||
|
</beans>
|
|
@ -0,0 +1,144 @@
|
||||||
|
package com.baeldung.springgroovyconfig;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.fail;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
|
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||||
|
import org.springframework.context.support.GenericGroovyApplicationContext;
|
||||||
|
import org.springframework.util.ResourceUtils;
|
||||||
|
|
||||||
|
import groovy.lang.Binding;
|
||||||
|
import groovy.lang.GroovyObject;
|
||||||
|
import groovy.util.GroovyScriptEngine;
|
||||||
|
|
||||||
|
class SpringGroovyConfigUnitTest {
|
||||||
|
|
||||||
|
private static final String FILE_NAME = "GroovyBeanBuilder.groovy";
|
||||||
|
private static final String FILE_PATH = "src/main/groovy/com/baeldung/springgroovyconfig/";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenGroovyConfigFile_whenCalledWithBeanName_thenReturnCompanyBean() {
|
||||||
|
try (GenericGroovyApplicationContext ctx = new GenericGroovyApplicationContext()) {
|
||||||
|
ctx.load("file:" + getPath(FILE_PATH) + FILE_NAME);
|
||||||
|
ctx.refresh();
|
||||||
|
|
||||||
|
Company company = (Company) ctx.getBean("companyBean");
|
||||||
|
|
||||||
|
assertEquals("ABC Inc", company.getName());
|
||||||
|
} catch (BeansException | IllegalStateException e) {
|
||||||
|
fail(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenGroovyConfigFile_whenCalledWithRefBean_thenReturnEmployeeBean() {
|
||||||
|
try (GenericGroovyApplicationContext ctx = new GenericGroovyApplicationContext()) {
|
||||||
|
ctx.load("file:" + getPath(FILE_PATH) + FILE_NAME);
|
||||||
|
ctx.refresh();
|
||||||
|
|
||||||
|
Employee employee = ctx.getBean(Employee.class);
|
||||||
|
|
||||||
|
assertEquals("Lakshmi", employee.getFirstName());
|
||||||
|
assertEquals("Priya", employee.getLastName());
|
||||||
|
assertEquals("XYZ Inc", employee.getCompany()
|
||||||
|
.getName());
|
||||||
|
} catch (BeansException | IllegalStateException e) {
|
||||||
|
fail(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Test
|
||||||
|
void givenGroovyFileWithSpringAnnotations_whenCalledWithBeanName_thenReturnValidBean() {
|
||||||
|
|
||||||
|
try (AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();) {
|
||||||
|
ctx.register(SpringGroovyConfiguration.class);
|
||||||
|
ctx.refresh();
|
||||||
|
|
||||||
|
List<String> fruits = (List<String>) ctx.getBean("fruits");
|
||||||
|
|
||||||
|
assertNotNull(fruits);
|
||||||
|
assertTrue(fruits.size() == 4);
|
||||||
|
assertEquals("Apple", fruits.get(0));
|
||||||
|
} catch (BeansException | IllegalStateException e) {
|
||||||
|
fail(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenGroovyBeanConfiguredInXml_whenCalledWithBeanName_thenReturnValidBean() {
|
||||||
|
try (ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("groovy-xml-config.xml")) {
|
||||||
|
ctx.refresh();
|
||||||
|
|
||||||
|
NotificationService notifier = (NotificationService) ctx.getBean("notification");
|
||||||
|
|
||||||
|
assertEquals("Hello", notifier.getMessage());
|
||||||
|
} catch (BeansException | IllegalStateException e) {
|
||||||
|
fail(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenGroovyBeanConfiguredAsInlineScript_whenCalledWithBeanName_thenReturnValidBean() {
|
||||||
|
try (ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("groovy-xml-config.xml")) {
|
||||||
|
ctx.refresh();
|
||||||
|
|
||||||
|
NotificationService notifier = (NotificationService) ctx.getBean("notifier");
|
||||||
|
|
||||||
|
assertEquals("Have a nice day!", notifier.getMessage());
|
||||||
|
} catch (BeansException | IllegalStateException e) {
|
||||||
|
fail(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Test
|
||||||
|
void givenGroovyScript_whenCalledWithScriptEngine_thenReturnsResult() {
|
||||||
|
try {
|
||||||
|
GroovyScriptEngine engine = new GroovyScriptEngine(ResourceUtils.getFile("file:src/main/resources/")
|
||||||
|
.getAbsolutePath(), this.getClass().getClassLoader());
|
||||||
|
Class<GroovyObject> joinerClass = engine.loadScriptByName("StringJoiner.groovy");
|
||||||
|
GroovyObject joiner = joinerClass.getDeclaredConstructor()
|
||||||
|
.newInstance();
|
||||||
|
Object result = joiner.invokeMethod("join", new Object[] { "Mr.", "Bob" });
|
||||||
|
|
||||||
|
assertEquals("Mr.Bob", result.toString());
|
||||||
|
} catch (Exception e) {
|
||||||
|
fail(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenGroovyScript_whenCalledWithBindingObject_thenReturnsResult() {
|
||||||
|
try {
|
||||||
|
GroovyScriptEngine engine = new GroovyScriptEngine(ResourceUtils.getFile("file:src/main/resources/")
|
||||||
|
.getAbsolutePath(), this.getClass().getClassLoader());
|
||||||
|
Binding binding = new Binding();
|
||||||
|
binding.setVariable("arg1", "Mr.");
|
||||||
|
binding.setVariable("arg2", "Bob");
|
||||||
|
Object result = engine.run("StringJoinerScript.groovy", binding);
|
||||||
|
|
||||||
|
assertEquals("Mr.Bob", result.toString());
|
||||||
|
} catch (Exception e) {
|
||||||
|
fail(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getPath(String filePath) {
|
||||||
|
String pathPart = new File(".").getAbsolutePath();
|
||||||
|
pathPart = pathPart.replace(".", "");
|
||||||
|
pathPart = pathPart.replace("\\", "/");
|
||||||
|
pathPart = pathPart + filePath;
|
||||||
|
|
||||||
|
return pathPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue