From 46deaff947f46f297c35dd4824d7e4ed0a0c6fb9 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Tue, 28 Jan 2020 19:44:21 -0500 Subject: [PATCH] BAEL-3744: Added examples of how design patterns are used in the Spring framework. --- spring-core-3/pom.xml | 144 ++++++++++-------- .../spring/patterns/factory/Application.java | 19 +++ .../patterns/factory/ApplicationConfig.java | 9 ++ .../baeldung/spring/patterns/factory/Bar.java | 20 +++ .../baeldung/spring/patterns/factory/Foo.java | 7 + .../spring/patterns/proxy/Application.java | 12 ++ .../baeldung/spring/patterns/proxy/Book.java | 18 +++ .../spring/patterns/proxy/BookController.java | 18 +++ .../spring/patterns/proxy/BookManager.java | 18 +++ .../spring/patterns/proxy/BookRepository.java | 11 ++ .../patterns/singleton/Application.java | 12 ++ .../spring/patterns/singleton/Book.java | 4 + .../patterns/singleton/BookController.java | 19 +++ .../patterns/singleton/BookRepository.java | 17 +++ .../patterns/singleton/LibraryController.java | 18 +++ .../spring/patterns/template/Book.java | 32 ++++ .../patterns/template/BookRowMapper.java | 21 +++ 17 files changed, 335 insertions(+), 64 deletions(-) create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Application.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/ApplicationConfig.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Bar.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Foo.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Application.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Book.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookController.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookManager.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookRepository.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Application.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Book.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookController.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookRepository.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/LibraryController.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/template/Book.java create mode 100644 spring-core-3/src/main/java/com/baeldung/spring/patterns/template/BookRowMapper.java diff --git a/spring-core-3/pom.xml b/spring-core-3/pom.xml index cd82f23320..ac6d1b2b3b 100644 --- a/spring-core-3/pom.xml +++ b/spring-core-3/pom.xml @@ -1,72 +1,88 @@ - 4.0.0 - spring-core-3 - spring-core-3 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + spring-core-3 + spring-core-3 - - com.baeldung - parent-spring-5 - 0.0.1-SNAPSHOT - ../parent-spring-5 - + + com.baeldung + parent-spring-5 + 0.0.1-SNAPSHOT + ../parent-spring-5 + - - - org.springframework - spring-beans - ${spring.version} - - - org.springframework - spring-context - ${spring.version} - - - org.springframework - spring-core - ${spring.version} - - - javax.annotation - javax.annotation-api - ${annotation-api.version} - - - org.springframework - spring-test - ${spring.version} - test - - - org.junit.jupiter - junit-jupiter-engine - ${junit-jupiter.version} - test - - - org.junit.jupiter - junit-jupiter-api - ${junit-jupiter.version} - test - - + + + org.springframework.boot + spring-boot-starter-web + ${spring.boot.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-core + ${spring.version} + + + javax.annotation + javax.annotation-api + ${annotation-api.version} + + + org.springframework + spring-test + ${spring.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven.surefire.version} - - - + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven.surefire.version} + + + - - 2.22.1 - 1.3.2 - + + 2.22.1 + 1.3.2 + 2.2.2.RELEASE + \ No newline at end of file diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Application.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Application.java new file mode 100644 index 0000000000..8f0134d83c --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Application.java @@ -0,0 +1,19 @@ +package com.baeldung.spring.patterns.factory; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +public class Application { + + @SuppressWarnings("resource") + public static void main(String[] args) { + + ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class); + + Foo foo = context.getBean(Foo.class); + Bar bar = context.getBean(Bar.class, "Some name"); + + System.out.println(foo); + System.out.println("Bar's name: " + bar.getName()); + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/ApplicationConfig.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/ApplicationConfig.java new file mode 100644 index 0000000000..626947cfd5 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/ApplicationConfig.java @@ -0,0 +1,9 @@ +package com.baeldung.spring.patterns.factory; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan(basePackageClasses = ApplicationConfig.class) +public class ApplicationConfig { +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Bar.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Bar.java new file mode 100644 index 0000000000..8bd742c481 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Bar.java @@ -0,0 +1,20 @@ +package com.baeldung.spring.patterns.factory; + +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class Bar { + + private String name; + + public Bar(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Foo.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Foo.java new file mode 100644 index 0000000000..5edba6c50d --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Foo.java @@ -0,0 +1,7 @@ +package com.baeldung.spring.patterns.factory; + +import org.springframework.stereotype.Component; + +@Component +public class Foo { +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Application.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Application.java new file mode 100644 index 0000000000..d00f51ec96 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.spring.patterns.proxy; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Book.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Book.java new file mode 100644 index 0000000000..112396e232 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Book.java @@ -0,0 +1,18 @@ +package com.baeldung.spring.patterns.proxy; + +public class Book { + + private String author; + + public Book(String author) { + this.author = author; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookController.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookController.java new file mode 100644 index 0000000000..ab192826b8 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookController.java @@ -0,0 +1,18 @@ +package com.baeldung.spring.patterns.proxy; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class BookController { + + @Autowired + private BookManager manager; + + @PostMapping("/book") + public Book create(@RequestParam String author) { + return manager.create(author); + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookManager.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookManager.java new file mode 100644 index 0000000000..d82218e404 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookManager.java @@ -0,0 +1,18 @@ +package com.baeldung.spring.patterns.proxy; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class BookManager { + + @Autowired + private BookRepository repository; + + @Transactional + public Book create(String author) { + System.out.println(repository.getClass().getName()); + return repository.create(author); + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookRepository.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookRepository.java new file mode 100644 index 0000000000..b100bc0a61 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.patterns.proxy; + +import org.springframework.stereotype.Repository; + +@Repository +public class BookRepository { + + public Book create(String author) { + return new Book(author); + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Application.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Application.java new file mode 100644 index 0000000000..5d7545790a --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.spring.patterns.singleton; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Book.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Book.java new file mode 100644 index 0000000000..31d9d83683 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Book.java @@ -0,0 +1,4 @@ +package com.baeldung.spring.patterns.singleton; + +public class Book { +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookController.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookController.java new file mode 100644 index 0000000000..aa4bdb8371 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookController.java @@ -0,0 +1,19 @@ +package com.baeldung.spring.patterns.singleton; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class BookController { + + @Autowired + private BookRepository repository; + + @GetMapping("/book/{id}") + public Book findById(@PathVariable long id) { + System.out.println(repository); + return repository.findById(id).get(); + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookRepository.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookRepository.java new file mode 100644 index 0000000000..3fde153f31 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookRepository.java @@ -0,0 +1,17 @@ +package com.baeldung.spring.patterns.singleton; + +import java.util.Optional; + +import org.springframework.stereotype.Repository; + +@Repository +public class BookRepository { + + public long count() { + return 1; + } + + public Optional findById(long id) { + return Optional.of(new Book()); + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/LibraryController.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/LibraryController.java new file mode 100644 index 0000000000..76e273e2fb --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/LibraryController.java @@ -0,0 +1,18 @@ +package com.baeldung.spring.patterns.singleton; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class LibraryController { + + @Autowired + private BookRepository repository; + + @GetMapping("/count") + public Long findCount() { + System.out.println(repository); + return repository.count(); + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/template/Book.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/template/Book.java new file mode 100644 index 0000000000..d601f01c67 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/template/Book.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.patterns.template; + +public class Book { + + private long id; + private String title; + private String author; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/template/BookRowMapper.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/template/BookRowMapper.java new file mode 100644 index 0000000000..3fe7bb8e59 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/template/BookRowMapper.java @@ -0,0 +1,21 @@ +package com.baeldung.spring.patterns.template; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.springframework.jdbc.core.RowMapper; + +public class BookRowMapper implements RowMapper { + + @Override + public Book mapRow(ResultSet rs, int rowNum) throws SQLException { + + Book book = new Book(); + + book.setId(rs.getLong("id")); + book.setTitle(rs.getString("title")); + book.setAuthor(rs.getString("author")); + + return book; + } +}