You are on page 1of 0

Spring In Action

1 Spring
SpringIoCAOP
SpringIoC AOP
BeanIoC XML
Spring
SpringAOP

1.1 Spring
1.1.1 Spring
SpringIoC AOP
Spring Spring
Spring
IoC



Bean
Bean
XML
Spring
1.1.2 Spring

1-1
Spring71-1
BeanFactorySpring
1

Spring In Action
IoC
BeanFactory I18N
J NDI EJ B
VelocityFreeMarker

AOP Spring
metadata
J DBC DAO
O/R
Web web
web

MVC
Bean

1.2
1.2.1 Spring
1.1 GreetingService
package com.springinaction.chapter01.hello;
public interface GreetingService {
public void sayGreeting();
}

1.2 GreetingServiceImpl.java
package com.springinaction.chapter01.hello;

public class GreetingServiceImpl implements GreetingService {
private String greeting;
public GreetingServiceImpl() {}
public GreetingServiceImpl(String greeting) {
this.greeting = greeting;
}
public void sayGreeting() {
System.out.println(greeting);
}
public void setGreeting(String greeting) {
this.greeting = greeting;
}
}
2

Spring In Action

1.3 SpringHello World
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="greetingService"
class="com.springinaction.chapter01.hello.GreetingServiceImpl">
<property name="greeting">
<value>Buenos Dias!</value>
</property>
</bean>
</beans>

1.4 Hello World
package com.springinaction.chapter01.hello;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
public class HelloApp {
public static void main(String[] args) throws Exception {
Resource resource = new FileSystemResource("hello.xml");
BeanFactory factory = new XmlBeanFactory(resource);
GreetingService greetingService =
(GreetingService) factory.getBean("greetingService");
greetingService.sayGreeting();
}
}
1.2.2 IoC
IoC



1.5 Quest.java
package com.springinaction.chapter01.knight;
public interface Quest {
public abstract Object embark() throws QuestException;
}
3

Spring In Action


1.6 HolyGrailQuest.javaQuest
package com.springinaction.chapter01.knight;

public class HolyGrailQuest implements Quest{
public HolyGrailQuest() {}
public Object embark() throws QuestException {
// Do whatever it means to embark on a quest
return new HolyGrail();
}
}

1.7 Knight.java
package com.springinaction.chapter01.knight;

public interface Knight {
public Object embarkOnQuest() throws QuestException;
public String getName();
}

1.8 KnightOfTheRoundTable.javaKnight
package com.springinaction.chapter01.knight;

public class KnightOfTheRoundTable implements Knight {
private String name;
private Quest quest;

public KnightOfTheRoundTable(String name) {
this.name = name;
}
public Object embarkOnQuest() throws QuestException {
System.out.println("ceshi");
return quest.embark();
}
public void setQuest(Quest quest) {
this.quest = quest;
}
public String getName() {
return this.name;
}
}

4

Spring In Action
1.9 knight.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframeworkorg/dtd/spring-beans.dtd">
<beans>
<!---->
<bean id="quest" class= "com.springinaction.chapter01.knight.HolyGrailQuest"/>
<!-->
<bean id="knight"
class="com.springinaction.chapter01.knight.KnightOfTheRoundTable">
<constructor-arg>
<value>Bedivere</value><!-->
</constructor-arg>
<property name="quest">
<ref bean="quest"/><!-->
</property>
</bean>
</beans>

1.10 KnightApp.javaKnight
package com.springinaction.chapter01.knight;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
public class KnightApp {
public static void main(String[] args) throws Exception {
Resource resource = new FileSystemResource("knight.xml");
BeanFactory factory = new XmlBeanFactory(resource) ;

Knight knight = (Knight)factory.getBean("knight");
knight.embarkOnQuest();
}
}

1.11 KnightOfTheRoundTableTest.javaKnightOfTheRoundTable
package com.springinaction.chapter01.knight;
import junit.framework.TestCase;

public class KnightOfTheRoundTableTest extends TestCase {
public void testEmbarkOnQuest() {
KnightOfTheRoundTable knight = new KnightOfTheRoundTable("Bedivere");
Quest quest = new HolyGrailQuest();
5

Spring In Action
knight.setQuest(quest);
HolyGrail grail;
try {
grail = (HolyGrail)knight.embarkOnQuest();
assertNotNull(grail);
assertTrue(grail.isHoly());
} catch (QuestException e) {
e.printStackTrace();
}
}
}
1.2.3 AOP
1.2.3.1 AOP
AOP

1-4

1-5 AOP
6

Spring In Action
1.2.3.2 AOP
1.12 MinstrelAdvice.java
package com.springinaction.chapter01.knight;
import java.lang.reflect.Method;
import org.apache.log4j.Logger;
import org.springframework.aop.MethodBeforeAdvice;
public class MinstrelAdvice implements MethodBeforeAdvice {
public void before(Method method, Object[] args, Object target)
throws Throwable {
Knight knight = (Knight) target;
//logger
Logger song = Logger.getLogger(target.getClass());
song.debug("Brave " + knight.getName() + " did " + method.getName());
}
}
knight.xml MinstrelAdvice Knight
1.13 knight.xmlMinstrelAdvice Knight
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="quest"
class="com.springinaction.chapter01.knight.HolyGrailQuest" />
<bean id="knightTarget"
class="com.springinaction.chapter01.knight.KnightOfTheRoundTable"
singleton="false">
<constructor-arg>
<value>Bedivere</value>
</constructor-arg>
<property name="quest">
<ref bean="quest" />
</property>
</bean>
<!--Minstrel-->
<bean id="minstrel"
class="com.springinaction.chapter01.knight.MinstrelAdvice" />
<bean id="knight"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>
<!--Knight-->
7

Spring In Action
com.springinaction.chapter01.knight.Knight
</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>minstrel</value><!--Minstrel-->
</list>
</property>
<property name="target">
<ref bean="knightTarget" /><!--Knight-->
</property>
</bean>
</beans>

1-7
1.3 Spring
1.3.1 Spring EJB
1.1 SpringEJB
EJB Spring
J TA

PlatformTransactionManager
J TA




*



Spring





BMP
CMP

J DBCHibernateJ DOiBATIS




AcegiSpring


RMIJ AX-RPC WebService

8

Spring In Action
1.3.2
1.2 IoC

1 Beans
2 Beansetter
3 Bean
2 bean
Spring
Bean org.springframework.beans.factory.BeanFactory

org.springframework.context.ApplicationContext
bean
2.1
2.1.1 BeanFactory
2.1.2
Bean Bean Bean



Bean

ClassPathXmlApplicationContext XML

FileSystemXmlApplicationContextXML

XmlWebApplicationContextwebXML
2.1.3 Bean
2.1BeanFactoryBean
1. Bean
2. SpringBeanBean
9

Spring In Action
3. Bean BeanNameAware Bean setBeanName()
BeanID
4. BeanBeanFactoryAwaresetBeanFactory()


5. BeanPostProcessor Bean postProcessBeforeInitialization()

6. Beaninit-method
7. BeanPostProcessor BeanpostProcessAfterInitialization()

BeanBeanFactory
BeanFactory
1. BeanDisposableBeandestroy()
2.
2.2BeanSpringBeanFactory
Bean ApplicationContextAwaresetApplicationContext()

10

Spring In Action

2.2
2.2.1


11

Spring In Action
2.1 StudentService.java
package chapter02;

public interface StudentService {
public Student getStudent(String id);
public void createStudent(Student student);
public java.util.Set getCompletedCourses(Student student);
}

2.2 CourseService.java
package chapter02;

public interface CourseService {
public Course getCourse(String id);
public void createCourse(Course course);
public java.util.Set getAllCourses();
public void enrollStudentInCourse(Course course,Student student) throws
CourseException;
}

2.3 StudentServiceImpl.java(StudentService )
package chapter02;

import java.util.Set;
public class StudentServiceImpl implements StudentService {
private StudentDao studentDao;
public StudentServiceImpl(StudentDao studentDao){//
this.studentDao = studentDao;
}
public void setStudentDao(StudentDao studentDao) {//setter
this.studentDao = studentDao;
}
public void createStudent(Student student) {
studentDao.create(student);
}
public Set getCompletedCourses(Student student) {
return studentDao.getCompletedCourses(student);
}
public Student getStudent(String id) {
return studentDao.findById(id);
}
}

12

Spring In Action
2.4 StudentDao.javaStudentServiceImpl StudentDao
package chapter02;
import java.util.Set;
/**
*
*/
public interface StudentDao {
Student findById(String id);
void create(Student student);
Set getCompletedCourses(Student student);
}

2.5 CourseServiceImpl.java
package chapter02;
import java.util.Iterator;
import java.util.Set;
public class CourseServiceImpl implements CourseService {
private CourseDao courseDao;
private StudentService studentService;
private int maxStudents;
public CourseServiceImpl(CourseDao dao) {//CourseDao
this.courseDao = dao;
}
public void setStudentService(StudentService service) {//setter
this.studentService = service;
}
public void setMaxStudents(int maxStudents) {
this.maxStudents = maxStudents;
}
public int getMaxStudents() {
return maxStudents;
}
public Course getCourse(String id) {
return courseDao.findById(id);
}
public void createCourse(Course course) {
courseDao.create(course);
}
public void enrollStudentInCourse(Course course, Student student)
throws CourseException {
//
if (course.getStudents().size() >= maxStudents) {
throw new CourseException("Course is full");
}
13

Spring In Action
//
enforcePrerequisites(course, student);
course.getStudents().add(student);
courseDao.update(course);
}
private void enforcePrerequisites(Course course, Student student)
throws CourseException {
Set completed = studentService.getCompletedCourses(student);
Set prereqs = course.getPrerequisites();
for (Iterator iter = prereqs.iterator(); iter.hasNext();) {
if (!completed.contains(iter.next())) {
//
throw new CourseException("Prerequisites are not met.");
}
}
}
public Set getAllCourses() {
return courseDao.getAllCourses();
}
}

2.6 CourseDao.javaCourseServiceImpl CourseDao
package chapter02;
import java.util.Set;
public interface CourseDao {
void update(Course course);
Course findById(String id);
void create(Course course);
Set getAllCourses();
}

