首先åQŒå¦‚æžœä½ åœ?/span>web.xmlæ–‡äšgä¸çš„é…置是这æ ïLš„åQ?/span>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/applicationContext-*.xml
</param-value>
</context-param>
那么需è¦åœ¨å·¥ç¨‹ä¸‹åˆ›å»ÞZ¸€ä¸ªä»¥applicationContext- 为开头的xmlæ–‡äšgeg:applicationContext-jobconfig.xml
xml的头和结ž®ùNƒ¨åˆ†è·Ÿå…¶ä»–springé…置文äšgç›æ€¼¼åQŒå°±ä¸èµ˜˜qŽÍ¼Œæ£æ–‡å¦‚下åQ?/span>
<bean id="youJobName(¾cÕdˆ«å?/span>)" class="com.******.YourJobClassLocation(¾cÈš„定ä½)" />
<bean id="doYourJob(别å)" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="youJobName(¾cÕdˆ«å?/span>)""/>
</property>
<property name="targetMethod">
<value>runMethodName(定时执行的方法å)</value>
</property>
</bean>
<bean id="youJobNameTrigger(触å‘器别å?/span>)" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="doYourJob(别å)""/>
</property>
<property name="cronExpression">
<value>0 0/20 * * * ?(定时的时间酾|?/span>)</value>
</property>
</bean>
<bean id="doScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="youJobNameTrigger(触å‘器别å?/span>)"/>
</list>
</property>
</bean>
˜q™æ ·çš„é…¾|®å‡ 本就å¯ä»¥˜qè{了,但是有一个地方å¯èƒ½æ˜¯ä½ éœ€è¦æ ¹æ®ä½ 的需求楼‹®å®šçš„ï¼Œé‚£å°±æ˜¯è§¦å‘æ—¶é—´ã€?/span>
䏋颿œ‰ä¸€äº›å…³äºŽæ—¶é—´é…¾|®çš„说明åQ?/span>
å—æ®µ™åºåº |
|
å…许å€?/span> |
|
å…许的特ŒDŠå—½W?/span> |
¿U?/span> |
0-59 |
, - * / |
||
�/span> |
0-59 |
, - * / |
||
ž®æ—¶ |
0-23 |
, - * / |
||
日期 |
1-31 |
, - * ? / L W C |
||
月䆾 |
1-12 或�JAN-DEC |
, - * / |
||
星期 |
1-7 或�SUN-SAT |
, - * ? / L C # |
||
òqß_¼ˆå¯é€‰ï¼‰ |
留空, 1970-2099 |
, - * / |
The '*' character is used to specify all values. For example, "*" in the minute field means "every minute".
“*”å—ç¬¦è¢«ç”¨æ¥æŒ‡å®šæ‰€æœ‰çš„倹{€‚如åQ?/span>”*“åœ¨åˆ†é’Ÿçš„å—æ®µåŸŸé‡Œè¡¨ç¤º“æ¯åˆ†é’?/span>”ã€?/span>
The '?' character is allowed for the day-of-month and day-of-week fields. It is used to specify 'no specific value'. This is useful when you need to specify something in one of the two fileds, but not the other. See the examples below for clarification.
“?”å—符åªåœ¨æ—¥æœŸåŸŸå’Œæ˜ŸæœŸåŸŸä¸ä½¿ç”¨ã€‚å®ƒè¢«ç”¨æ¥æŒ‡å®?/span>“éžæ˜Ž¼‹®çš„å€?/span>”ã€‚å½“ä½ éœ€è¦é€šè¿‡åœ¨è¿™ä¸¤ä¸ªåŸŸä¸çš„ä¸€ä¸ªæ¥æŒ‡å®šä¸€äº›ä¸œè¥¿çš„æ—¶å€™ï¼Œå®ƒæ˜¯æœ‰ç”¨çš„。看下é¢çš„例åä½ ž®×ƒ¼šæ˜Žç™½ã€?/span>
月䆾ä¸çš„æ—¥æœŸå’Œæ˜ŸæœŸä¸çš„æ—¥æœŸè¿™ä¸¤ä¸ªå…ƒç´ 时互斥的一起应该通过讄¡½®ä¸€ä¸ªé—®å?/span>(?)æ¥è¡¨æ˜Žä¸æƒŒ™®¾¾|®é‚£ä¸ªå—ŒD?/span>
The '-' character is used to specify ranges For example "10-12" in the hour field means "the hours 10, 11 and 12".
“-”å—ç¬¦è¢«ç”¨æ¥æŒ‡å®šä¸€ä¸ªèŒƒå›´ã€‚如åQ?/span>“10-12”åœ¨å°æ—¶åŸŸæ„味瀓10ç‚V€?/span>11ç‚V€?/span>12ç‚?/span>”ã€?/span>
The ',' character is used to specify additional values. For example "MON,WED,FRI" in the day-of-week field means "the days Monday, Wednesday, and Friday".
“,”å—ç¬¦è¢«ç”¨æ¥æŒ‡å®šå¦å¤–的倹{€‚如åQ?/span>“MON,WED,FRI”在星期域里表½C?/span>”æ˜ŸæœŸä¸€ã€æ˜ŸæœŸä¸‰ã€æ˜ŸæœŸäº””.
The '/' character is used to specify increments. For example "0/15" in the seconds field means "the seconds 0, 15, 30, and 45". And "5/15" in the seconds field means "the seconds 5, 20, 35, and 50". Specifying '*' before the '/' is equivalent to specifying 0 is the value to start with. Essentially, for each field in the expression, there is a set of numbers that can be turned on or off. For seconds and minutes, the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to 31, and for months 1 to 12. The "/" character simply helps you turn on every "nth" value in the given set. Thus "7/6" in the month field only turns on month "7", it does NOT mean every 6th month, please note that subtlety.
"/"å—ç¬¦ç”¨æ¥æŒ‡å®šæ¸å¢žçš„倹{€‚例å¦?/span>0/15å‡ºçŽ°åœ¨ç§’å—æ®µçš„æ—¶å€™æ„味瀓在第0åQ?/span>15åQ?/span>30å’?/span>45¿U?/span>”åQˆçš„æ—¶å€™è¢«è§¦å‘åQ‰ã€‚è€?/span>5/15å‡ºçŽ°åœ¨ç§’å—æ®µçš„æ—¶å€™æ„味瀓在第5åQ?/span>20åQ?/span>35和第50¿U?/span>”åQˆçš„æ—¶å€™è¢«è§¦å‘åQ‰ã€?/span>"*/"å’?/span>"0/"的指定是½{‰ähçš„ã€?/span>
注:当分å?/span>+分æ¯çš„å€¼å¤§äºŽè¯¥å—æ®µçš„æœ€å¤§å€û|¼Œå¦‚在¿U’é’Ÿå—æ®µå‡ºçް45/20的时候,表示在第45¿U’以åŽçš„æ¯?/span>20会触å‘一‹Æ¡ï¼Œä½†æ˜¯20¿U’以åŽåˆ½Ž—åšå¦å¤–çš„æ—¶é—´æ®µä»¥å†…äº†ï¼Œæ‰€ä»¥è¯¥å—æ®µçš?/span>/20å›_¤±æ•ˆï¼Œå¦‚改ä¸?/span>45/10 åˆ™åªæœ?/span>½W?/span>45 å’?/span>55¿U’会执行一‹Æ¡ã€?/span>
The 'L' character is allowed for the day-of-month and day-of-week fields. This character is short-hand for "last", but it has different meaning in each of the two fields. For example, the value "L" in the day-of-month field means "the last day of the month" - day 31 for January, day 28 for February on non-leap years. If used in the day-of-week field by itself, it simply means "7" or "SAT". But if used in the day-of-week field after another value, it means "the last xxx day of the month" - for example "6L" means "the last friday of the month". When using the 'L' option, it is important not to specify lists, or ranges of values, as you'll get confusing results.
Læ˜?/span>‘last’çš„çœç•¥å†™æ³•å¯ä»¥è¡¨½C?/span>day-of-monthå’?/span>day-of-weekåŸŸï¼Œä½†åœ¨ä¸¤ä¸ªå—æ®µä¸çš„æ„æ€ä¸åŒï¼Œä¾‹å¦‚day-of-month域ä¸è¡¨ç¤ºä¸€ä¸ªæœˆçš„æœ€åŽä¸€å¤©ï¼Œ
如果åœ?/span>day-of-week域表½C?/span>‘7’或è€?/span>‘SAT’åQŒå¦‚果在day-of-week域ä¸å‰é¢åŠ ä¸Šæ•°å—åQŒå®ƒè¡¨ç¤ºä¸€ä¸ªæœˆçš„æœ€åŽå‡ 天,例如‘6L’ž®Þp¡¨½CÞZ¸€ä¸ªæœˆçš„æœ€åŽä¸€ä¸?/span>
星期五,
The 'W' character is allowed for the day-of-month field. This character is used to specify the weekday (Monday-Friday) nearest the given day. As an example, if you were to specify "15W" as the value for the day-of-month field, the meaning is: "the nearest weekday to the 15th of the month". So if the 15th is a Saturday, the trigger will fire on Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. However if you specify "1W" as the value for day-of-month, and the 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not 'jump' over the boundary of a month's days. The 'W' character can only be specified when the day-of-month is a single day, not a range or list of days
.
The 'L' and 'W' characters can also be combined for the day-of-month expression to yield 'LW', which translates to "last weekday of the month".
The '#' character is allowed for the day-of-week field. This character is used to specify "the nth" XXX day of the month. For example, the value of "6#3" in the day-of-week field means the third Friday of the month (day 6 = Friday and "#3" = the 3rd one in the month). Other examples: "2#1" = the first Monday of the month and "4#5" = the fifth Wednesday of the month. Note that if you specify "#5" and there is not 5 of the given day-of-week in the month, then no firing will occur that month.
The 'C' character is allowed for the day-of-month and day-of-week fields. This character is short-hand for "calendar". This means values are calculated against the associated calendar, if any. If no calendar is associated, then it is equivalent to having an all-inclusive calendar. A value of "5C" in the day-of-month field means "the first day included by the calendar on or after the 5th". A value of "1C" in the day-of-week field means "the first day included by the calendar on or after sunday".
关于cronExpression的介¾l?/span>:
 
å—æ®µå…许å€?/span>å…许的特ŒDŠå—½W?/span>
¿U?/span> 0-59 , - * /
�/span> 0-59 , - * /
ž®æ—¶ 0-23 , - * /
日期 1-31 , - * ? / L W C
月䆾 1-12 或�/span> JAN-DEC , - * /
星期 1-7 或�/span> SUN-SAT , - * ? / L C #
òqß_¼ˆå¯é€‰ï¼‰ç•™ç©º, 1970-2099 , - * /
è¡¨è¾¾å¼æ„ä¹?/span>
"0 0 12 * * ?" æ¯å¤©ä¸åˆ12点触å?/span>
"0 15 10 ? * *" æ¯å¤©ä¸Šåˆ10:15触å‘
"0 15 10 * * ?" æ¯å¤©ä¸Šåˆ10:15触å‘
"0 15 10 * * ? *" æ¯å¤©ä¸Šåˆ10:15触å‘
"0 15 10 * * ? 2005" 2005òq´çš„æ¯å¤©ä¸Šåˆ10:15触å‘
"0 * 14 * * ?" 在æ¯å¤©ä¸‹å?/span>2点到下åˆ2:59期间的æ¯1分钟触å‘
"0 0/5 14 * * ?" 在æ¯å¤©ä¸‹å?/span>2点到下åˆ2:55期间的æ¯5分钟触å‘
"0 0/5 14,18 * * ?" 在æ¯å¤©ä¸‹å?/span>2点到2:55期间和下å?/span>6点到6:55期间的æ¯5分钟触å‘
"0 0-5 14 * * ?" 在æ¯å¤©ä¸‹å?/span>2点到下åˆ2:05期间的æ¯1分钟触å‘
"0 10,44 14 ? 3 WED" æ¯å¹´ä¸‰æœˆçš„æ˜ŸæœŸä¸‰çš„下å?/span>2:10å’?/span>2:44触å‘
"0 15 10 ? * MON-FRI" 周一臛_‘¨äº”的上åˆ10:15触å‘
"0 15 10 15 * ?" æ¯æœˆ15日上å?/span>10:15触å‘
"0 15 10 L * ?" æ¯æœˆæœ€åŽä¸€æ—¥çš„上åˆ10:15触å‘
"0 15 10 ? * 6L" æ¯æœˆçš„æœ€åŽä¸€ä¸ªæ˜ŸæœŸäº”上åˆ10:15触å‘
"0 15 10 ? * 6L 2002-2005" 2002òq´è‡³2005òq´çš„æ¯æœˆçš„æœ€åŽä¸€ä¸ªæ˜ŸæœŸäº”上åˆ10:15触å‘
"0 15 10 ? * 6#3" æ¯æœˆçš„第三个星期五上å?/span>10:15触å‘
æ¯å¤©æ—©ä¸Š6ç‚?/span>
0 6 * * *
æ¯ä¸¤ä¸ªå°æ—?/span>
0 */2 * * *
晚上11点到早上7点之间æ¯ä¸¤ä¸ªž®æ—¶åQŒæ—©ä¸Šå…«ç‚?/span>
0 23-7/2åQ?/span>8 * * *
æ¯ä¸ªæœˆçš„4å·å’Œæ¯ä¸ª½C¼æ‹œçš„礼拜一到礼拜三的早ä¸?/span>11ç‚?/span>
0 11 4 * 1-3
1�/span>1日早�/span>4�/span>
0 4 1 1 *
quartz的高¾U§ç‰¹æ€§ä¸ä»…如æ?/span>
1 æ•°æ®åº“å˜å‚?/span>
2 集群支æŒ
3 æ•°æ®åº“æŒä¹…化ä»ÕdŠ¡åQ?/span>trigger
4 trigger çš„åœæ¢ï¼Œ˜q行
5 ä»ÕdŠ¡çš„ä“Qæ„æ·»åŠ?/span>
6 æ¯?/span>corntrigger 更详ž®½çš„ä»ÕdŠ¡å®‰æŽ’
7 ¾U¿ç¨‹çš„内部数æ®äº¤æ?/span>
Springçš„äº‹åŠ¡ç®¡ç†æ˜¯¾l常用到的,论å›é‡Œå·²¾lä¸çŸ¥è®¨è®ÞZº†å¤šå°‘å˜äº†ã€?
è®°å½•ä¸‹å‡ ä¸ªè®²çš„æ¯”è¾ƒæ¸…æ¥šçš„ã€?/p>
spring事务探烦
http://www.javaeye.com/topic/11190
解惑 spring 嵌套事务
http://www.javaeye.com/topic/35907?page=1
Spring声明å¼äº‹åŠ¡ç®¡ç†æºç è§£è¯?
http://www.javaeye.com/topic/87426?page=1
详解spring事务属�
http://www.javaeye.com/post/282638
附:事务的概�/p>
一.åŽŸåæ€§ï¼ˆAtomicåQ?/span>
事务ç”׃¸€ä¸ªæˆ–å¤šä¸ªè¡ŒäØ“¾l„æˆåQŒåÅžæˆä¸€ä¸ªå·¥ä½œå•å…ƒã€‚åŽŸåæ€§ç¡®ä¿åœ¨˜q™ä¸ªå·¥ä½œå•å…ƒä¸çš„æ‰€æœ‰æ“作è¦ä¹ˆéƒ½å‘生åQŒè¦ä¹ˆéƒ½ä¸å‘生。ä“Q何一个行为失败,整个事务ž®±å›žæ»šã€?/p>
äº?一致性(ConsistentåQ?/span>
一旦一个事务结æŸäº†åQŒä¸½Ž¡æˆåŠŸä¸Žå¦ï¼Œ¾pÈ»Ÿæ‰€å¤„状æ€å’Œå®ƒçš„ä¹ŸäØ“è§„åˆ™æ˜¯ä¸€è‡´çš„åQŒå°±æ•°æ®åº”当ä¸ä¼šè¢«ç ´åã€?/p>
ä¸?隔离性(IsolatedåQ?/span>
事务应该å…许多个用户æ“作åŒä¸€ä¸ªæ•°æ®ï¼Œä½†ç”¨æˆ·ä¹‹é—´ä¸ä¼šäº’相媄å“ã€‚å› æ¤ï¼Œäº‹åŠ¡å¿…é¡»æ˜¯éš”¼›Èš„åQŒé˜²æ¢åƈå‘读写åŒä¸€ä¸ªæ•°æ®çš„æƒ…况å‘生ã€?/p>
å›?æŒä¹…性(DurableåQ?/span>
一旦事务æˆåŠŸå®Œæˆï¼Œäº‹åŠ¡çš„ç»“æžœå°±åº”è¯¥è¢«æŒä¹…化下æ¥ã€?
åœ?/span>DynamicProxyDemo™å¹ç›®çš„例åä¸åQŒè®°å½•的动作原先被横切(Cross-cuttingåQ‰å…¥è‡?/span>HelloSpeaker本èín所负责的业务浽E‹ä¹‹ä¸ï¼Œå¦å¤–¾cÖM¼¼äºŽè®°å½•è¿™¾cÈš„动作åQŒå¦‚安全åQ?/span>SecurityåQ‰æ£€æŸ¥ã€äº‹åŠ¡ï¼ˆTransactionåQ‰ç‰¾pÈ»Ÿå±‚é¢çš„æœåŠ¡ï¼ˆServiceåQ‰ï¼Œåœ¨ä¸€äº›åº”用程åºä¹‹ä¸å¸¸è¢«è§åˆ°å®‰æ’至å„ä¸ªå¯¹è±¡çš„å¤„ç†æµ½E‹ä¹‹ä¸ï¼Œ˜q™äº›åŠ¨ä½œåœ?/span>AOP的术è¯ä¸è¢«ç§°ä¹‹äØ“Cross-cutting concernsã€?/span>
以图片说明å¯å¼ø™°ƒå‡?/span>Cross-cutting concernsçš„æ„æ¶µï¼Œä¾‹å¦‚原æ¥çš„业务浽E‹æ˜¯å¾ˆå•¾U¯çš„åQ?/span>
现在ä¸ÞZº†è¦åŠ å…¥è®°å½•ï¼ˆLoggingåQ‰ä¸Žå®‰å…¨åQ?/span>SecurityåQ‰æ£€æŸ¥ç‰æœåŠ¡åQŒå¯¹è±¡çš„½E‹åºä»£ç ä¸è‹¥è¢«ç¡¬ç”Ÿç”Ÿçš„写入相关的Loggingã€?/span>Security½E‹åºç‰‡æ®µåQŒåˆ™å¯ä‹É用以下图解表½Cºå‡ºCross-cuttingä¸?/span>Cross-cutting concerns的概念:
Cross-cutting concerns若直接撰写在负责æŸä¸šåŠ¡çš„å¯¹è±¡ä¹‹æµ½E‹ä¸åQŒä¼šä½¿å¾—¾l´æŠ¤½E‹åºçš„æˆæœ¬å¢žé«˜ï¼Œä¾‹å¦‚è‹¥æ‚¨ä»Šå¤©è¦å°†å¯¹è±¡ä¸çš„记录功能修改或是¿U»é™¤è¯¥æœåŠ¡ï¼Œåˆ™å¿…™åÖM¿®æ”ÒŽ‰€æœ‰æ’°å†™æ›¾è®°å½•æœåŠ¡çš„ç¨‹åºä»£ç ,然åŽé‡æ–°¾~–译åQŒå¦ä¸€æ–šw¢åQ?/span>Cross-cutting concernsæ·äh‚于业务逻辑之ä¸åQŒä‹É得业务对象本íw«çš„逻辑或程åºçš„æ’°å†™æ›´äØ“å¤æ‚ã€?/span>
ž®†æ•£è½äºŽå„个业务对象之ä¸çš?/span>Cross-cutting concerns攉™›†èµäh¥åQŒè®¾è®¡å„个独立å¯é‡ç”¨çš„对象,˜q™äº›å¯¹è±¡¿UîC¹‹ä¸?/span>AspectåQŒä¾‹å¦‚在DynamicProxyDemo™å¹ç›®ä¸å°†ç™Õd½•çš„åŠ¨ä½œè®¾è®¡äØ“ä¸€ä¸?/span>LogHandler¾cÕdˆ«åQ?/span>LogHandler¾cÕdˆ«åœ?/span>AOP的术è¯å°±æ˜?/span>Aspect的一个具体实例,åœ?/span>AOPä¸ç€é‡äºŽAspectçš„èöL认,ž®†ä¹‹ä»Žä¸šåŠ¡æµ½E‹ä¸ç‹¬ç«‹å‡ºæ¥åQŒåœ¨éœ€è¦è¯¥æœåŠ¡çš„æ—¶å€™ï¼Œ¾~åˆåQ?/strong>WeaveåQ?/span>臛_º”用程åºä¹‹ä¸Šï¼Œä¸éœ€è¦æœåŠ¡çš„æ—¶å€™ï¼Œä¹Ÿå¯ä»¥é©¬ä¸Šä»Žåº”用½E‹åºä¸è„±¼›»ï¼Œåº”用½E‹åºä¸çš„å¯é‡ç”¨ç»„ä»¶ä¸ç”¨ä½œä»ÖM½•的修改,例如åœ?/span>DynamicProxyDemo™å¹ç›®ä¸çš„HelloSpeaker所代表的角色就是应用程åºä¸å¯é‡ç”¨çš„¾l„äšgåQŒåœ¨å®ƒéœ€è¦è®°å½•æœåŠ¡æ—¶òq¶ä¸ç”¨ä¿®æ”ÒŽœ¬íw«çš„½E‹åºä»£ç ã€?/span>
å¦ä¸€æ–šw¢åQŒå¯¹äºŽåº”用程åºä¸å¯é‡ç”¨çš„¾l„äšgæ¥è¯´åQŒä»¥AOP的设计方å¼ï¼Œå®ƒä¸ç”¨çŸ¥é“å¤„ç†æä¾›æœåŠ¡çš„å¯¹è±¡ä¹‹å˜åœ¨ï¼Œå…·ä½“的说åQŒä¸ŽæœåŠ¡ç›¸å…³çš?/span>APIä¸ä¼šå‡ºçŽ°åœ¨å¯é‡ç”¨çš„应用程åºç»„件之ä¸ï¼Œå› è€Œå¯æé«˜˜q™äº›¾l„äšgçš„é‡ç”¨æ€§ï¼Œæ‚¨å¯ä»¥å°†˜q™äº›¾l„äšg应用臛_…¶å®ƒçš„应用½E‹åºä¹‹ä¸åQŒè€Œä¸ä¼šå› 为目å‰åŠ å…¥äº†æŸäº›æœåŠ¡è€Œä¸Žç›®å‰çš„åº”ç”¨ç¨‹åºæ¡†æž¶å‘生耦åˆã€?/span>
Aspectçš„å…·ä½“å®žä½œç§°ä¹‹äØ“AdviceåQŒä»¥è®°å½•的动作而言åQ?/span>Adviceä¸ä¼šåŒ…括真æ£çš„记录程åºä»£ç æ˜¯å¦‚ä½•å®žä½œçš„ï¼Œåƒæ˜¯DynamicProxyDemo™å¹ç›®ä¸çš„LogHandler¾cÕdˆ«ž®±æ˜¯Advice的一个具体实例,Adviceä¸åŒ…括了Cross-cutting concernsçš„è¡Œä¸ºæˆ–æ‰€è¦æä¾›çš„æœåŠ¡ã€?/span>
Aspectåœ¨åº”ç”¨ç¨‹åºæ‰§è¡Œæ—¶åŠ å…¥ä¸šåŠ¡‹¹ç¨‹çš„ç‚¹æˆ–æ—¶æœºç§°ä¹‹äØ“JoinpointåQŒå…·ä½“æ¥è¯ß_¼Œž®±æ˜¯Advice在应用程åºä¸è¢«å‘¼å«æ‰§è¡Œçš„æ—¶æœºåQŒè¿™ä¸ªæ—¶æœºå¯èƒ½æ˜¯æŸä¸ªæ–ÒŽ³•被呼å«ä¹‹å‰æˆ–之åŽåQˆæˆ–两者都有)åQŒæˆ–是æŸä¸ªä¾‹å¤–å‘生的时候ã€?/span>
Pointcut是一个定义,藉由˜q™ä¸ªå®šä¹‰æ‚¨å¯ä»¥æŒ‡å®šæŸä¸?/span>Aspect在哪äº?/span>Joinpoint时被应用臛_º”用程åºä¹‹ä¸Šã€‚具体的è¯ß_¼Œæ‚¨å¯ä»¥åœ¨æŸä¸ªå®šä¹‰æ¡£ä¸æ’°å†™PointcutåQŒå½“ä¸è¯´æ˜Žäº†å“ªäº›Aspectè¦åº”用至应用½E‹åºä¸çš„哪些Joinpointã€?/span>
一ä¸?/span>Adviceè¢«åº”ç”¨çš„å¯¹è±¡æˆ–ç›®æ ‡å¯¹è±¡ï¼Œä¾‹å¦‚DynamicProxyDemo™å¹ç›®ä¸çš„HelloSpeakerž®±æ˜¯LogHandler˜q™ä¸ªAdviceçš?/span>Targetã€?/span>
对于一个现å˜çš„¾cÕdˆ«åQ?/span>Introductionå¯ä»¥ä¸ºå…¶å¢žåŠ è¡ŒäØ“åQŒè€Œä¸ç”¨ä¿®æ”¹è¯¥¾cÕdˆ«çš„程åºï¼Œå…·ä½“的说åQŒæ‚¨å¯ä»¥ä¸ºæŸä¸ªå·²æ’°å†™ã€ç¼–译完æˆçš„¾cÕdˆ«åQŒåœ¨æ‰§è¡Œæ—¶æœŸåЍæ€åŠ å…¥ä¸€äº›æ–¹æ³•æˆ–è¡ŒäØ“åQŒè€Œä¸ç”¨ä¿®æ”ÒŽˆ–新增ä»ÖM½•一行程åºä»£ç ã€?/span>
åœ?strong>ã€?/strong>Expert One-on-One J2EE Development WIthout EJBã€?/span>一书ä¸åQ?/span>Rod Johnsonã€?/span>Juergen Hoelleråœ¨ç¬¬å…«ç« ä¸æœ‰æåˆ°åQ?/span>AOP的实作有五个主è¦çš„ç–略:Dynamic Proxiesã€?/span>Dynamic Byte Code Generationã€?/span>Java Code Generationã€?/span>Use of a Custon Class Loaderã€?/span>Language Extensionsã€?/span>
在之å‰é™æ€ä»£ç†ä¸ŽåЍæ€ä»£ç†ä¸åQŒå·²¾lä‹É用实际的½E‹åºèŒƒä¾‹ä»‹ç»˜q‡ä»£ç†æœºåˆ¶çš„实现åQ?/span>Springçš?/span>AOPä¸»è¦æ˜¯é€è¿‡åЍæ€ä»£ç†æ¥å®Œæˆã€?/span>
Advice被应用至对象之上的过½E‹ç§°ä¹‹äØ“¾~åˆåQ?/span>WeaveåQ‰ï¼Œåœ?/span>AOPä¸ç¼åˆçš„æ–¹å¼æœ‰å‡ 个时间点åQšç¼–译时期(Compile timeåQ‰ã€ç±»åˆ«åŠ è½½æ—¶æœŸï¼ˆClassload timeåQ‰ã€æ‰§è¡Œæ—¶æœŸï¼ˆRuntimeåQ‰ã€?/span>
¾l“åˆDynamicProxyDemo的实例,ž®†ä»¥ä¸Šä»‹¾l过çš?/span>AOP相关åè¯å…·ä½“çš„ä‹É用图片æ¥åŠ ä»¥è¡¨ç¤ºåQŒæœ‰åŠ©äºŽæ‚¨å¯¹æ¯ä¸€ä¸ªåè¯çš„ç†è§£ä¸Žè®¤è¯†ï¼š
2ã€æˆ‘们需è¦å¯¹è¯¥æŽ¥å£è¿›è¡Œå®žçŽ°çš„æ–ÒŽ³•:OrderManagerImpl.java
3ã€springé…ç½®å‘é€emailçš„applicationContext-email.xml
4ã€æœ€åŽé…¾|®è‡ªå·Þqš„jsp™åµé¢ä»¥åŠaction
åˆ°æ¤æ‰€æœ‰çš„å¼€å‘以¾l“æŸã€?br />
Sringé‚®äšg抽象层的主è¦åŒ…是åQšorg.springframework.mail 包。它包å«å«MailSender为å‘é€é‚®ä»¶çš„æ ¸å¿ƒæŽ¥å£å’ŒåŒ…å«ç®€å•邮件属性例如from,to,cc,subject,textå«SimpleMailMessage的值对è±? ˜q™ä¸ªåŒ…也包å«ä¸€ä¸ªæ£€æŸ¥å¼‚常的层次åQŒå®ƒæ”¯æŒä¸€ä¸ªæ›´é«˜çñ”别的抽象‘…过低çñ”别的邮äšg¾pÈ»Ÿå¼‚å¸¸ä¼´éšæ ¹å¼‚常å˜åœ¨MailException. 请å‚考JavaDocsä¸ºæ›´å¤šçš„ä¿¡æ¯æ‚邮件异常层‹Æ¡ã€?/p>
spring in action in action also provides a sub-interface of MailSender for specialized JavaMail features such as MIME messages, namely org.springframework.mail.javamail.JavaMailSender It also provides a callback interface for preparation of JavaMail MIME messages, namely org.springframework.mail.javamail.MimeMessagePreparator
Spring也支æŒä¸€ä¸ªMailSender的专用于JavaMail特å¾ä¾‹å¦‚MIME消æ¯å接å£ï¼Œå‘½å为org.springframework.javamail.JavaMailerSener。它也支æŒä¸€ä¸ªäØ“JavaMail MIMEä¿¡æ¯çš„准备回调接å£ï¼Œå‘½å为org.springframework.mail.JavaMail.MimeMessagePreparator.