45
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

Embed Size (px)

Citation preview

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