2.7 training-dao.xmlDAO Bean
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--courseDao bean-->
<bean id="courseDao" class="chapter02.CourseDaoImpl"/>
<!--studentDao bean-->
<bean id="studentDao" class="chapter02.StudentDaoImpl"/>
</beans>


14

Spring In Action
2.8 training-service.xml Bean
<?xml ver si on=" 1. 0" encodi ng=" UTF- 8" ?>
<! DOCTYPE beans PUBLI C " - / / SPRI NG/ / DTD BEAN/ / EN"
" ht t p: / / www. spr i ngf r amewor k. or g/ dt d/ spr i ng- beans. dt d" >
<beans>
<! - - st udent Ser vi ce bean- - >
<bean i d=" st udent Ser vi ce" cl ass=" chapt er 02. St udent Ser vi ceI mpl " >
<const r uct or - ar g>
<r ef bean=" st udent Dao" / >
</ const r uct or - ar g>
</ bean>
<! - - cour seSer vi ce bean- - >
<bean i d=" cour seSer vi ce" cl ass=" chapt er 02. Cour seSer vi ceI mpl " >
<const r uct or - ar g>
<r ef bean=" cour seDao" / >
</ const r uct or - ar g>

<pr oper t y name=" maxSt udent s" >
<! - - <val ue>- - >
<val ue>30</ val ue>
</ pr oper t y>
<pr oper t y name=" st udent Ser vi ce" >
<! - - <r ef >Bean- - >
<r ef bean=" st udent Ser vi ce" / >
</ pr oper t y>
</ bean>
</ beans>
2.2.2
2.2.2.1

SpringBean<bean>singletonBean
BeantruefalseBeanBean
15

Spring In Action
2.2.2.2

BeanBean

Beaninit-methodBean
destory-methodBean
2.2.2.3 Bean
2.9 training-nest.xmlBean
<?xml ver si on=" 1. 0" encodi ng=" UTF- 8" ?>
<! DOCTYPE beans PUBLI C " - / / SPRI NG/ / DTD BEAN/ / EN"
" ht t p: / / www. spr i ngf r amewor k. or g/ dt d/ spr i ng- beans. dt d" >
<beans>
<! - - cour seSer vi ce bean- - >
<bean i d=" cour seSer vi ce" cl ass=" chapt er 02. Cour seSer vi ceI mpl " >
<const r uct or - ar g>
<r ef bean=" cour seDao" / >
</ const r uct or - ar g>

<pr oper t y name=" maxSt udent s" >
<! - - <val ue>- - >
<val ue>30</ val ue>
</ pr oper t y>
<pr oper t y name=" st udent Ser vi ce" >
<! - - Bean: st udent Ser vi ce- - >
<bean i d=" st udent Ser vi ce"
cl ass=" chapt er 02. St udent Ser vi ceI mpl " >
<const r uct or - ar g>
<r ef bean=" st udent Dao" / >
</ const r uct or - ar g>
</ bean>
</ pr oper t y>
</ bean>
</ beans>
16

Spring In Action
2.2.2.4
2.1 Spring
XML
<list> java.awt.List,arrays
<set> java.awt.Set
<map> java.awt.Map
<props> java.awt.Properties
2.2.2.4.1
2.10
<bean i d=" sessi onFact or ySt at s"
cl ass=" or g. spr i ngf r amewor k. or m. hi ber nat e3. Local Sessi onFact or yBean" >
<pr oper t y name=" dat aSour ce" r ef =" dat aSour ceSt at s" / >
<pr oper t y name=" mappi ngResour ces" >
<l i st >
<val ue>exampl e/ ex1. hbm. xml </ val ue>
<val ue>exampl e/ ex2. hbm. xml </ val ue>
</ l i st >
</ pr oper t y>
<pr oper t y name=" hi ber nat ePr oper t i es" >
<pr ops>
<pr op key=" hi ber nat e. di al ect " >
${hi ber nat e. di al ect }
</ pr op>
<pr op key=" hi ber nat e. show_sql " >t r ue</ pr op>
<pr op key=" hi ber nat e. j dbc. bat ch_si ze" >20</ pr op>
<pr op key=" hi ber nat e. j dbc. f et ch_si ze" >20</ pr op>
<pr op key=" hi ber nat e. gener at e_st at i st i cs" >t r ue</ pr op>
</ pr ops>
</ pr oper t y>
<pr oper t y name=" event Li st ener s" >
<map>
<ent r y key=" mer ge" >
<bean
cl ass=" or g. spr i ngf r amewor k. or m. hi ber nat e3. suppor t . I dTr ansf er r i ngMer ge
Event Li st ener " / >
</ ent r y>
</ map>
</ pr oper t y>
</ bean>
17

Spring In Action
2.2.2.4.2 List

2.2.2.4.3 Set

2.2.2.4.4 Map

Map <entry>
Map<entry><list><set><value>
<ref><list><map><entry>keyString
2.2.2.4.5 Properties
J ava.util.Properties Spring<props>
<prop><prop>String
18

Spring In Action

2.11<props>URL
<pr oper t y name=" mappi ngs" >
<pr ops>
<pr op key=" / vi ewCour seDet ai l s. ht m" >
vi ewCour seCont r ol l er
</ pr op>
</ pr ops>
</ pr oper t y>
2.2.2.5 null
2.12null
<pr oper t y name=" f oo" ><nul l / ><pr oper t y>
2.2.2.6

<constructor-arg>index
2.13index
<bean i d=" f oo" cl ass=" com. spr i ngi nact i on. Foo" >
<const r uct or - ar g i ndex=" 1" >
<val ue>ht t p: / / www. manni ng. com</ val ue>
</ const r uct or - ar g>
<const r uct or - ar g i ndex=" 0" >
<val ue>ht t p: / / www. spr i ngi nact i on. com</ val ue>
</ const r uct or - ar g>
</ bean>

2.14type
<bean i d=" f oo" cl ass=" com. spr i ngi nact i on. Foo" >
<const r uct or - ar g t ype=" j ava. l ang. St r i ng" >
<val ue>ht t p: / / www. manni ng. com</ val ue>
</ const r uct or - ar g>
<const r uct or - ar g t ype=" j ava. net . URL" >
<val ue>ht t p: / / www. spr i ngi nact i on. com</ val ue>
</ const r uct or - ar g>
</ bean>
19

Spring In Action
2.3
<bean>autowireSpring

4
byNameBeanID
Bean
byType Bean
Bean Bean
org.springframework.beans.factory.UnsatisfiedDependencyException
constructor Bean
Bean Bean
org.springframework.beans.factory.UnsatisfiedDependencyException
autodetectconstructor byType
constructor byType
2.4 Spring Bean
Bean
BeanBeanBean

SpringBean

BeanSpring
Spring
2.4.1 Bean
Bean Bean
BeanPostProcessor Bean
2.15 BeanPostProcessor.java
package or g. spr i ngf r amewor k. beans. f act or y. conf i g;
import or g. spr i ngf r amewor k. beans. BeansExcept i on;
public interface BeanPost Pr ocessor {
Obj ect post Pr ocessBef or eI ni t i al i zat i on( Obj ect bean, St r i ng beanName) throws
BeansExcept i on;
Obj ect post Pr ocessAf t er I ni t i al i zat i on( Obj ect bean, St r i ng beanName) throws
BeansExcept i on;
}
20

Spring In Action
postProcessBeforeInitialization() Bean afterPropertiesSet()
BeaninitmethodpostProcessAfterInitialization()

2.4.1.1
2.16 Fuddi f i er . j avaBean
package chapt er 02. ot her ;
import j ava. l ang. r ef l ect . Fi el d;
import or g. spr i ngf r amewor k. beans. BeansExcept i on;
import or g. spr i ngf r amewor k. beans. f act or y. conf i g. BeanPost Pr ocessor ;
public class Fuddi f i er implements BeanPost Pr ocessor {
/ **
* Beanj ava. l ang. St r i ng
* St r i ngf uddi f y( St r i ng)
*/
public Obj ect post Pr ocessAf t er I ni t i al i zat i on( Obj ect bean, St r i ng name)
throws BeansExcept i on {
Fi el d[ ] f i el ds = bean. get Cl ass( ) . get Decl ar edFi el ds( ) ;
try {
for ( int i = 0; i < f i el ds. l engt h; i ++) {
if ( f i el ds[ i ] . get Type( ) . equal s( j ava. l ang. St r i ng. class) ) {
f i el ds[ i ] . set Accessi bl e( true) ;
St r i ng or i gi nal = ( St r i ng) f i el ds[ i ] . get ( bean) ;
f i el ds[ i ] . set ( bean, f uddi f y( or i gi nal ) ) ;
}
}
} catch ( I l l egal AccessExcept i on e) {
e. pr i nt St ackTr ace( ) ;
}
return bean;
}
private St r i ng f uddi f y( St r i ng or i g) {
if ( or i g == null)
return or i g;
return or i g. r epl aceAl l ( " ( r | l ) " , " w" ) . r epl aceAl l ( " ( R| L) " , " W" ) ;
}
public Obj ect post Pr ocessBef or eI ni t i al i zat i on( Obj ect bean, St r i ng name)
throws BeansExcept i on {
return bean;
}
}
BeanBean
21

Spring In Action
Bean
2.17 BeanBean
Xml BeanFact or y f act or y = new Xml BeanFact or y(
new Fi l eSyst emResour ce( " / t r ai ni ng- ser vi ce. xml " ) ) ;
BeanPost Pr ocessor f uddi f i er = new Fuddi f i er ( ) ;
f act or y. addBeanPost Pr ocessor ( f uddi f i er ) ;

2.18 Bean
<bean i d=" f uddi f i er " cl ass=" chapt er 02. ot her . Fuddi f i er " / >
2.4.2 Bean
BeanFactoryPostProcessor BeanBeanBean
Bean
2.19 BeanFact or yPost Pr ocessor . j ava
package or g. spr i ngf r amewor k. beans. f act or y. conf i g;

