สปริ�ง เฟริมเวิ�ริ�ค เวิ�ริ�คชอป(Spring Framework Workshop)
By www.spring66.comพฤศจิ�กายน 2552, 22
ชั�ดเจิน “เขี�ยนจาวิาไม�ใช�สปริ�ง บาป”
Supported by KT ZMICO Securities
@roofimon ขีอ ขีอบค�ณ TA• ไม่�ม่� TA ไม่�ม่�งานน��ครั�บ
– @somkiat– @9tae– @poorprogrammer– @nuboat– @siros_s– @YashimaExteen– @boyone
• TA เป็�นผู้��ทรังค�ณวุ�ฒิ�เรั"#องสป็รั�งท�กท�าน
Agenda
• Impossible is nothing• Why Spring?• New Features and Enhancements in
Spring 3.0 – Core Container 3.0– Persistence with Spring JDBC– AOP (@siros_s)– Transaction with Annotation (@siros_s)– EhCache (Apply AOP)– Spring Web MVC with Web Annotation
Basic Requirements • JDK 1.6 ++• Maven 2.0.x• Apache Derby• Netbeans, Eclipse, Vi, Whatever IDE• Skeleton Source from
– http://code.google.com/p/spring66-training-3/svn/branches/1.0.PRE
• Full– https://spring66-training-
3.googlecode.com/svn/trunk/
ที่��มาขีองเน��อหา(ลอกมาจากไหน)• Building Spring2 Enterprise Application• Development J2EE without EJB• Professional Spring Framework• Spring2 in Action• Pro Spring2• Spring Recipe• หน�งส"ออ�างอ�งเยอะม่าก
ที่#าไมต้�องสปริ�ง เม��อก�อน• Java เตรั�ยม่เครั"#องม่"อไวุ�ให�เยอะไป็หม่ดแต�เวุลาใชั� ? • Design Pattern: ต�องน�#งต�ควุาม่เอาเอง• กรัะบวุนการัรัวุม่ฟี-เจิอรั.ของ SUN โหดรั�ายเก�นไป็• ชั�วุ�ตเรัาถู�กผู้�กต�ดก�บ Application Server, API ม่ากเก�นไป็• อยากเอาฟี-เจิอรั.ม่ารัวุม่ก�นพรั�อม่ท��งใชั� Design Pattern ด�วุย ?• Light Weight
สม%ยน��
My Basic Requirements for Lightweight Container
• Lifecycle management• Lookup• Configuration• Dependency resolution
lightweight Container (Value Added)
• Transaction• Thread management• Object pooling• Clustering• Management• Remoting• Exposing remote services• Consuming remote services• Customization and extensibility• AOP
What actually Spring is?
• Framework that …– make Enterprise Java easier to use– promote good programming practice– enabling a POJO-based programming
model that is applicable in a wide range of environments
• Some said Spring is just a “glue” for connecting all state of the art technologies together via it’s Application Context.
• Heart and Soul of Spring is Dependency Injection and Aspect Oriented Programming.
Main Components
Layer of Application
Dependency Injection หริ�อ
Inversion Of Control
โดยท�#วุไป็ เม่"#อใชั� IOC
• Hollywood Principle: "Don't call me, I'll call you."
Why IoC is Matter? • Removes explicit dependence on container
APIs • Because components don't need to look up
collaborators at runtime, they're much simpler to write and maintain
• Application code is much easier to test • A good IoC implementation preserves strong
typing • Dependencies are explicit• No more Application Server dependent
Bean?
• Bean is a service• Service =
Interface+Implement+Descriptor• Bean อาศ�ยอย��ใน Bean Factory หรั"อ
Application Context• Application Context ค"อห�วุใจิของ Spring• ค�ดไม่�ออกต�องสรั�าง Application Context ข2�นม่า
ก�อน
Configurationส�วินมากจะช��อ applicationContect.xml
Initial Context
//Load Context Manually From AppConfig.class
ApplicationContext context =
new FileSystemXmlApplicationContext(
"classpath:/applicationContext.xml"); //Lookup Bean named
Clinic clinic = (Clinic)context.getBean(“clinic”);
Collection<Vet> vets = clinic.getVets();
The “PetClinic”
The “Lightweight Container ” Architecture
Basic Architecture• Spring JDBC• Spring Core• Spring Web MVC• JSP• jQuery• Separate Web Module from Service Module
by using “HTTP Remoting”
Basic Requirement• Use Cases
– View a list of veterinarians and their specialties– View information pertaining to a pet owner– Update the information pertaining to a pet owner– Add a new pet owner to the system– View information pertaining to a pet– Update the information pertaining to a pet– Add a new pet to the system– View information pertaining to a pet's visitation
history– Add information pertaining to a visit to the pet's
visitation history
• Business Rules– An owner may not have multiple pets with the same
case-insensitive name
Checkout Code from Google Code
• Create Test Case Call “isClinicServiceReady”
– @Autowired– protected Clinic clinic;– @Test– public void isCliniceReady() {– assertNotNull(clinic);– }
• We have done creating our first “bean”.
Checkout Code from Google Code
• Create – “interface Clinic”
• Run Test (Fail!!!!!)• Create
– applicationContect.xml– Copy content from “Master Project”– “src\test\resources\org\spring66\
training3\test\petclinic\baseline”
• Run Test !!!!!!• We have done creating our first “bean”.
What we have done?
Why Test First
• Test case is “META-CODE”, code that explains code.
• Feel confident for refactor, move and share.
Checkout Code from Google Code
• Create “interface ListDataService”• Create “class ListDataServiceImpl”
– @Override– public List getElementsList() {– List list = new ArrayList();– list.add("Tom");– list.add("Henri");– list.add("Jim");– return list;– }
Go more deep into “DataSource”
DB
ConnectionDataSource
HibernateiBatisOpenJPA
PersistenceManager
OracleMsSQLDB2MySQL
Go more deep into “DataSource”
• Basically we must have this information for datasource
– Driver Class– Driver Class Name– Connection String (URL)– Username– Password– Plus some optional parameters depends on Driver
Manager (Pool Size, Wait Time, bla bla bla)
Go more deep into DataSource
• Basically we must have this information– <bean id="dataSource" class=“$Driver">– <!-- Connection Info -->– <property name="driverClassName"
value="${jdbc.driverClassName}" />– <property name="url" value="${jdbc.url}" />– <property name="username" value="${jdbc.username}" />– <property name="password" value="${jdbc.password}" />– <!-- Connection Pooling DBCP -->– <property name="initialSize" value="5"/>– <property name="maxActive" value="100" />– <property name="maxIdle" value="30" />– <property name="maxWait" value="1000" />– <property name="poolPreparedStatements" value="true" />– <property name="defaultAutoCommit" value="false" />
</bean>
Spring JDBC
- The value add provided by the Spring Framewo rk JDBC abstraction is perhaps best shown by t he sequence of actions outlined in the table.
Spring JDBC
Action Spring You
Define connection parameters. X
Open the connection. X
Specify the SQL statement. X
Declare parameters and provide parameter values X
Prepare and execute the statement. X
Set up the loop to iterate through the results (if any). X
Do the work for each iteration. X
Process any exception. X
Handle transactions. X
Close the connection, statement and resultset. X
Go more deep into Spring JDBC
• JdbcTemplate• NamedParameterJdbcTemplate • SimpleJdbcTemplate • SimpleJdbcInsert and SimpleJdbcCall • RDBMS Objects including MappingSqlQuery,
SqlUpdate and StoredProcedure
Go more deep into Spring JDBC
• DataSource• Prepared Statement• Mapper• Extractor
Move up to Service Layer
• The most important part of our Application.• All business logics are located, here• Test it carefully, change very often.
Controller Service
Entity A
Entity B
Entity C
Spring Web MVC Flow
• Clear separation of roles • Powerful and straightforward configuration of both
framework and application classes as JavaBeans. • Adaptability, non-intrusiveness, and flexibility. • Customizable binding and validation • Customizable handler mapping and view resolution • Flexible model transfer • Beans whose lifecycle is scoped to the current HTTP
request or HTTP Session
Spring DispatcherServlet
Dispatcher Servlet
<web-app>
<servlet>
<servlet-name>example</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>*.form</url-pattern>
</servlet-mapping>
</web-app>
Example-servlet.xml
<context:component-scan base-package="com.spring66.petclinic.web"/>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" p:order="1"/>
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"
p:basename="messages"/>
Context Hierarchy
Web Layer
• Need Spring Boot Strap
Web Context
SpringContext
Web Context
SpringContext
org.springframework.web.context.ContextLoaderListenerweb.xml
Bootstrapping web applications
• Spring allows for seamlessly bootstrapping @Configuration classes within your servlet container's web.xml deployment descriptor
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
Still have xxx-servlet.xml
• Need to create abc-servlet.xml for mapping request from dispatcher servlet
• <context:component-scan
base-package="com.spring66.petclinic.web"/>
• Also can config other parameters like binding, viewResolver,…
Still have xxx-servlet.xml
@Controller
public class ClinicController {
private final Clinic clinic;
@Autowired
public ClinicController(Clinic clinic) {
this.clinic = clinic;
}
@RequestMapping("/")
public String welcomeHandler() {
return "welcome";
}
First Controller
• Named “ClinicController”• And then Copy Content from Main Project • src\main\java\com\spring66\petclinic\web
• ====ClinicController======
• “mvn jetty:run –Dmaven.test.skip=true –Djetty.port=9999”
• http://localhost:9999/
First Controller, Test First
• Create “VetControllerTests”• And then Copy Content from Web.text• ====TestVetController======
• Wowwww!!! Full of “red” things, so let’s eliminate them.
Create VetController
• List All Vet• Create “VetController”• Copy content from “Web.txt”• Part “VetController”• There are two interesting parts:• Inject “clinic” service into controller
– @Autowired
• And Request Mapping– @Request over “public Collection<Vet> list()”– It will handles {WebContext}/main/vet/list
OwnerController, Test First
• Create “OwnerControllerTests”• And then Copy Content from Web.text• ====TestOwnerController======
• Wowwww!!! Full of “red” things, so let’s eliminate them.
Let’s do more action, Test First
• Create “OwnerController”– Copy content from “Web.txt”– Part “SearchOwnerController”– If it works so move forward
• Do some magic by adding new Owner– Copy content from “Web.txt”– Part “AddOwnerController”
• Create “ViewUtils”– Copy content from “Web.txt”– Part “ViewUtils”
• Create “PageType”.. Good u can guest, next
Top Related