TDC 2015 - Java: from old school to modern art!

63
Globalcode – Open4education Java – From old school to modern art Marcos Roberto Ferreira Engenheiro de Software - ContaAzul

Transcript of TDC 2015 - Java: from old school to modern art!

Globalcode  –  Open4education

Java – From old school to modern art Marcos Roberto Ferreira

Engenheiro de Software - ContaAzul

• Engenheiro de Software na ContaAzul

• Formado em Sistemas de Informação pela UDESC

• +12 anos XP dev web

• +10 anos XP Java

• Colaborador do GUJavaSC

github.com/Marcosabout.me/marcos.ferreira

QUEM SOU EU?

MARCOS ROBERTO FERREIRA

[email protected]

old school: ContaAzul antes de ser ContaAzul

modern art: ContaAzul Startup

APIs/Projetos usados no ContaAzul

AGENDA…

1

2

3

O que é ContaAzul?

5

6

Alguns números…

7

MPE’s que já utilizaram o ContaAzul até agora

+350.000

Novas empresas que começam a usar todo mês

23.000

8

Número de transações financeiras

15.000.000 48.000.000.000Total de transações

Vendas criadas

2.500.000 ~4.000.000Contatos na nossa plataforma

9

Tudo isso em 3 anos

10

old school…https://c2.staticflickr.com/8/7217/7298542244_5c356381eb_b.jpg

20002005

eFinance

20002005

eFinance

2006

20002005

eFinance

20062009

AgilERP

/app

<%view%>Servlet

Business Object

public class MemberServlet extends HTTPServlet{

public void doGet(…) throws IOException{

List<Member> members = memberService.list();

request.setAttribute(“members”, members);

String jsp = “member.jsp";request.getRequestDispatcher( ) .forward( request, response );

}}

<%@ page contentType="text/html; charset=UTF-8"%><html><body>

<c:forEach var="member" items=“{member}”>${member} <br/>

</c:forEach></body>

</body>

/app

<%viewA%>ControllerA

BusinessObjectA

<%viewB%>ControllerB

BusinessObjectB

ServletController

18

http://www.jajakarta.org/struts/struts1.2/documentation/ja/target/images/struts.gif http://www.techideator.com/wp-content/uploads/2015/03/Spring-MVC-e1410633092262.png

http://vraptor3.vraptor.org/assets/images/logo.png https://www.playframework.com/assets/images/logos/play_full_color.png

19

20

flexibilidade verbosidade

escalabilidade

produtividade

X

21

modern art…https://www.socwall.com/images/wallpapers/15185-3458x2306.jpg

1a. empresa Brasileira

selecionada 500Startups

1a. empresa Brasileira

selecionada 500Startups

Lançamento oficial

26

27

flexibilidade verbosidade

escalabilidade

produtividade

X

Como resolver o problema?

http://sustainablesurf.org/wp-content/uploads/2011/05/Me-and-shaping-dust.jpg

Construir um framework?

http://sustainablesurf.org/wp-content/uploads/2011/05/Me-and-shaping-dust.jpg

Mudar de stack?

Ou evoluir dentro da tecnologia?

http://www.railz.net/images/ocean/surf1/hangten/hangten.jpg

APIs e projetos no ContaAzul

34

lombok

35

private String name;

public String getName() {return name;

}

public void setName(String name) {this.name = name;

}

36

private String name;

public String getName() {return name;

}

public void setName(String name) {this.name = name;

}

@Getter@Setterprivate String name;

37

@Getter@Setterpublic class Member {private Long id;private String name;

}

38

@Getter@Setterpublic class Member {private Long id;private String name;

}

@Getter@Setter@ToString@EqualsAndHashCodepublic class Member {private Long id;private String name;

}

39

@Getter@Setter@ToString@EqualsAndHashCodepublic class Member {private Long id;private String name;

}

40

@Getter@Setter@ToString@EqualsAndHashCodepublic class Member {private Long id;private String name;

}

@Datapublic class Member {private Long id;private String name;

}

41

public class Member {private Long id;private String name;public Member() {}public Member(Long id, String name) {super();this.id = id;this.name = name;

}}

42

public class Member {private Long id;private String name;public Member() {}public Member(Long id, String name) {super();this.id = id;this.name = name;

}}

@NoArgsConstructor@AllArgsConstructorpublic class Member {private Long id;private String name;

}

43

Member.builder().id(1L).name(“Marcos")

.build();

44

@Builderpublic class Member {

private Long id;private String name;

}

Member.builder().id(1L).name(“Marcos")

.build();

45

javaee

/app

<%viewA%>ControllerA

BusinessObjectA

ServletController formB.html

/rest/B

BusinessObjectB

formA.html

/rest/A

BusinessObjectA

/app

formB.html

/rest/B

BusinessObjectB

49

@Path("user")@Produces(APPLICATION_JSON)@Consumes(APPLICATION_JSON)public class UserResource {

@POSTpublic User save(User user){

return userService.save(user);}

@GETpublic List<User> list(){

return userService.list();}

}

REST + JSON

50

@PersistenceContextprivate EntityManager entityManager;

private void save(Long userId, User user) {if (userId == null)entityManager.persist(user);

else {user.setId(userId);entityManager.merge(user);

}}

persitência de dados

51

@Statelesspublic class UserService {

@TransactionAttribute(REQUIRES_NEW)public void save(Long userId, User user) {

…}

}

transações

@Statelesspublic class UserService {public void save(Long userId, User user) {

…}

}

52

@Statelesspublic class PaymentService {@Asynchronouspublic void update(User user){…}

}

@Injectprivate PaymentService paymentService;

public User save(User user) {paymentService.update(user);

}

processamento assíncrono

53

@Statelesspublic class UserJob {

@Schedule(hour="*",minute="*",second="*/20")public void schedule(){…}

}

agendamento

54

querydsl

55

new JPAQuery(entityManager).from(member).list(member);

import static org.gujavasc.entities.QMember.member;

56

new JPAQuery(entityManager).from(post).innerJoin(post.member, member).list(QPost.create(member.name, post.title, post.content));

import static org.gujavasc.entities.QMember.member;import static org.gujavasc.entities.QPost.post;

57

new JPAQuery(entityManager).from(post).leftJoin(post.member, member).list(QPost.create(member.name, post.title,

post.content));

import static org.gujavasc.entities.QMember.member;import static org.gujavasc.entities.QPost.post;

58

new JPAQuery(entityManager).from(post).leftJoin(post.member, member).where(post.status.eq(DRAFT)).list(QPost.create(member.name, post.title,

post.content));

import static org.gujavasc.entities.QMember.member;import static org.gujavasc.entities.QPost.post;

59

new JPAUpdateClause(entityManager, post).set(post.status, Status.PUBLISHED).execute();

import static org.gujavasc.entities.QPost.post;

60

new JPADeleteClause(entityManager,post).where(post.status.in(Status.PUBLISHED,Status.DRAFT)).execute();

import static org.gujavasc.entities.QPost.post;

61

Dúvidas?!