import or g. spr i ngf r amewor k. beans. BeansExcept i on;
public interface BeanFact or yPost Pr ocessor {
void post Pr ocessBeanFact or y( Conf i gur abl eLi st abl eBeanFact or y beanFact or y)
throws BeansExcept i on;
}
2.4.2.1
2.20 BeanCounter.javaBeanFactoryPostProcessor Bean
package chapt er 02. ot her ;
import or g. apache. l og4j . Logger ;
import or g. spr i ngf r amewor k. beans. BeansExcept i on;
import or g. spr i ngf r amewor k. beans. f act or y. conf i g. BeanFact or yPost Pr ocessor ;
import
or g. spr i ngf r amewor k. beans. f act or y. conf i g. Conf i gur abl eLi st abl eBeanFact or y;

public class BeanCount er implements BeanFact or yPost Pr ocessor {
private Logger LOGGER = Logger . getLogger( BeanCount er . class) ;
public void post Pr ocessBeanFact or y( Conf i gur abl eLi st abl eBeanFact or y
f act or y)
throws BeansExcept i on {
LOGGER. debug( " BEAN COUNT: " + f act or y. get BeanDef i ni t i onCount ( ) ) ;
}
}
BeanBeanFactoryPostProcessorXML
22

Spring In Action

2.21 BeanFactoryPostProcessor
<bean i d=" beanCount er " cl ass=" chapt er 02. ot her . BeanCount er " / >
2.4.3
PropertyPlaceholderConfigurer
2.22
<bean i d=" pr oper t yConf i gur er "
cl ass=" or g. spr i ngf r amewor k. beans. f act or y. conf i g. Pr oper t yPl acehol der Conf i gur e
r " >
<pr oper t y name=" l ocat i on" val ue=" WEB- I NF/ j dbc. pr oper t i es" / >
</ bean>
locationlocations
2.23
<bean i d=" pr oper t yConf i gur er "
cl ass=" or g. spr i ngf r amewor k. beans. f act or y. conf i g. Pr oper t yPl acehol der Conf i gur e
r " >
<pr oper t y name=" l ocat i ons" >
<l i st >
<val ue>j dbc. pr oper t i es</ val ue>
<val ue>secur i t y. pr oper t i es</ val ue>
<val ue>appl i cat i on. pr oper t i es</ val ue>
</ l i st >
</ pr oper t y>
</ bean>
Bean
${variable}
2.24
<bean i d=" dat aSour ceDBA"
cl ass=" or g. spr i ngf r amewor k. j dbc. dat asour ce. Dr i ver Manager Dat aSour ce" >
<pr oper t y name=" dr i ver Cl assName" val ue=" ${j dbc. dr i ver Cl assName}" / >
<pr oper t y name=" ur l " val ue=" ${j dbc. ur l }" / >
<pr oper t y name=" user name" val ue=" ${j dbc. user name. dba}" / >
<pr oper t y name=" passwor d" val ue=" ${j dbc. passwor d. dba}" / >
</ bean>
2.4.4
J avaBean java.beans.PropertyEditor String
PropertyEditorSupport
getAsText
23

Spring In Action
setAsText(String text)Bean
SpringPropertyEditorSupport
URLEditorjava.net.URL
ClassEditorjava.lang.Class
CustomDateEditorjava.text.DateFormat java.util.Date

FileEditorjava.io.File
LocaleEditoren_USjava.util.Local
StringArrayPropertyEditorStringString
StringTrimmerEditornull
2.4.4.1
2.25 PhoneEdi t or . j avaPr oper t yEdi t or Suppor t
package chapt er 02. phone;
import j ava. beans. Pr oper t yEdi t or Suppor t ;
public class PhoneEdi t or extends Pr oper t yEdi t or Suppor t {
public void set AsText ( St r i ng t ext Val ue) {
St r i ng st r i pped = st r i pNonNumer i c( t ext Val ue) ;
St r i ng ar eaCode = st r i pped. subst r i ng( 0, 3) ;
St r i ng pr ef i x = st r i pped. subst r i ng( 3, 6) ;
St r i ng number = st r i pped. subst r i ng( 6) ;
PhoneNumber phone = new PhoneNumber ( ar eaCode, pr ef i x, number ) ;
set Val ue( phone) ;
}
private St r i ng st r i pNonNumer i c( St r i ng or i gi nal ) {
St r i ngBuf f er al l Numer i c = new St r i ngBuf f er ( ) ;
for ( int i = 0; i < or i gi nal . l engt h( ) ; i ++) {
char c = or i gi nal . char At ( i ) ;
if ( Char act er . isDigit( c) ) {
al l Numer i c. append( c) ;
}
}
return al l Numer i c. t oSt r i ng( ) ;
}
}
PhoneEditor PhoneEditor
Bean
2.26
St r i ng pr op = " chapt er 02/ phone/ phone. xml " ;
Resour ce r es = new Cl assPat hResour ce( pr op) ;
PhoneEdi t or pe = new PhoneEdi t or ( ) ;
Xml BeanFact or y beanFact or y = new Xml BeanFact or y( r es) ;
24

Spring In Action
/ /
beanFact or y. r egi st er Cust omEdi t or ( PhoneNumber . class, pe ) ;

2.27
<bean i d=" cust omEdi t or Conf i gur er "
cl ass=" or g. spr i ngf r amewor k. beans. f act or y. conf i g. Cust omEdi t or Conf i gur er " >
<pr oper t y name=" cust omEdi t or s" >
<map>
<ent r y key=" chapt er 02. phone. PhoneNumber " >
<bean i d=" phoneEdi t or " cl ass=" chapt er 02. phone. PhoneEdi t or " / >
</ ent r y>
</ map>
</ pr oper t y>
</ bean>

2.28 Spring
<?xml ver si on=" 1. 0" encodi ng=" UTF- 8" ?>
<! DOCTYPE beans PUBLI C " - / / SPRI NG/ / DTD BEAN/ / EN"
" ht t p: / / www. spr i ngf r amewor k. or g/ dt d/ spr i ng- beans. dt d" >
<beans>
<bean i d=" cust omEdi t or Conf i gur er "
cl ass=" or g. spr i ngf r amewor k. beans. f act or y. conf i g. Cust omEdi t or Conf i gur er " >
<pr oper t y name=" cust omEdi t or s" >
<map>
<ent r y key=" chapt er 02. phone. PhoneNumber " >
<bean i d=" phoneEdi t or " cl ass=" chapt er 02. phone. PhoneEdi t or "
/ >
</ ent r y>
</ map>
</ pr oper t y>
</ bean>
<bean i d=" cont act " cl ass=" chapt er 02. phone. Cont act " >
<pr oper t y name=" phoneNumber " >
<val ue>888- 555- 1212</ val ue>
</ pr oper t y>
</ bean>
</ beans>

2.29 Cont act . j ava
package chapt er 02. phone;
public class Cont act {
private PhoneNumber phoneNumber ;
public void set PhoneNumber ( PhoneNumber phoneNumber ) {
25

Spring In Action
this. phoneNumber = phoneNumber ;
}
public PhoneNumber get PhoneNumber ( ) {
return phoneNumber ;
}
}

2.30 PhoneNumber . j ava
package chapt er 02. phone;
public class PhoneNumber {
private St r i ng ar eaCode;
private St r i ng pr ef i x;
private St r i ng number ;
public PhoneNumber ( ) {
}
public PhoneNumber ( St r i ng ar eaCode, St r i ng pr ef i x, St r i ng number ) {
super( ) ;
this. ar eaCode = ar eaCode;
this. pr ef i x = pr ef i x;
this. number = number ;
}
public St r i ng get Ar eaCode( ) {
return ar eaCode;
}
public St r i ng get Number ( ) {
return number ;
}
public St r i ng get Pr ef i x( ) {
return pr ef i x;
}
}
2.4.5
SpringMessageSource
2.31 MessageSour ce. j ava
package or g. spr i ngf r amewor k. cont ext ;
import j ava. ut i l . Local e;
public interface MessageSour ce {
St r i ng get Message( St r i ng code, Obj ect [ ] ar gs, St r i ng def aul t Message,
Local e l ocal e) ;
St r i ng get Message( St r i ng code, Obj ect [ ] ar gs, Local e l ocal e) throws
NoSuchMessageExcept i on;
26

Spring In Action
St r i ng get Message( MessageSour ceResol vabl e r esol vabl e, Local e l ocal e)
throws NoSuchMessageExcept i on;
}
SrpingResourceBundleMessageSource

2.32 ResourceBundleMessageSourceidmessageSour ce
<bean i d=" messageSour ce"
cl ass=" or g. spr i ngf r amewor k. cont ext . suppor t . Resour ceBundl eMessageSour ce" >
<pr oper t y name=" basename" >
<val ue>t r ai ni ngt ext </ val ue>
</ pr oper t y>
</ bean>
2.4.6
2.4.6.1

org.springframework.context.ApplicationEvent
ContextClosedEvent
ContextRefreshedEvent
RequestHandledEventweb
org.springframework.context.ApplicationListener
onApplicationEvent(ApplicationEvent event)
2.33 Ref r eshLi st ener . j ava
package chapt er 02. phone;
import or g. spr i ngf r amewor k. cont ext . Appl i cat i onEvent ;
import or g. spr i ngf r amewor k. cont ext . Appl i cat i onLi st ener ;
public class Ref r eshLi st ener implements Appl i cat i onLi st ener {
public void onAppl i cat i onEvent ( Appl i cat i onEvent event ) {
/ / TODO Aut o- gener at ed met hod st ub
}
}

2.34 Ref r eshLi st ener
<bean i d=" r ef r eshLi st ener " cl ass=" com. spr i ngi nact i on. f oo. Ref r eshLi st ener " / >
2.4.6.2
ApplicationEvent2.35
publishEvent()2.36
27

Spring In Action
2.35 Cour seFul l Event . j ava
package chapt er 02;
import or g. spr i ngf r amewor k. cont ext . Appl i cat i onEvent ;
public class Cour seFul l Event extends Appl i cat i onEvent {
private Cour se cour se;
public Cour seFul l Event ( Obj ect sour ce, Cour se cour se) {
super( sour ce) ;
this. cour se = cour se;
}
public Cour se get Cour se( ) {
return cour se;
}
}

