Spring 3 Annotated Development

34,927 views

Published on

This is a presentation on Spring 3 annotations on a web stack. It includes basic spring annotation details, working with jpa, and the new MVC stuff. The code samples add a lot. I'll try to get them up on github.com.

Published in: Technology
2 Comments
19 Likes
Statistics
Notes
No Downloads
Views
Total views
34,927
On SlideShare
0
From Embeds
0
Number of Embeds
1,876
Actions
Shares
0
Downloads
1,056
Comments
2
Likes
19
Embeds 0
No embeds

No notes for slide

Spring 3 Annotated Development

  1. 1. Spring - ADD Developer Annotated Driven Development Friday, February 13, 2009
  2. 2. About Speaker Speaker @ JavaOne, NFJS, Devcon, Borcon Sun Certified Java 2 Architect. Instructor for VisiBroker for Java, OOAD, Rational Rose, and Java Development. JBoss Certified Developer Friday, February 13, 2009
  3. 3. Agenda Annotations and the MV Spring 2.5/3 Annotations – Spring Business Tier Spring Data Tier Spring MVC Tier Summary Friday, February 13, 2009
  4. 4. Industry Forces Annotations – EJB 3.X – JSR-250 Common Annotations – JSR-299 Web Beans Guice / SEAM XML... way too much XML Friday, February 13, 2009
  5. 5. Industry Move to Annotations 5 Friday, February 13, 2009
  6. 6. Commons Annotation @Resource @PreDestroy @PostConstruct 6 Friday, February 13, 2009
  7. 7. EJB Annotation Commons @Resource @PreDestroy @PostConstruct Friday, February 13, 2009
  8. 8. @Home EJB Annotation Commons @SecurityRoles @Init @Resource @EJB @PreDestroy @MessageDriven @PostConstruct @MethodPermissions @Stateful @Interceptor @Inject @RunAs @Stateless @TransactionManagement @TransactionAttribute 7 Friday, February 13, 2009
  9. 9. JPA Annotation Commons @Resource @PreDestroy @PostConstruct EJB @Home @RunAs @EJB @MethodPermissions @MessageDriven @Init @Interceptor @Stateful @TransactionManagement @Inject @TransactionAttribute @Stateless @SecurityRoles 8 Friday, February 13, 2009
  10. 10. @Column JPA Annotation @JoinColumn @GeneratedValue Commons @Entity @Resource @PreDestroy @Table @PostConstruct @Version @Serialized EJB @Home @RunAs @OneToMany @EJB @MethodPermissions @MessageDriven @Init @OneToOne @Id ManyToMany @Interceptor @Stateful @ManyToOne @TransactionManagement @Inject @AssociationTable @TransactionAttribute @Stateless @EmbeddedId @DisciminatorColumn @SecurityRoles 8 @Transien Friday, February 13, 2009
  11. 11. JPA Annotation JPA Commons @Table @ManyToMany @Entity @Resource @GeneratedValue @Column @DisciminatorCol @PreDestroy @OneToMany @JoinColumn @PostConstruct @AssociationTable @OneToOne @Version @EmbeddedId @Serialized @Id EJB @ManyToOne @Transient @Home @RunAs @EJB @MethodPermissions @MessageDriven @Init @Interceptor @Stateful @TransactionManagement @Inject @TransactionAttribute @Stateless @SecurityRoles 9 Friday, February 13, 2009
  12. 12. Web Services @Resource @ManyToMany @PreDestroy @Table @WebServiceRef @DisciminatorCol PostConstruct @Column @AssociationTable @WebServiceRefs @Home @OneToMany @MethodPermissions @EmbeddedId @EJB @Init @OneToOne @Transient @MessageDriven @Interceptor @Entity @TransactionManagement @ManyToOne @Stateful @GeneratedV @TransactionAttribute @Inject @Id @JoinColumn @Stateless @Version @Serialized SecurityRoles @RunAs 10 Friday, February 13, 2009
  13. 13. Web Beans @New @Resource @Out @ManyToMany @PreDestroy @In @Table @DisciminatorCol PostConstruct @Model @WebServiceRef @Column @WebServiceRefs @AssociationTable @SessionScoped @Home @OneToMany @MethodPermissions @Current @EmbeddedId @EJB @Init @LoggedIn @OneToOne @Transient @MessageDriven @Interceptor @Entity @Produces @TransactionManagement @ManyToOne @Stateful @GeneratedV @TransactionAttribute @Interceptor @Inject @Id @JoinColumn @Secure @Stateless @Version @Decorator @Serialized SecurityRoles @Synchronous @RunAs @Asynchronous 11 Friday, February 13, 2009
  14. 14. Servlet 3 @New @WebServlet @Resource @Out @ServletFilter @ManyToMany @In @PreDestroy @InitParam @Table @DisciminatorCol PostConstruct @WebServiceRef @Model @WebServletContextListenter @Column @WebServiceRefs @SessionScoped @AssociationTable @Home @OneToMany @MethodPermissions @Current @EmbeddedId @EJB @Init @LoggedIn @OneToOne @Transient @MessageDriven @Interceptor @Entity @Produces @TransactionManagement @ManyToOne @Stateful @Interceptor @GeneratedV @TransactionAttribute @Inject @Id @JoinColumn @Secure @Stateless @Decorator @Version @Serialized SecurityRoles @Synchronou @RunAs @Asynchronous 12 Friday, February 13, 2009
  15. 15. JSR 303: Bean Validation @New @Resource @Out @ManyToMany @NotNull @In @PreDestroy @Table @ConstraintValidator @DisciminatorCol PostConstruct @WebServiceRef @Model @Column @Length @WebServiceRefs @SessionScoped @AssociationTable @Home @OneToMany @Min @MethodPermissions @Current @EmbeddedId @EJB @Pattern @Init @LoggedIn @OneToOne @Transient @MessageDriven @Interceptor @Size @Entity @Produces @TransactionManagement @ManyToOne @Stateful @Valid @Interceptor @GeneratedV @TransactionAttribute @Inject @ServletFilter @NotEmpty @Id @JoinColumn @WebServlet @Secure @Stateless @Decorator @Version @Serialized @WebServletContex SecurityRoles @InitParam @Synchronou @RunAs @Asynchronous 13 Friday, February 13, 2009
  16. 16. JSR 303: Bean Validation @New @NotNull @Resource @Out @ManyToMany @In @PreDestroy @Table @ConstraintValidator @DisciminatorCol @Length PostConstruct @WebServiceRef @Model @Column @WebServiceRefs @SessionScoped @AssociationTable @Home @OneToMany @MethodPermissions @Min @Pattern @Current @EmbeddedId @EJB @Init @LoggedIn @OneToOne @Transient @MessageDriven @Interceptor @Size @Entity @Valid @Produces @TransactionManagement @ManyToOne @Stateful @Interceptor @GeneratedV @TransactionAttribute @Inject @ServletFilter @Id @NotEmpty @JoinColumn @WebServlet @Secure @Stateless @Decorator @Version @Serialized @WebServletContex SecurityRoles @InitParam @Synchronou @RunAs @Asynchronous 14 Friday, February 13, 2009
  17. 17. JSR-299 Context and DI for Java  @NonBinding  @Realizes  @Named  @Initializer  @Stereotype  @New  @Interceptor  @Current  @InterceptorBindingType  @Production  @Decorator  @Standard  @Decorates  @Obtains  @ScopeType  @Initialized  @ApplicationScoped  @Deployed  @RequestScoped  @Observes  @SessionScoped  @IfExists  @ConverationScoped  @Asynchronously  @Dependent  @AfterTransactionCompletion  @BindingType  @AfterTransactionFailure  @DeploymentType  @AfterTransactionSuccess  @Produces  @BeforeTransactionCompletion  @Disposes  @Fires  @Specializes  @Model 15 Friday, February 13, 2009
  18. 18. Annotation Frustrations Not Mentioned JMX 2.0 JAX-RS JUnit 4 / TestNG AOP frameworks Spring Friday, February 13, 2009
  19. 19. Spring Annotations Friday, February 13, 2009
  20. 20. Spring 3 - Annotation Support JSR 250 - @PostConstruct, @Resource… JAX-WS 2.0’s - @WebServiceRef EJB 3.0 - @EJB MVC annotations - @RequestParam, @RequestMapping… Test Enhancements - Junit 4.4 and TestNG Stereotypes - @Component, @Controller… Spring enhancements - @Autowired, AOP - @Configurable Friday, February 13, 2009
  21. 21. Spring Annotations Spring 2.x Data Access Annotations Spring 2.x Aspects Spring 2.5 Context Annotations Spring 2.5 Stereotypes Spring 2.5 Factory Annotations Spring 2.5 MVC Annotations Spring 3.0 REST Friday, February 13, 2009
  22. 22. Spring 2.x Data Access Annotations @Transactional – Provides annotation driven demarcation for transactions @Repository – Indicates that a class functions as a repository or a data access object (DAO) – Exceptions are transparently translated • Springs DataAccessException Hierarchy Friday, February 13, 2009
  23. 23. Spring 2.5 Stereotypes @Component ** – Indicates that a class is a component – Class is a candidate for auto-detection – Custom component extensions @Controller – Specialized Component – Typically used with RequestMapping annotation – Discussed in section on web mvc @Repository – 2.0 stereotype… previously mentioned – Now an extension of @Component @Service – Intended to be a business service facade Friday, February 13, 2009
  24. 24. Spring 2.5 Factory Annotations @Autowired – Marks a constructor, field, setter or config method for injection. – Fields are injected • After construction • Before config methods – @Autowired(required=false) – Config: AutowiredAnnotationBeanPostProcessor • @Configurable – Marks class as being eligible for Spring-driven configuration – Used with AspectJ @Qualifier – Qualifies a bean for autowiring – May be customized @Required – Marks a method as being injection required Friday, February 13, 2009
  25. 25. Types of Injections Constructor Setter Field 23 Friday, February 13, 2009
  26. 26. New Injection Type configuration method with any number of arguments 24 Friday, February 13, 2009
  27. 27. Let me Qualify that @Autowired @Qualifier(“xyzDataSourceName”) Private DataSource dataSource Or @Autowired public void init(@Qualifier(“xyzNAme”) DataSource dataSource, Object2 obj) {…} Friday, February 13, 2009
  28. 28. DEMO Friday, February 13, 2009
  29. 29. Spring / JPA Friday, February 13, 2009
  30. 30. JPA - Specification Packaging Entities Entity Operations Queries Metadata Life-cycle Model Callbacks Friday, February 13, 2009
  31. 31. Persistence.xml In the classpath under the META-INF directory. <persistence-unit name=quot;unit1quot; transaction-type=quot;RESOURCE_LOCALquot;> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> <property name=quot;hibernate.hbm2ddl.autoquot; value=quot;createquot;/> <property name=quot;hibernate.ejb.autodetectionquot; value=quot;classquot;/> <property name=quot;hibernate.connection.urlquot; value=quot;jdbc:hsqldb:hsql://localhost:1234/employeequot;/> <property name=quot;hibernate.connection.driver_classquot; value=quot;org.hsqldb.jdbcDriverquot;/> <property name=quot;hibernate.connection.usernamequot; value=quot;saquot;/> <property name=quot;hibernate.connection.passwordquot; value=quot;quot;/> </properties> </persistence-unit> </persistence> Friday, February 13, 2009
  32. 32. Customer Entity (from spec) @Entity(access=FIELD) public class Customer { @Id(generate=AUTO) Long id; @Version protected int version; @ManyToOne Address address; @Basic String description; @OneToMany(targetEntity=com.acme.Order.class, mappedBy=quot;customerquot;) Collection orders = new Vector(); @ManyToMany(mappedBy=quot;customersquot;) Set<DeliveryService> serviceOptions = new HashSet(); public Customer() {} public Collection getOrders() { return orders; } public Set<DeliveryService> getServiceOptions() { Friday, February 13, 2009
  33. 33. JPA Persistence Interfaces EntityManager – Interface to interact with persistence context. – @PersistenceContext EntityManagerFactory – Creates an EntityManager – @PersistenceUnit Friday, February 13, 2009
  34. 34. Acquiring a Manager Injection in Stateless Bean @PersistenceContext public EntityManager em; OR @PersistenceContext(unitName=quot;orderquot;) EntityManager em; From Java Application EntityManagerFactory emf = Persistence.createEntityManagerFactory(quot;unit1quot;); EntityManager em = emf.createEntityManager(); Friday, February 13, 2009
  35. 35. Spring 2 JPA Support org.springframework.orm.jpa package Contains subset of the JPA container JpaDaoSupport – similar to other DAO support classes like HibernateDaoSupport LocalEntityManagerFactoryBean – Provides resource bootstrapping for non-jndi lookups Friday, February 13, 2009
  36. 36. Spring / JPA Approaches JpaDaoSupport Approach – Not preferred approach – Similar to HibernateDaoSupport – Requires Spring Configuration of the EntityManager Pure JPA Approach – Preferred approach – No spring references necessary in the code • with the exception of @Transactional 34 Friday, February 13, 2009
  37. 37. Approach 2: Spring / Pure JPA Configuration Leverage the persistence.xml in classpath:/META-INF <bean id=quot;entityManagerFactoryquot; class=quot;org.springframework.orm.jpa.LocalEntityManagerFactoryBeanquot; > <property name=quot;persistenceUnitNamequot; value=quot;unit1quot;/> </bean> DAO with no Spring references, however it contains @PersistenceContext annotated EntityManager <bean id=quot;conferenceDaoquot; class=quot;com.codementor.jpa.domain.ConferenceDAOImplquot;/> Spring configuration which injects JPA annotationed EntityManager <bean class=quot;org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProces sor“ /> Friday, February 13, 2009
  38. 38. Pure JPA Code Example: ConferenceDaoImpl package com.nfjs.jpa; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.transaction.annotation.Transactional; public class ConferenceDAOImpl implements ConferenceDAO { @PersistenceContext private EntityManager entityManager; public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } – ... 36 Friday, February 13, 2009
  39. 39. Pure JPA Spring Configuration <bean id=quot;entityManagerFactoryquot; class=quot;org.springframework.orm.jpa.LocalEntityManagerFactoryBeanquot; > <property name=quot;persistenceUnitNamequot; value=quot;nfjsquot;/> </bean> <bean id=quot;conferenceDaoquot; class=quot;com.nfjs.jpa.ConferenceDAOImplquot;/> <bean class=quot;org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessorquot; /> </beans> 37 Friday, February 13, 2009
  40. 40. No PU No Problem The LocalContainerEntityManagerFactoryBean can be configured with all Persistent Unit information. <bean id=quot;entityManagerFactoryquot; class=quot;org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanquot;> <property name=quot;dataSourcequot; ref=quot;dataSourcequot;/> <property name=quot;jpaVendorAdapterquot;> <bean class=quot;org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapterquot;> <property name=quot;showSqlquot; value=quot;truequot;/> <property name=quot;generateDdlquot; value=quot;truequot;/> <property name=quot;databasePlatformquot; value=quot;org.hibernate.dialect.HSQLDialectquot;/> </bean> </property> </bean> Friday, February 13, 2009
  41. 41. Transactions XML Configuration <tx:annotation-driven /> Annotation @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) Public void doSomething() { ** transaction manger bean id must be transactionManger or configured with the xml configuration above. Friday, February 13, 2009
  42. 42. Test JPA with Spring public class SpeakerDAOTest extends AbstractJpaTests { private SpeakerDAO speakerDao; public void setSpeakerDao(SpeakerDAO speakerDao) { this.speakerDao = speakerDao; } protected String[] getConfigLocations() { return new String[] {quot;classpath:/jpaContext.xmlquot;}; } protected void onSetUpInTransaction() throws Exception { jdbcTemplate.execute( quot;insert into speaker (id, name, company) values (1, 'Ken', 'CodeMentor')quot;); Friday, February 13, 2009
  43. 43. AbstractJpaTests Benefits getConfigLocations () – Separates test from production configuration – Allows for multiple configurations Injected Dependencies By Type – field references Every Test – Starts a Transactions – Rolls back Transaction Leverage jdbcTemplate for SQL checks Friday, February 13, 2009
  44. 44. DEMO Friday, February 13, 2009
  45. 45. Spring MVC Friday, February 13, 2009
  46. 46. Spring 2.5 MVC Annotations @Controller – Stereotype used to “Controller” of MVC – Scanned for RequestMappings @RequestMapping – Annotates a handler method for a request – Very flexible @RequestParam – Annotates that a method parameter should be bound to a web request parameter @SessionAttributes – Marks session attributes that a handler uses Friday, February 13, 2009
  47. 47. New Controller Issues Doesn’t implement an Interface Multiple request mappings High degree of flexibility 45 Friday, February 13, 2009
  48. 48. Advantages of Controller Interfaces 46 Friday, February 13, 2009
  49. 49. Advantages of Controller Interfaces It looks like your trying to build a controller 46 Friday, February 13, 2009
  50. 50. Advantages of Controller Interfaces 46 Friday, February 13, 2009
  51. 51. A World Without Rules Return Type? Parameters? 47 Friday, February 13, 2009
  52. 52. @RequestMapping - Extreme Flexibility Parameters can be – Request / response / session – WebRequest – InputStream – OutputStream – @RequestParam – +++ Return types – ModelAndView Object – Model Object – Map for exposing model – View Object – String which is a view name – Void… if method wrote the response content directly Friday, February 13, 2009
  53. 53. Spring 2.5 Controller Example @Controller public class ConfController { @Autowired private confDB confDB; @RequestMapping(quot;/sessionListquot;) public String showSessionList(ModelMap model) { model.addAttribute(quot;sessionsquot;, this.confDB.getSessions()); return quot;sessionListquot;; } @RequestMapping(quot;/speakerImagequot;) public void streamSpeakerImage(@RequestParam(quot;namequot;) String name, OutputStream outputStream) throws IOException { this.confDB.getSpeakerImage(name,outputStream); } @RequestMapping(quot;/clearDatabasequot;) public String clearDB() { this.confDB.clear(); return quot;redirect:sessionListquot;; } } Friday, February 13, 2009
  54. 54. Spring MVC By Convention Conventions: hotel = HotelController GET /hotel/list list = method View selected from request path Added to Model 50 Friday, February 13, 2009
  55. 55. Multi-Action Convention /hotel/index /hotel/show /hotel/list 51 Friday, February 13, 2009
  56. 56. Working With Parameters /hotel/show?id=42 52 Friday, February 13, 2009
  57. 57. @PathVariable - RESTFUL GET /owner/show/2 53 Friday, February 13, 2009
  58. 58. Submitting Forms 54 Friday, February 13, 2009
  59. 59. Demo Friday, February 13, 2009
  60. 60. Summary - ADD I’m sorry... Were we talking about something... Oh Yeah... ADD Friday, February 13, 2009
  61. 61. Summary  @nnotations  They @re every where!  They c@n incre@se productivity Friday, February 13, 2009
  62. 62. Questions  Please Fill Out Surveys kensipe@gmail.com twitter: @kensipe kensipe.blogspot.com Friday, February 13, 2009

×