Top Banner
Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway
45

Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Apr 01, 2015

Download

Documents

Trevion Alleyne
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Dependency injection when you only have one dependency

JavaZone

Johannes Brodwall, Recovering Spring User

Steria Norway

Page 2: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Let’s get rid ofdogmatic dependency

injection

Page 3: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Does this look familiar?

Page 4: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Person-Controller

Person-Controller-

Impl

Person-Service

Person-ServiceImpl

Person-Repository

Person-Repository

Impl

PersonDao

PersonDaoImpl

Session-Factory

Page 5: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.
Page 6: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Customer

Invoice

Order

Product

Page 7: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.
Page 8: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

No more:

this.personService =new PersonServiceImpl(sessionFactory)

Page 9: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Instead:

<bean id="personDao" class=“…springmadness.dao.impl.PersonDaoImpl"> <property name="sessionFactory" …/></bean>

Page 10: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

(Or)

@Autowired private PersonService personService;

Page 11: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Why?

Page 12: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Why?

(dear God, why?!)

Page 13: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Testing

Page 14: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Multiple implementations

Page 15: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Multiple implementations

(Really?)

Page 16: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Configuration

Page 17: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Configuration

(Often one)

Page 18: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Ordnung muss sein!

Page 19: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

(Ordnung muss sein!)

Hobgoblin of little minds

- Ralph Waldo Emerson

Page 20: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Alternative

Page 21: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Session-Factory

PersonController

ServiceRepository

Page 22: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

public class PersonController { private PersonService personService;

@Autowired public PersonController(SessionFactory sf) { this.personService = new PersonServiceImpl(sf); }

Page 23: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

public class PersonController { private PersonService personService;

@Autowired public PersonController(SessionFactory sf) { this.personService = new PersonServiceImpl(sf); }

public class PersonServiceImpl implements … { private PersonRepository personRepo;

public PersonServiceImpl(SessionFactory sf) { this.personRepo = new PersonRepositoryImpl(sf); }

Page 24: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

public class PersonController { private PersonService personService;

@Autowired public PersonController(SessionFactory sf) { this.personService = new PersonServiceImpl(sf); } public PersonControllerImpl(PersonService ps) { this.personService = ps; }

Page 25: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

public class PersonController { private PersonService personService;

@Autowired public PersonController(SessionFactory sf) { this.personService = new PersonServiceImpl(sf); } public PersonControllerImpl(PersonService ps) { this.personService = ps; }

For Spring

For mocking

Page 26: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

SPRING!

Session-Factory

PersonController

ServiceRepository

InvoiceController

Repository

FooServiceImpl

ReportsController

FooController

Page 27: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Look ma!No Spring!

Page 28: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Session-Factory

PersonServlet

Locator(singleton O_O)

”Injected” by servlet

Page 29: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

public class PersonController extends HttpServlet { private PersonService personService; public PersonController() { } public PersonController(PersonService personService) { this.personService = personService; } @Override public void init() throws ServletException { SessionFactory sf = HibernateLookup.getInstance(getServletContext()); this.personService = new PersonServiceImpl(sf); }

Page 30: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

public class PersonController extends HttpServlet { private PersonService personService; public PersonController() { } public PersonController(PersonService personService) { this.personService = personService; } @Override public void init() throws ServletException { SessionFactory sf = HibernateLookup.getInstance(getServletContext()); this.personService = new PersonServiceImpl(sf); }

For mocking

Look, ma! No Spring!

Page 31: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Session-Factory

PersonController

ServiceRepository

InvoiceController

Repository

FooServiceImpl

ReportsController

FooController

<<locator injection>>

<<locator injection>>

<<locator injection>>

<<locator in

jection>>

Page 32: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Bonus: Generic Repository

Page 33: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

public interface Repository {

<T> T retrieve(Class<T> type,Serializable id);

Serializable save(Object object);

<T> List<T> find(Specification<T> spec);

Transaction beginTransaction();}

Page 34: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.
Page 35: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.
Page 36: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

@RunWith(RepositoryTestRunner.class)public class PersonControllerTest { private Repository repository; private PersonController personController; public PersonControllerTest(Repository repo) { this.repository = repo; this.personController = new PersonController(repo); }

Page 37: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

@Testpublic void should_show_person() { Person person = new Person(); Long id = (Long) repository.save(person); ModelAndView show = personController.show(id); assertEquals(person, show.getModel().get("person"));}

Page 38: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

public class RepoTestRunner extends Suite { public RepoTestRunner(Class<?> testClass) { super(testClass, createRunners(testClass)); } static List<Runner> createRunners(Class<?> testClass) { List<Runner> runners = new ArrayList<Runner>();

runners.add(testRunner(testClass, new HashMapRepository())); if (!isRunningInInfinitest()) {

runners.add(testRunner(testClass, hibernateRepository())); } return runners; }

Page 39: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.
Page 40: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

What Spring taught me

Page 41: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Be aware of dependencies!

Page 42: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Avoid differences between test and prod

Page 43: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Stay the heck away from frameworks!

Page 44: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Collapse service chains

Page 45: Dependency injection when you only have one dependency JavaZone Johannes Brodwall, Recovering Spring User Steria Norway.

Takk for [email protected]

http://johannesbrodwall.com

http://sterkblanding.no

http://twitter.com/jhannes