2.36
St r i ng pr op = " chapt er 02/ phone/ phone. xml " ;
Appl i cat i onCont ext cont ext =new Cl assPat hXml Appl i cat i onCont ext ( pr op) ;
Cour se cour se = new Cour se( ) ;
/ /
cont ext . publ i shEvent ( new Cour seFul l Event ( this, cour se) ) ;
2.4.7 Bean

BeanNameAware
BeanFactoryAwareBeanFactory
ApplicationContextAwareApplicationContext
28

Spring In Action
3 AOP
3.1 AOP

3.1



3.1.1 AOP
Aspect
J oinpoint

Advice

Pointcut

Introduction
Target
Proxy
Weaving


J VM

AOP
29

Spring In Action


3.1.2 Spring AOP

J avaSpring
Spring
SpringAOP
Spring
Srping
Spring J DK
java.lang.reflect.Proxy

SpringCGLIB


final
3.2


3.1 KwikEMart.java
package chapt er 03. kwi k;
public interface Kwi kEMar t {
Squi shee buySqui shee( Cust omer cust omer ) throws Kwi kEMar t Except i on;
}

3.2 ApuKwikEMart.javaKwikEMart
package chapt er 03. kwi k;
30

Spring In Action
public class ApuKwi kEMar t implements Kwi kEMar t {
private boolean squi sheeMachi neEmpt y;
public Squi shee buySqui shee( Cust omer cust omer ) throws Kwi kEMar t Except i on {
if ( cust omer . i sBr oke( ) ) {
throw new Cust omer I sBr okeExcept i on( ) ;
}
if ( squi sheeMachi neEmpt y) {
throw new NoMor eSqui sheesExcept i on( ) ;
}
return new Squi shee( ) ;
}
}
3.2.1
MethodBeforeAdvice
3.3 Met hodBef or eAdvi ce.java
package or g. spr i ngf r amewor k. aop;
import j ava. l ang. r ef l ect . Met hod;
public interface Met hodBef or eAdvi ce extends Bef or eAdvi ce {
void bef or e( Met hod met hod, Obj ect [ ] ar gs, Obj ect t ar get ) throws Thr owabl e;
}

3.4 Wel comeAdvi ce. j ava
package chapt er 03. kwi k;
import j ava. l ang. r ef l ect . Met hod;
import or g. spr i ngf r amewor k. aop. Met hodBef or eAdvi ce;
public class Wel comeAdvi ce implements Met hodBef or eAdvi ce {
public void bef or e( Met hod met hod, Obj ect [ ] ar gs, Obj ect t ar get ) {
Cust omer cust omer = ( Cust omer ) ar gs[ 0] ; / / Cust omer
Syst em. out. pr i nt l n( " Hel l o " + cust omer . get Name( )
+ " . How ar e you doi ng?" ) ; / / Cust omer
}
}
void
System.exit()
3.5 kwi kemar t . xml
<?xml ver si on=" 1. 0" encodi ng=" UTF- 8" ?>
<! DOCTYPE beans PUBLI C " - / / SPRI NG/ / DTD BEAN/ / EN"
" ht t p: / / www. spr i ngf r amewor k. or g/ dt d/ spr i ng- beans. dt d" >
<beans>
<! - - - - >
<bean i d=" kwi kEMar t Tar get " cl ass=" chapt er 03. kwi k. ApuKwi kEMar t " / >
31

Spring In Action
<! - - - - >
<bean i d=" wel comeAdvi ce" cl ass=" chapt er 03. kwi k. Wel comeAdvi ce" / >

<! - - Bean - - >
<bean i d=" kwi kEMar t "
cl ass=" or g. spr i ngf r amewor k. aop. f r amewor k. Pr oxyFact or yBean" >
<pr oper t y name=" pr oxyI nt er f aces" >
<val ue>chapt er 03. kwi k. Kwi kEMar t </ val ue>
</ pr oper t y>
<pr oper t y name=" i nt er cept or Names" >
<l i st >
<val ue>wel comeAdvi ce</ val ue>
</ l i st >
</ pr oper t y>
<pr oper t y name=" t ar get " >
<r ef bean=" kwi kEMar t Tar get " / >
</ pr oper t y>
</ bean>
<! - - Bean - - >
</ beans>
ProxyFactoryBeanBeanFactoryApplicationContext
Bean
KwikEMart
WelcomeAdviceidwelcomeAdvice
ApuKwikEMart Bean
3.2.2
AfterReturningAdvice
3.6 Af t er Ret ur ni ngAdvi ce. j ava
package or g. spr i ngf r amewor k. aop;
import j ava. l ang. r ef l ect . Met hod;
import or g. aopal l i ance. aop. Advi ce;
public interface Af t er Ret ur ni ngAdvi ce extends Advi ce {
void af t er Ret ur ni ng( Obj ect r et ur nVal ue, Met hod met hod, Obj ect [ ] ar gs, Obj ect
t ar get ) throws Thr owabl e;
}

3.7 ThankYouAdvi ce. j ava
package chapt er 03. kwi k;
import j ava. l ang. r ef l ect . Met hod;
import or g. spr i ngf r amewor k. aop. Af t er Ret ur ni ngAdvi ce;

32

Spring In Action
public class ThankYouAdvi ce implements Af t er Ret ur ni ngAdvi ce {
public void af t er Ret ur ni ng( Obj ect r et ur nVal ue, Met hod met hod,
Obj ect [ ] ar g2, Obj ect t ar get ) throws Thr owabl e {
Syst em. out. pr i nt l n( " Thank you. Come agai n! " ) ;
}
}
3.2.3
MethodInterceptor
3.8 MethodInterceptor. j ava
publ i c i nt er f ace Met hodI nt er cept or ext ends I nt er cept or {
Obj ect i nvoke( Met hodI nvocat i on i nvocat i on) t hr ows Thr owabl e;
}

MethodInterceptor MethodInvocation
proceed()
MethodInterceptor
3.9 OnePer Cust omer I nt er cept or . j ava
package chapt er 03. kwi k;
import j ava. ut i l . HashSet ;
import j ava. ut i l . Set ;
import or g. aopal l i ance. i nt er cept . Met hodI nt er cept or ;
import or g. aopal l i ance. i nt er cept . Met hodI nvocat i on;
public class OnePer Cust omer I nt er cept or implements Met hodI nt er cept or {
private Set cust omer s = new HashSet ( ) ; / /
public Obj ect i nvoke( Met hodI nvocat i on i nvocat i on) throws Thr owabl e {
Cust omer cust omer = ( Cust omer ) i nvocat i on. get Ar gument s( ) [ 0] ; / /

if ( cust omer s. cont ai ns( cust omer ) ) {
/ /
throw new Kwi kEMar t Except i on( " One per cust omer . " ) ;
}
Obj ect squi shee = i nvocat i on. pr oceed( ) ; / /
cust omer s. add( cust omer ) ; / /
return squi shee; / /
}
}
3.2.4
ThrowsAdvice
33

Spring In Action
3.10 ThrowsAdvice. j ava
package or g. spr i ngf r amewor k. aop;
import or g. aopal l i ance. aop. Advi ce;
/ **
* Ther e ar en' t any met hods on t hi s i nt er f ace, as met hods ar e i nvoked by r ef l ect i on.
* I mpl ement i ng cl asses shoul d i mpl ement met hods of t he f or m
* af t er Thr owi ng( [ Met hod] , [ ar gs] , [ t ar get ] , Thr owabl e subcl ass)
* The f i r st t hr ee ar gument s ar e opt i onal , and onl y usef ul i f
* we want f ur t her i nf or mat i on about t he j oi npoi nt , as i n Aspect J
* af t er t hr owi ng advi ce.
*
* @author Rod J ohnson
*/
public interface Thr owsAdvi ce extends Advi ce {
}

3.11ThrowsAdvice
/ **
* @param t hr owabl e- - Thr owabl e,
*/
void af t er Thr owi ng( Thr owabl e t hr owabl e)
/ **
* @param met hod- - Met hod,
* @param ar gs- - Obj ect [ ] ,
* @param t ar get - - Obj ect ,
* @param t hr owabl e- - Thr owabl e,
*/
void af t er Thr owi ng( Met hod met hod, Obj ect [ ] ar gs, Obj ect t ar get , Thr owabl e
t hr owabl e)

3.12 Kwi kEMar t Except i onAdvi ce. j avaThrowsAdvice
package chapt er 03. kwi k;
import or g. spr i ngf r amewor k. aop. Thr owsAdvi ce;
public class Kwi kEMar t Except i onAdvi ce implements Thr owsAdvi ce {
public void af t er Thr owi ng( NoMor eSqui sheesExcept i on e) {
/ / NoMor eSqui sheesExcept i on
}
public void af t er Thr owi ng( Cust omer I sBr okeExcept i on e) {
/ / Cust omer I sBr okeExcept i on
}
}
34

Spring In Action
3.2.5


3.3
3.3.1
Spring
SpringPointcut
3.13 Poi nt cut . j ava
package or g. spr i ngf r amewor k. aop;
public interface Poi nt cut {
Cl assFi l t er get Cl assFi l t er ( ) ;
Met hodMat cher get Met hodMat cher ( ) ;
/ / coul d add get Fi el dMat cher ( ) wi t hout br eaki ng most exi st i ng code
/ **
* Canoni cal Poi nt cut i nst ance t hat al ways mat ches.
*/
Poi nt cut TRUE = Tr uePoi nt cut . I NSTANCE;
}

3.13 Cl assFi l t er . j ava
package or g. spr i ngf r amewor k. aop;
public interface Cl assFi l t er {
boolean mat ches( Cl ass cl azz) ;
Cl assFi l t er TRUE = Tr ueCl assFi l t er . I NSTANCE;
}
TRUE
3.14 Met hodMat cher . j ava
package or g. spr i ngf r amewor k. aop;
import j ava. l ang. r ef l ect . Met hod;
public interface Met hodMat cher {
boolean mat ches( Met hod met hod, Cl ass t ar get Cl ass) ;
boolean i sRunt i me( ) ;
boolean mat ches( Met hod met hod, Cl ass t ar get Cl ass, Obj ect [ ] ar gs) ;
Met hodMat cher TRUE = Tr ueMet hodMat cher . I NSTANCE;
}
MethodMatcher
matches(Method,Class) AOP
35

