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.
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Spring 3 Annotated Development
1. Spring - ADD Developer
Annotated Driven Development
Friday, February 13, 2009
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. 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. 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
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. 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. 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. Types of Injections
Constructor
Setter
Field
23
Friday, February 13, 2009
26. New Injection Type
configuration
method
with any
number of
arguments
24
Friday, February 13, 2009
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
30. JPA - Specification
Packaging
Entities
Entity Operations
Queries
Metadata
Life-cycle Model
Callbacks
Friday, February 13, 2009
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. 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. JPA Persistence Interfaces
EntityManager
– Interface to interact with persistence context.
– @PersistenceContext
EntityManagerFactory
– Creates an EntityManager
– @PersistenceUnit
Friday, February 13, 2009
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. 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. 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. 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. 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. 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. 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. 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. 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. 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
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. New Controller Issues
Doesn’t implement an Interface
Multiple request mappings
High degree of flexibility
45
Friday, February 13, 2009
51. A World Without Rules
Return Type?
Parameters?
47
Friday, February 13, 2009
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. 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. 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