Pages

Tuesday 22 October 2019

Dependency Injection


What is Dependency Injection aka Inversion of control?
Let's understand first "coupling". When one class depends on another, they are called coupled.
Coupled class can't be tested in isolation.
For example: Client depends on  BookService, BookService depends on BookDAO, BookDAO depends on JdbcRepository.
  1. class Client{
  2. public static void main(String[] args){
  3. Book book = new Book(1,"Effective Java","Joshua Bloch");
  4. BookService service = new BookService();//dependency
  5. service.add(book);
  6. }
  7. }
  1. class Book{
  2. private int bookId;
  3. private String name;
  4. private String author;
  5. Book(int bookId,String name,String author){
  6. this.bookId=bookId;
  7. this.name=name;
  8. this.author=author;
  9. }
  10. //getters & setters
  11. }
  1. class BookService{
  2. private BookDAO bookDao = new BookDAO();//dependency
  3. public void add(Book book){
  4. bookDao.save(book);
  5. }
  6. }
  1. class BookDAO{
  2. private JdbcRepository repository = new JdbcRepository();//dependency
  3. public void save(Book book){
  4. repository.save(book);
  5. }
  6. }
How can we reduce coupling?
  • Program to interfaces(Still have coupling because of new operator).
  • Dependency Injection(Pass collaborators in as parameters rather than hard-coding them).
  • Centralize Configuration(Capture all the dependencies in one place. Use a "container" to create and configure your objects.)
  1. public class Client {
  2. public static void main(String[] args) {
  3. BookService service = Container.getBookServiceInstance();
  4. Book book = new Book(1,"Effective Java","Joshua Bloch");
  5. service.save(book);
  6. }
  7. }
  1. class Book{
  2. private int bookId;
  3. private String name;
  4. private String author;
  5. Book(int bookId,String name,String author){
  6. this.bookId=bookId;
  7. this.name=name;
  8. this.author=author;
  9. }
  10. //getters & setters
  11. }
  1. interface BookService{
  2. public void save(Book book);
  3. public void delete(int bookId);
  4. public void update(Book book);
  5. }
  1. class BookServiceImpl implements BookService{
  2.  private BookDAO bookDao = Container.getBookDaoInstance();
  3. @Override
  4. public void save(Book book) {
  5. bookDao.save(book);
  6. }
  7. @Overridpublic void delete(int bookId) {
  8. // logic
  9. }
  10. @Override
  11. public void update(Book book) {
  12. // logic
  13. }
  14. }
  1. interface BookDAO{
  2. public void save(Book book);
  3. public void delete(int bookId);
  4. public void update(Book book);
  5. }
  1. class JdbcImpl implements BookDAO{
  2. @Override
  3. public void save(Book book) {
  4. //logic
  5. }
  6. @Override
  7. public void delete(int bookId) {
  8. // logic
  9. }
  10. @Override
  11. public void update(Book book) {
  12. // logic
  13. }
  14. }
  1. class HibernateDao implements BookDAO{
  2. @Override
  3. public void save(Book book) {
  4. System.out.println("Book is saving into the database");
  5. }
  6. @Override
  7. public void delete(int bookId) {
  8. // logic
  9. }
  10. @Override
  11. public void update(Book book) {
  12. // logic
  13. }
  14. }
  1. class Container{
  2. public static BookDAO getBookDaoInstance() {
  3. return new HibernateDao();
  4. }
  5. public static BookService getBookServiceInstance() {
  6. return new BookServiceImpl();
  7. }
  8. }