Spring In Action

matches(Method,Class) trueisRuntime() MethodMatcher
isRuntime()
false
isRuntime()true
matches(Method,Class,Object[])
matches(Method,Class,Object[])

3.3.2 Advisor
Advisor PointcutAdvisor
3.3.3
StaticMethodMatcherPointcut
NameMatchMethodPointcut J dkRegexpMethodPointcut
3.3.4
ControlFlowPointcut
3.3.5
Spring
ComposablePointcut ComposablePointcutMethodMatcher
ClassFilter ComposablePointcut
intersection()union()
PointcutsPointcut
3.15 Uni onPoi nt cut . j ava
package chapt er 03;
import j ava. ut i l . Li st ;
import or g. spr i ngf r amewor k. aop. Cl assFi l t er ;
import or g. spr i ngf r amewor k. aop. Met hodMat cher ;
import or g. spr i ngf r amewor k. aop. Poi nt cut ;
import or g. spr i ngf r amewor k. aop. f r amewor k. AopConf i gExcept i on;
import or g. spr i ngf r amewor k. aop. suppor t . Poi nt cut s;
public class Uni onPoi nt cut implements Poi nt cut {
private Poi nt cut del egat e; / / Poi nt cut
public Cl assFi l t er get Cl assFi l t er ( ) {/ / Poi nt cut
return get Del egat e( ) . get Cl assFi l t er ( ) ;
36

Spring In Action
}
public Met hodMat cher get Met hodMat cher ( ) {/ / Poi nt cut
return get Del egat e( ) . get Met hodMat cher ( ) ;
}
private Poi nt cut get Del egat e( ) {/ /
if ( del egat e == null) {
throw new AopConf i gExcept i on( " No poi nt cut s have been conf i gur ed. " ) ;
}
return del egat e;
}
public void set Poi nt cut s( Li st poi nt cut s) {/ /
if ( poi nt cut s == null | | poi nt cut s. si ze( ) == 0) {
throw new AopConf i gExcept i on( " Must have at l east one Poi nt cut . " ) ;
}
del egat e = ( Poi nt cut ) poi nt cut s. get ( 0) ;
for ( int i = 1; i < poi nt cut s. si ze( ) ; i ++) {
Poi nt cut poi nt cut = ( Poi nt cut ) poi nt cut s. get ( i ) ;
del egat e = Poi nt cut s. union( del egat e, poi nt cut ) ;
}
}
}
3.4


3.4.1 IntroductionInterceptor
SpringMethodInterceptor IntroductionMethodInterceptor
boolean implementsInterface (Class intf);
3.16 Audi t abl e. j ava
package chapt er 03. t r ai ni ng;
import j ava. ut i l . Dat e;
public interface Audi t abl e {
void set Last Modi f i edDat e( Dat e dat e) ;
Dat e get Last Modi f i edDat e( ) ;
}

3.17 Audi t abl eMi xi n. j avaI nt r oduct i onI nt er cept or
package chapt er 03. t r ai ni ng;
import j ava. ut i l . Dat e;
37

Spring In Action
import or g. aopal l i ance. i nt er cept . Met hodI nvocat i on;
import or g. spr i ngf r amewor k. aop. I nt r oduct i onI nt er cept or ;
public class Audi t abl eMi xi n implements I nt r oduct i onI nt er cept or , Audi t abl e {
public boolean i mpl ement sI nt er f ace( Cl ass i nt f ) {/ / Audi t abl e
return i nt f . i sAssi gnabl eFr om( Audi t abl e. class) ;
}
public Obj ect i nvoke( Met hodI nvocat i on m) throws Thr owabl e {
if ( i mpl ement sI nt er f ace( m. get Met hod( ) . get Decl ar i ngCl ass( ) ) ) {
/ /
return m. get Met hod( ) . i nvoke( this, m. get Ar gument s( ) ) ;
} else {/ /
return m. pr oceed( ) ;
}
}
/ *==============================*/
private Dat e l ast Modi f i edDat e;
public Dat e get Last Modi f i edDat e( ) {
return l ast Modi f i edDat e;
}
public void set Last Modi f i edDat e( Dat e l ast Modi f i edDat e) {
this. l ast Modi f i edDat e = l ast Modi f i edDat e;
}
}
SpringDelegatingIntroductionInterceptor
3.18 Audi t abl eMi xi n. j avaDelegatingIntroductionInterceptor
package chapt er 03. t r ai ni ng;
import j ava. ut i l . Dat e;
import or g. spr i ngf r amewor k. aop. suppor t . Del egat i ngI nt r oduct i onI nt er cept or ;
public class Audi t abl eMi xi n extends Del egat i ngI nt r oduct i onI nt er cept or
implements Audi t abl e {
private Dat e l ast Modi f i edDat e;
public Dat e get Last Modi f i edDat e( ) {
return l ast Modi f i edDat e;
}
public void set Last Modi f i edDat e( Dat e l ast Modi f i edDat e) {
this. l ast Modi f i edDat e = l ast Modi f i edDat e;
}
}
invoke()
I mmut abl e
3.18 Audi t abl eMi xi n. j avaDelegatingIntroductionInterceptor
package chapt er 03. t r ai ni ng;
import or g. aopal l i ance. i nt er cept . Met hodI nvocat i on;
38

Spring In Action
import or g. spr i ngf r amewor k. aop. suppor t . Del egat i ngI nt r oduct i onI nt er cept or ;
public class I mmut abl eMi xi n
extends Del egat i ngI nt r oduct i onI nt er cept or implements I mmut abl e {
private boolean i mmut abl e;
public void set I mmut abl e( boolean i mmut abl e) {/ / i mmut abl e
this. i mmut abl e = i mmut abl e;
}
public Obj ect i nvoke( Met hodI nvocat i on mi ) throws Thr owabl e {
/ / set
St r i ng name = mi . get Met hod( ) . get Name( ) ;
if ( i mmut abl e && name. i ndexOf ( " set " ) == 0) {
throw new I l l egal Modi f i cat i onExcept i on( ) ;
}
return super. i nvoke( mi ) ;
}
}
3.4.2 Advisor
IntroductionAdvisorDefaultIntroductionAdvisor
<beans>
<bean i d=" cour seTar get "
cl ass=" com. spr i ngi nact i on. t r ai ni ng. model . Cour se" si ngl et on=" f al se" / >
<bean i d=" audi t abl eMi xi n"
cl ass=" com. spr i ngi nact i on. t r ai ni ng. advi ce. Audi t abl eMi xi n"
si ngl et on=" f al se" / >
<bean i d=" audi t abl eAdvi sor "
cl ass=" or g. spr i ngf r amewor k. aop. suppor t . Def aul t I nt r oduct i onAdvi sor "
si ngl et on=" f al se" >
<const r uct or - ar g>
<r ef bean=" audi t abl eMi xi n" / >
</ const r uct or - ar g>
</ bean>
<bean i d=" cour se"
cl ass=" or g. spr i ngf r amewor k. aop. f r amewor k. Pr oxyFact or yBean" >
<pr oper t y name=" pr oxyTar get Cl ass" >
<val ue>t r ue</ val ue>
</ pr oper t y>
<pr oper t y name=" si ngl et on" >
<val ue>f al se</ val ue>
</ pr oper t y>
<pr oper t y name=" pr oxyI nt er f aces" >
<val ue>com. spr i ngi nact i on. t r ai ni ng. advi ce. Audi t abl e</ val ue>
39

Spring In Action
</ pr oper t y>
<pr oper t y name=" audi t abl eAdvi sor " >
<l i st >
<val ue>ser vl et Advi sor </ val ue>
</ l i st >
</ pr oper t y>
<pr oper t y name=" t ar get " >
<val ue r ef =" cour seTar get " / >
</ pr oper t y>
</ bean>
</ beans>
3.5 ProxyFactoryBean
3.3 ProxyFactoryBean

target
proxyInterfaces
interceptorNames Bean Advisor
BeanFactory
singleton getBean
false
aopProxyFactory ProxyFactoryBeanSpringJ DK CGLIB

exposeProxy AopContext.getCurrentProxy

frozen true
ProxyFactoryBean
optimize CGLIB
proxyTargetClass CGLIB
3.6
BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator
3.6.1 BeanNameAutoProxyCreator
Bean
Bean PerformanceThresholdInterceptor
BeanNameAutoProxyCreator
Service

40

Spring In Action
3.19 Per f or manceThr eshol dI nt er cept or . j ava
package chapt er 03. t r ai ni ng. advi ce;
import or g. aopal l i ance. i nt er cept . Met hodI nt er cept or ;
import or g. aopal l i ance. i nt er cept . Met hodI nvocat i on;
public class Per f or manceThr eshol dI nt er cept or implements Met hodI nt er cept or {
private final long t hr eshol dI nMi l l i s; / /
public Per f or manceThr eshol dI nt er cept or ( long t hr eshol dI nMi l l i s) {/ /
this. t hr eshol dI nMi l l i s = t hr eshol dI nMi l l i s;
}
public Obj ect i nvoke( Met hodI nvocat i on i nvocat i on) throws Thr owabl e {
long t = Syst em. currentTimeMillis( ) ;
Obj ect o = i nvocat i on. pr oceed( ) ;
t = Syst em. currentTimeMillis( ) - t ;
if ( t > t hr eshol dI nMi l l i s) {
war nThr eshol dExceeded( ) ;
}
return o;
}
private void war nThr eshol dExceeded( ) {
Syst em. out. pr i nt l n( " Danger ! Danger ! " ) ;
}
}
3.19BeanNameAutoProxyCreatorService
<bean i d=" per f or manceThr eshol dI nt er cept or "
cl ass=" chapt er 03. t r ai ni ng. advi ce. Per f or manceThr eshol dI nt er cept or " >
<const r uct or - ar g>
<val ue>5000</ val ue>
</ const r uct or - ar g>
</ bean>
<bean i d=" pr ef or manceThr eshol dPr oxyCr eat or "
cl ass=" or g. spr i ngf r amewor k. aop. f r amewor k. aut opr oxy. BeanNameAut oPr oxyPr oxy
Cr eat or " >
<bean>
<pr oper t y name=" beanNames" >
<l i st >
<val ue>*Ser vi ce</ val ue>
</ l i st >
</ pr oper t y>
<pr oper t y name=" i nt er cept or Names" >
<! - - i nt er cept or NamesAdvi sor - - >
<val ue>per f or manceThr eshol dI nt er cept or </ val ue>
</ pr oper t y>
</ bean>
</ bean>
41

Spring In Action
3.6.2 DefaultAdvisorAutoProxyCreator
BeanBeanPostProcessor
ApplicationContextBeanAdvisor
Advisor Advisor BeanAdvisor
3.20 DefaultAdvisorAutoProxyCreatorService
<bean i d=" per f or manceThr eshol dI nt er cept or "
cl ass=" chapt er 03. t r ai ni ng. advi ce. Per f or manceThr eshol dI nt er cept or " >
<const r uct or - ar g>
<val ue>5000</ val ue>
</ const r uct or - ar g>
</ bean>
<bean i d=" advi sor "
cl ass=" or g. spr i ngf r amewor k. aop. suppor t . RegexpMet hodPoi nt cut Advi sor " >
<pr oper t y name=" advi ce" >
<bean cl ass=" per f or manceThr eshol dI nt er cept or " / >
</ pr oper t y>
<pr oper t y name=" pat t er n" >
<val ue>. +Ser vi ce\ . . +</ val ue>
</ pr oper t y>
</ bean>
<bean i d=" aut oPr oxyCr eat or "
cl ass=" or g. spr i ngf r amewor k. aop. f r amewor k. aut opr oxy. Def aul t Advi sor Aut oPr ox
yCr eat or " / >
3.6.3

42

Spring In Action
4
4.1 Spring DAO

DAOData Access Object
4.1.1 DataAccessException
4.1 SpringDAO

CleanupFailureDataAccessException
Connection
DataAccessResourceFailureException
DataIntegrityViolationException Insert Update

DataRetrievalFailureException

DeadlockLoserDataAccessException
IncorrectUpdateSemanticsDataAccessException Update


InvalidDataAccessApiUsageException J ava API

InvalidDataAccessResourceUsageException SQL

OptimisticLockingFailureException ORM
DAO
TypeMismatchDataAccessException J avaString

UncategorizedDataAccessException

43

Spring In Action
Spring DAO RuntimeException
SpringNestedRuntimeExceptionNestedRuntimeExceptiongetCause()

4.1.2 DataSource
4.1J DNI DataSource
<bean i d=" dat aSour ce"
cl ass=" or g. spr i ngf r amewor k. j ndi . J ndi Obj ect Fact or yBean" >
<pr oper t y name=" j ndi Name" >
<val ue>j ava: comp/ env/ j dbc/ myDat asour ce</ val ue>
</ pr oper t y>
</ bean>

4.2DataSource
<bean i d=" ds" cl ass=" or g. apache. commons. dbcp. Basi cDat aSour ce"
dest r oy- met hod=" cl ose" >
<pr oper t y name=" dr i ver Cl assName"
val ue=" ${j dbc. st at s. dr i ver Cl assName}" / >
<pr oper t y name=" ur l " val ue=" ${j dbc. st at s. ur l }" / >
<pr oper t y name=" user name" val ue=" ${j dbc. st at s. user name}" / >
<pr oper t y name=" passwor d" val ue=" ${j dbc. st at s. passwor d}" / >
</ bean>
4.1.3 DAO
Template Method Pattern

Spring
TemplateCallback

44

Spring In Action
4.2Spring
statement
Result Set
template-callback
4.3

4.2 Spring JDBC
4.2.1 JdbcTemplate
4.3J dbcTemplateDAO bean
<bean i d=" j dbcTempl at e"
cl ass=" or g. spr i ngf r amewor k. j dbc. cor e. J dbcTempl at e" >
<pr oper t y name=" dat aSour ce" >
<r ef bean=" dat aSour ce" / >
</ pr oper t y>
</ bean>
<bean i d=" st udent Dao" cl ass=" St udent DaoJ dbc" >
<pr oper t y name=" j dbcTempl at e" >
<r ef bean=" j dbcTempl at e" / >
</ pr oper t y>
</ bean>
<bean i d=" cour seDao" cl ass=" Cour seDaoJ dbc" >
<pr oper t y name=" j dbcTempl at e" >
<r ef bean=" j dbcTempl at e" / >
</ pr oper t y>
</ bean>
4.2.1.1

PreparedStatementCreatorPreparedStatement
SqlProviderJ dbcTemplayeSQL
PreparedStatementSetterPreparedStatement
45

Spring In Action
BatchPreparedStatementSetterPreparedStatement

4.4J dbcTemplate.execute
public int i nser t Per son( Per son per son) {
/ / SQL
St r i ng sql =" i nser t i nt o per son( i d, f i r st Name, l ast Name) val ues( ?, ?, ?) " ;
/ /
Obj ect [ ] par ams =new Obj ect [ ] { per son. get I d( ) , per son. get Fi r st Name( ) ,
per son. get Last Name( ) };
/ /
int[ ] t ypes =new int[ ] { Types. INTEGER, Types. VARCHAR, Types. VARCHAR };
/ / st at ement
return j dbcTempl at e. updat e( sql , par ams, t ypes) ;
}

4.5BatchPreparedStatementCreator
public int[ ] updat ePer sons( final Li st per sons) {
/ / SQL
St r i ng sql =" i nser t i nt o per son( i d, f i r st Name, l ast Name) val ues ( ?, ?, ?) " ;
Bat chPr epar edSt at ement Set t er set t er = null;
set t er = new Bat chPr epar edSt at ement Set t er ( ) {
/ /
public int get Bat chSi ze( ) {
return per sons. si ze( ) ;
}
/ /
public void set Val ues( Pr epar edSt at ement ps, int i ndex)
throws SQLExcept i on {
Per son per son = ( Per son) per sons. get ( i ndex) ;
ps. set I nt ( 0, per son. get I d( ) . i nt Val ue( ) ) ;
ps. set St r i ng( 1, per son. get Fi r st Name( ) ) ;
ps. set St r i ng( 2, per son. get Last Name( ) ) ;
}
};
/ / st at ement
return j dbcTempl at e. bat chUpdat e( sql , set t er ) ;
}
4.2.1.2

RowCallbackHandler
RowMapper
46

Spring In Action
RowMapperResultSetExtractor
4.6RowCallbackHandler
public Per son get Per son( final I nt eger i d) {
/ / SQL
St r i ng sql =" sel ect i d, f i r st _name, l ast _name f r omper son wher e i d =?" ;
/ /
final Per son per son = new Per son( ) ;
/ /
final Obj ect [ ] par ams = new Obj ect [ ] { i d };
j dbcTempl at e. quer y( sql , par ams, new RowCal l backHandl er ( ) {
/ /
public void pr ocessRow( Resul t Set r s) throws SQLExcept i on {
per son. set I d( new I nt eger ( r s. get I nt ( " i d" ) ) ) ;
per son. set Fi r st Name( r s. get St r i ng( " f i r st _name" ) ) ;
per son. set Last Name( r s. get St r i ng( " l ast _name" ) ) ;
}
}) ;
return per son; / /
}

4.7ResultSet
class Per sonRowMapper implements RowMapper {
public Obj ect mapRow( Resul t Set r s, int i ndex) throws SQLExcept i on {
Li st al l = new Ar r ayLi st ( ) ;
Per son per son = new Per son( ) ;
per son. set I d( new I nt eger ( r s. get I nt ( " i d" ) ) ) ;
per son. set Fi r st Name( r s. get St r i ng( " f i r st _name" ) ) ;
per son. set Last Name( r s. get St r i ng( " l ast _name" ) ) ;
al l . add( per son) ;
return al l ;
}
}

4.8RowMapper
public Li st get Al l Per sons( ) {
St r i ng sql = " sel ect i d, f i r st _name, l ast _name f r omper son" ;
return ( Li st ) j dbcTempl at e. quer y( sql , new RowMapper Resul t Set Ext r act or (
new Per sonRowMapper ( ) ) ) ;
}

4.9RowMapper
public Per son get Per son( final I nt eger i d) {
St r i ng sql =" sel ect i d, f i r st _name, l ast _name f r omper son wher e i d =?" ;
47

Spring In Action
final Obj ect [ ] par ams = new Obj ect [ ] { i d };
Li st l i st = ( Li st ) j dbcTempl at e. quer y( sql , par ams,
new RowMapper Resul t Set Ext r act or ( new Per sonRowMapper ( ) ) ) ;
return ( Per son) l i st . get ( 0) ;
}
4.2.1.3
4.10CallableStatementCallback
public void ar chi veSt udent Dat a( ) {
Cal l abl eSt at ement Cal l back cb = new Cal l abl eSt at ement Cal l back( ) {
public Obj ect doI nCal l abl eSt at ement ( Cal l abl eSt at ement cs)
throws SQLExcept i on {
cs. execut e( ) ;
return null;
}
};
j dbcTempl at e. execut e( " { ARCHI VE_STUDENTS }" , cb) ;
}
ARCHIVE_STUDENTS
4.2.2
4.2.2.1 SqlUpdate
4.11 I nser t Per son. j avaPerson
package chapt er 04;
import j ava. sql . Types;
import j avax. sql . Dat aSour ce;
import or g. spr i ngf r amewor k. j dbc. cor e. Sql Par amet er ;
import or g. spr i ngf r amewor k. j dbc. obj ect . Sql Updat e;
public class I nser t Per son extends Sql Updat e {
public I nser t Per son( Dat aSour ce ds) {
set Dat aSour ce( ds) ; / / Dat aSour ceJ dbcTempl at e
set Sql ( " i nser t i nt o per son( i d, f i r st Name, l ast Name) val ues ( ?, ?, ?) " ) ;
/ / decl ar ePar amet er ( ) SQL
decl ar ePar amet er ( new Sql Par amet er ( Types. NUMERIC) ) ;
decl ar ePar amet er ( new Sql Par amet er ( Types. VARCHAR) ) ;
decl ar ePar amet er ( new Sql Par amet er ( Types. VARCHAR) ) ;
/ /
compi l e( ) ;
48

Spring In Action
}
public int i nser t ( Per son per son) {
Obj ect [ ] par ams =new Obj ect [ ] { per son. get I d( ) , per son. get Fi r st Name( ) ,
per son. get Last Name( ) };
return updat e( par ams) ;
}
}

4.12InsertPerson
private I nser t Per son i nser t Per son;
public int i nser t Per son( Per son per son) {
return i nser t Per son. i nser t ( per son) ;
}
4.2.2.2 MappingSqlQuery
4.13 Per sonByI dQuer y. j ava
package chapt er 04;
import j ava. sql . Resul t Set ;
import j ava. sql . SQLExcept i on;
import j ava. sql . Types;
import j avax. sql . Dat aSour ce;
import or g. spr i ngf r amewor k. j dbc. cor e. Sql Par amet er ;
import or g. spr i ngf r amewor k. j dbc. obj ect . Mappi ngSql Quer y;
public class Per sonByI dQuer y extends Mappi ngSql Quer y {
public Per sonByI dQuer y( Dat aSour ce ds) {
super( ds, " sel ect i d, f i r st _name, l ast _name f r omper son wher e i d =?" ) ;
decl ar ePar amet er ( new Sql Par amet er ( " i d" , Types. INTEGER) ) ;
compi l e( ) ;
}
public Obj ect mapRow( Resul t Set r s, int r owNumber ) throws SQLExcept i on {
Per son per son = new Per son( ) ;
per son. set I d( ( I nt eger ) r s. get Obj ect ( " i d" ) ) ;
per son. set Fi r st Name( r s. get St r i ng( " f i r st _name" ) ) ;
per son. set Last Name( r s. get St r i ng( " l ast _name" ) ) ;
return per son;
}
}

4.14
private Per sonByI dQuer y per sonByI dQuer y;
public Per son get Per son( I nt eger i d) {
49

Spring In Action
Obj ect [ ] par ams = new Obj ect [ ] { i d };
return ( Per son) per sonByI dQuer y. execut e( par ams) . get ( 0) ;
}
4.2.3
DataFieldMaxValueIncrementer
4.15
private Dat aFi el dMaxVal ueI ncr ement er i ncr ement er ;
public void set I ncr ement er ( Dat aFi el dMaxVal ueI ncr ement er i ncr ement er ) {
this. i ncr ement er = i ncr ement er ;
}
public void i nser t Per son( Per son per son) {
I nt eger i d = new I nt eger ( i ncr ement er . next I nt Val ue( ) ) ;
J dbcTempl at e j dbcTempl at e = new J dbcTempl at e( dat aSour ce) ;
St r i ng sql =" i nser t i nt o per son( i d, f i r st Name, l ast Name) val ues ( ?, ?, ?) " ;
Obj ect [ ] par ams = new Obj ect [ ] { i d, per son. get Fi r st Name( ) ,
per son. get Last Name( ) };
j dbcTempl at e. updat e( sql , par ams) ;
/ / ever yt hi ng was successf ul
per son. set I d( i d) ;
}
4.3 Spring ORM
ORM
Lazy loading
Eager fetching
Caching
Cascading
Spring





50

Spring In Action
4.3.1 Hibernate
4.3.1.1 Hibernate
4.16
package chapt er 04;
import j ava. ut i l . Set ;
public class St udent {
private I nt eger i d;
private St r i ng f i r st Name;
private St r i ng l ast Name;
private Set cour ses;
public I nt eger get I d( ) {
return i d;
}
public void set I d( I nt eger i d) {
this. i d = i d;
}
public St r i ng get Fi r st Name( ) {
return f i r st Name;
}
public void set Fi r st Name( St r i ng f i r st Name) {
this. f i r st Name = f i r st Name;
}
public St r i ng get Last Name( ) {
return l ast Name;
}
public void set Last Name( St r i ng l ast Name) {
this. l ast Name = l ast Name;
}
public Set get Cour ses( ) {
return cour ses;
}
public void set Cour ses( Set cour ses) {
this. cour ses = cour ses;
}
}

4.17HibernateStudent.hbm.xml
<?xml ver si on=" 1. 0" ?>
<! DOCTYPE hi ber nat e- mappi ng PUBLI C " - / / Hi ber nat e/ Hi ber nat e Mappi ng DTD/ / EN"
" ht t p: / / hi ber nat e. sour cef or ge. net / hi ber nat e- mappi ng- 2. 0. dt d" >
51

Spring In Action
<hi ber nat e- mappi ng>
<! - - - - >
<cl ass name=" or g. spr i ngi nact i on. t r ai ni ng. model . St udent " >
<! - - - - >
<i d name=" i d" >
<gener at or cl ass=" assi gned" / >
</ i d>
<! - - - - >
<pr oper t y name=" sex" / >
<pr oper t y name=" wei ght " / >
<! - - - - >
<set name=" cour ses" t abl e=" t r anscr i pt " >
<key col umn=" st udent _i d" / >
<many- t o- many col umn=" cour se_i d"
cl ass=" or g. spr i ngi nact i on. t r ai ni ng. model . Cour se" / >
</ set >
</ cl ass>
</ hi ber nat e- mappi ng>

4.18Student
private Sessi onFact or y sessi onFact or y;
public St udent get St udent ( I nt eger i d) throws Hi ber nat eExcept i on {
Sessi on sessi on = sessi onFact or y. openSessi on( ) ;
St udent st udent = ( St udent ) sessi on. l oad( St udent . class, i d) ;
sessi on. cl ose( ) ;
return st udent ;
}
4.3.1.2 Hibernate
LocalSessionFactoryBean
4.19SessionFactory
<bean i d=" sessi onFact or y"
cl ass=" or g. spr i ngf r amewor k. or m. hi ber nat e. Local Sessi onFact or yBean" >
<pr oper t y name=" dat aSour ce" >
<r ef bean=" dat aSour ce" / >
</ pr oper t y>
</ bean>

4.20SessionFactory
<! - - Hi ber nat e Sessi onFact or y - - >
<bean i d=" sessi onFact or y"
52

Spring In Action
cl ass=" or g. spr i ngf r amewor k. or m. hi ber nat e3. Local Sessi onFact or yBean" >
<pr oper t y name=" dat aSour ce" r ef =" dat aSour ce" / >
<pr oper t y name=" l obHandl er " r ef =" or acl eLobHandl er " / >
<pr oper t y name=" mappi ngResour ces" >
<l i st >
<val ue>st at 2/ user / domai n/ User . hbm. xml </ val ue>
<val ue>st at 2/ common/ message/ domai n/ Message. hbm. xml </ val ue>
</ l i st >
</ pr oper t y>
<pr oper t y name=" hi ber nat ePr oper t i es" >
<pr ops>
<pr op key=" hi ber nat e. di al ect " >${hi ber nat e. di al ect }</ pr op>
<pr op key=" hi ber nat e. show_sql " >f al se</ pr op>
<pr op key=" hi ber nat e. j dbc. bat ch_si ze" >20</ pr op>
<pr op key=" hi ber nat e. j dbc. f et ch_si ze" >20</ pr op>
<pr op key=" hi ber nat e. gener at e_st at i st i cs" >t r ue</ pr op>
</ pr ops>
</ pr oper t y>
<pr oper t y name=" event Li st ener s" >
<map>
<ent r y key=" mer ge" >
<bean
cl ass=" or g. spr i ngf r amewor k. or m. hi ber nat e3. suppor t . I dTr ansf er r i ngMer geEvent Li
st ener " / >
</ ent r y>
</ map>
</ pr oper t y>
</ bean>
4.3.1.3 HibernateTemplate
HibernateHibernateTemplateHibernateCallback
4.21HibernateTemplate
<bean i d=" hi ber nat eTempl at e"
cl ass=" or g. spr i ngf r amewor k. or m. hi ber nat e. Hi ber nat eTempl at e" >
<pr oper t y name=" sessi onFact or y" >
<r ef bean=" sessi onFact or y" / >
</ pr oper t y>
</ bean>

4.22HibernateTemplateHibernateCallback
public St udent get St udent ( final I nt eger i d) {
return ( St udent ) hi ber nat eTempl at e. execut e( new Hi ber nat eCal l back( ) {
53

Spring In Action
public Obj ect doI nHi ber nat e( Sessi on sessi on)
throws Hi ber nat eExcept i on {
return sessi on. l oad( St udent . class, i d) ;
}
}) ;
}

4.23HibernateTemplate
public St udent get St udent ( I nt eger i d) {
return ( St udent ) hi ber nat eTempl at e. l oad( St udent . class, i d) ;
}
4.3.1.4 HibernateDaoSupport
5
5.1
5.1.1
ACID
Atomic
Consistent
Isolated
Durable
5.1.2 Spring

org.springframework.jdbc.datasource.DataSourceTran
sactionManager
J DBC DataSource
org.springframework.orm.hibernate.HibernateTransac
tionManager
Hibernate

org.springframework.orm.jdo.JdoTransactionManager J DO
org.springframework.transaction.jta.J taTransactionMa
nager
J TA

org.springframework.orm.ojb.PersistenceBrokerTrans
actionManager
ApacheOJ B

5.2
54

Spring In Action

5.1J DBC
<bean i d=" t r ansact i onManager "
cl ass=" or g. spr i ngf r amewor k. j dbc. dat asour ce. Dat aSour ceTr ansact i onManager " >
<pr oper t y name=" dat aSour ce" >
<r ef bean=" dat aSour ce" / >
</ pr oper t y>
</ bean>

5.2Hibernate
<bean i d=" t r ansact i onManager "
cl ass=" or g. spr i ngf r amewor k. or m. hi ber nat e. Hi ber nat eTr ansact i onManager " >
<pr oper t y name=" sessi onFact or y" >
<r ef bean=" sessi onFact or y" / >
</ pr oper t y>
</ bean>

5.3J DO
<bean i d=" t r ansact i onManager "
cl ass=" or g. spr i ngf r amewor k. or m. j do. J doTr ansact i onManager " >
<pr oper t y name=" per si st enceManager Fact or y" >
<r ef bean=" per si st enceManager Fact or y" / >
</ pr oper t y>
</ bean>
55

Spring In Action
5.4OJ B
<bean i d=" t r ansact i onManager "
cl ass=" or g. spr i ngf r amewor k. or m. oj b. Per si st enceBr oker Tr ansact i onManager " >
</ bean>

5.5J TA
<bean i d=" t r ansact i onManager "
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. j t a. J t aTr ansact i onManager " >
<pr oper t y name=" t r ansact i onManager Name" >
<val ue>j ava: / Tr ansact i onManager </ val ue>
</ pr oper t y>
</ bean>
5.2
5.6enrollStudentInCourse()
public void enr ol l St udent I nCour se( ) {
t r ansact i onTempl at e. execut e( new Tr ansact i onCal l back( ) {
public Obj ect doI nTr ansact i on( Tr ansact i onSt at us t s) {
try {
/ / do st uf f doI nTr ansact i on( )
} catch ( Except i on e) {
t s. set Rol l backOnl y( ) ; / / set Rol l backOnl y( )
}
return null; / /
}
}) ;
}

5.6transactionTemplate
<bean i d=" t r ansact i onTempl at e"
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. suppor t . Tr ansact i onTempl at e" >
<pr oper t y name=" t r ansact i onManager " >
<r ef bean=" t r ansact i onManager " / >
</ pr oper t y>
</ bean>
<bean i d=" cour seSer vi ce"
cl ass=" com. spr i ngi nact i on. t r ai ni ng. ser vi ce. Cour seSer vi ceI mpl " >
<pr oper t y name=" t r ansact i onTempl at e" >
<r ef bean=" t r ansact i onTempl at e" / >
</ pr oper t y>
</ bean>
56

Spring In Action
5.3
5.7
<bean i d=" cour seSer vi ceTar get "
cl ass=" com. spr i ngi nact i on. t r ai ni ng. ser vi ce. Cour seSer vi ceI mpl " >
<pr oper t y name=" t r ansact i onTempl at e" >
<r ef bean=" t r ansact i onTempl at e" / >
</ pr oper t y>
</ bean>
<bean i d=" cour seSer vi ce"
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. i nt er cept or . Tr ansact i onPr oxyFact or
yBean" >
<pr oper t y name=" pr oxyI nt er f aces" >
<l i st >
<val ue>
<! - - - - >
com. spr i ngi nact i on. t r ai ni ng. ser vi ce. Cour seSer vi ce
</ val ue>
</ l i st >
</ pr oper t y>
<pr oper t y name=" t ar get " >
<! - - - - >
<r ef bean=" cour seSer vi ceTar get " / >
</ pr oper t y>
<pr oper t y name=" t r ansact i onManager " >
<! - - - - >
<r ef bean=" t r ansact i onManager " / >
</ pr oper t y>
<pr oper t y name=" t r ansact i onAt t r i but eSour ce" >
<! - - - - >
<r ef bean=" at t r i but eSour ce" / >
</ pr oper t y>
</ bean>
5.3.1





57

Spring In Action
5.3.1.1
5.2 Spring

PROPAGATION_MANDATORY
PROPAGATION_NESTED

PROPAGATION_REQUIRED

PROPAGATION_NEVER
PROPAGATION_NOT_SUPPORTED
J TATransactionManager
TransactionManager
PROPAGATION_REQUIRED

PROPAGATION_REQUIRES_NEW
J TATransactionManager
TransactionManager
PROPAGATION_SUPPORTS

5.3.1.2

Dirty read
Nonrepeatable read

Phantom readT1T2

5.3 Spring

ISOLATION_DEFAULT
ISOLATION_READ_UNCOMMITTED

ISOLATION_READ_COMMITTED

ISOLATION_REPEATABLE_READ


ISOLATION_SERIALIZABLE ACID


58

Spring In Action

PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEWPROPAGATION_NESTED

HibernateHibernateflushFLUSH_NEVER
5.3.2

TransactionProxyFactoryBean

TransactionAttributeSource
PROPAGATION_REQUIRED
ISOLATION_DEFAULT
5.8
<! - - - - >
<bean i d=" myTr ansact i onAt t r i but e"
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. i nt er cept or . Def aul t Tr ansact i onAt t r
i but e" >
<pr oper t y name=" pr opagat i onBehavi or Name" >
<! - - - - >
<val ue>PROPAGATI ON_REQUI RES_NEW</ val ue>
</ pr oper t y>
<pr oper t y name=" i sol at i onLevel Name" >
<! - - - - >
<val ue>I SOLATI ON_REPEATABLE_READ</ val ue>
</ pr oper t y>
</ bean>
<bean i d=" t r ansact i onAt t r i but eSour ce"
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. i nt er cept or . Mat chAl waysTr ansact i on
At t r i but eSour ce" >
<pr oper t y name=" t r ansact i onAt t r i but e" >
<! - - - - >
<r ef bean=" myTr ansact i onAt t r i but e" / >
</ pr oper t y>
</ bean>
59

Spring In Action
5.4

NameMatchTransactionAttributeSource
5.9NameMatchTransactionAttributeSource
<bean i d=" t r ansact i onAt t r i but eSour ce"
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. i nt er cept or . NameMat chTr ansact i onAt
t r i but eSour ce" >
<pr oper t y name=" pr oper t i es" >
<pr ops>
<pr op key=" enr ol l St udent I nCour se" >
PROPAGATI ON_REQUI RES_NEW, I SOLATI ON_REPEATABLE_READ,
- Cour seExcept i on
</ pr op>
</ pr ops>
</ pr oper t y>
</ bean>

5.10
<bean i d=" t r ansact i onAt t r i but eSour ce"
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. i nt er cept or . NameMat chTr ansact i onAt
t r i but eSour ce" >
<pr oper t y name=" pr oper t i es" >
<pr ops>
<pr op key=" get *" >PROPAGATI ON_SUPPORTS</ pr op>
</ pr ops>
</ pr oper t y>
</ bean>

5.11
<bean i d=" cour seSer vi ce"
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. i nt er cept or . Tr ansact i onPr oxyFact or
yBean" >
60

Spring In Action
<pr oper t y name=" t r ansact i onPr oper t i es" >
<pr ops>
<pr op key=" enr ol l St udent I nCour se" >
PROPAGATI ON_REQUI RES_NEW
</ pr op>
</ pr ops>
</ pr oper t y>
</ bean>
5.5
5.6
5.12
<bean i d=" cour seSer vi ce"
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. i nt er cept or . Tr ansact i onPr oxyFact or
yBean" >
<pr oper t y name=" t ar get " >
<r ef bean=" cour seSer vi ceTar get " / >
</ pr oper t y>
<pr oper t y name=" t r ansact i onManager " >
<r ef bean=" t r ansact i onManager " / >
</ pr oper t y>
<pr oper t y name=" t r ansact i onAt t r i but eSour ce" >
<r ef bean=" at t r i but eSour ce" / >
</ pr oper t y>
</ bean>
<bean i d=" cour seSer vi ceTar get "
cl ass=" com. spr i ngi nact i on. t r ai ni ng. ser vi ce. Cour seSer vi ceI mpl " >
</ bean>

Bean
AOP
5.6.1 TransactionProxyFactoryBean
5.13XML TransactionProxyFactoryBeanabstract
<bean i d=" abst r act TxDef i ni t i on"
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. i nt er cept or . Tr ansact i onPr oxyFact or
yBean"
l azy- i ni t =" t r ue" >
61

Spring In Action
<pr oper t y name=" t r ansact i onManager " >
<r ef bean=" t r ansact i onManager " / >
</ pr oper t y>
<pr oper t y name=" t r ansact i onAt t r i but eSour ce" >
<r ef bean=" at t r i but eSour ce" / >
</ pr oper t y>
</ bean>
lazy-init true bean bean

5.14bean
<bean i d=" st udent Ser vi ce" par ent =" abst r act TxDef i ni t i on" >
<pr oper t y name=" t ar get " >
<bean
cl ass=" com. spr i ngi nact i on. t r ai ni ng. ser vi ce. St udent Ser vi ceI mpl " / >
</ pr oper t y>
</ bean>
5.6.2
5.15DefaultAdvisorAutoProxyCreator
<bean i d=" aut opr oxy"
cl ass=" or g. spr i ngf r amewor k. aop. f r amewor k. aut opr oxy. Def aul t Advi sor Aut oPr ox
yCr eat or " >
</ bean>

5.16TransactionAttributeSourceAdvisor

<bean i d=" t r ansact i onAdvi sor "
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. i nt er cept or . Tr ansact i onAt t r i but eSo
ur ceAdvi sor " >
<const r uct or - ar g>
<r ef bean=" t r ansact i onI nt er cept or " / >
</ const r uct or - ar g>
</ bean>

5.17
<bean i d=" t r ansact i onI nt er cept or "
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. i nt er cept or . Tr ansact i onI nt er cept or
" >
<pr oper t y name=" t r ansact i onManager " >
<r ef bean=" t r ansact i onManager " / >
</ pr oper t y>
62

Spring In Action
<pr oper t y name=" t r ansact i onAt t r i but eSour ce" >
<r ef bean=" t r ansact i onAt t r i but eSour ce" / >
</ pr oper t y>
</ bean>

5.18
<bean i d=" t r ansact i onAt t r i but eSour ce"
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. i nt er cept or . NameMat chTr ansact i onAt
t r i but eSour ce" >
<pr oper t y name=" pr oper t i es" >
<pr ops>
<pr op key=" get *v" >PROPAGATI ON_SUPPORTS</ pr op>
</ pr ops>
</ pr oper t y>
</ bean>
5.18get
Bean5.19
5.19
<bean i d=" t r ansact i onAt t r i but eSour ce"
cl ass=" or g. spr i ngf r amewor k. t r ansact i on. i nt er cept or . Met hodMapTr ansact i onAt
t r i but eSour ce" >
<pr oper t y name=" met hodMap" >
<map>
<ent r y
key=" com. spr i ngi nact i on. t r ai ni ng. ser vi ce. Cour seSer vi ceI mpl . get *" >
<val ue>PROPAGATI ON_SUPPORTS</ val ue>
</ ent r y>
</ map>
</ pr oper t y>
</ bean>




63

You might also like