[TOC]
- [åè¨](#åè¨)
- [ä¸ãåºç¡æ¦å¿µ](#ä¸åºç¡æ¦å¿µ)
- [1. JavaBean](#1-javabean)
- [2. Bean](#2-bean)
- [3. ä¼ ç»Javabeanä¸Springä¸çbeançåºå«](#3-ä¼ ç»javabeanä¸springä¸çbeançåºå«)
- [4. POJO](#4-pojo)
- [äºãSpringæ ¸å¿ææ¯](#äºspringæ ¸å¿ææ¯)
- [1. IOCï¼æ§å¶å转ï¼](#1-iocæ§å¶å转)
- [1.1 ä»ä¹æ¯IOC](#11-ä»ä¹æ¯ioc)
- [1.2 IoCè½åä»ä¹](#12-iocè½åä»ä¹)
- [1.3 IoCåDI](#13-iocådi)
- [1.4 IOCåºå±åç (éä½ç±»ä¹é´çè¦å度)](#14-iocåºå±åç-éä½ç±»ä¹é´çè¦å度)
- [1.5 Spring䏿ä¹ç¨](#15-spring䏿ä¹ç¨)
- [ï¼1ï¼é
ç½®æä»¶æ¹å¼](#1é
ç½®æä»¶æ¹å¼)
- [ï¼2ï¼æ³¨è§£æ¹å¼](#2注解æ¹å¼)
- [2. DIï¼ä¾èµæ³¨å
¥ï¼](#2-diä¾èµæ³¨å
¥)
- [2.1 ä»ä¹æ¯ä¾èµæ³¨å
¥](#21-ä»ä¹æ¯ä¾èµæ³¨å
¥)
- [2.2 为ä»ä¹ä½¿ç¨ä¾èµæ³¨å
¥](#22-为ä»ä¹ä½¿ç¨ä¾èµæ³¨å
¥)
- [2.3 为ä»ä¹è¦å®ç°æ¾è¦å](#23-为ä»ä¹è¦å®ç°æ¾è¦å)
- [2.4 IOCåDIåºå«](#24-iocådiåºå«)
- [2.5 ä¾èµæ³¨å
¥æ¹å¼](#25-ä¾èµæ³¨å
¥æ¹å¼)
- [ï¼1ï¼ä½¿ç¨setæ¹æ³æ³¨å
¥](#1使ç¨setæ¹æ³æ³¨å
¥)
- [ï¼2ï¼ä½¿ç¨æåæé 注å
¥](#2ä½¿ç¨æåæé 注å
¥)
- [ï¼3ï¼æ³¨å
¥å¯¹è±¡ç±»å屿§](#3注å
¥å¯¹è±¡ç±»å屿§)
- [ï¼4ï¼påç§°ç©ºé´æ³¨å
¥](#4påç§°ç©ºé´æ³¨å
¥)
- [ï¼5ï¼æ³¨å
¥å¤æç±»å屿§](#5注å
¥å¤æç±»å屿§)
- [3. AOPï¼é¢ååé¢ç¼ç¨ï¼](#3-aopé¢ååé¢ç¼ç¨)
- [3.1 ä»ä¹æ¯AOP](#31-ä»ä¹æ¯aop)
- [3.2 åºå±åç](#32-åºå±åç)
- [第ä¸ç§ JDK èªå¸¦çå¨æä»£çææ¯](#第ä¸ç§-jdk-èªå¸¦çå¨æä»£çææ¯)
- [第äºç§ CGLIB(CodeGenerationLibrary)æ¯ä¸ä¸ªå¼æºé¡¹ç®](#第äºç§-cglibcodegenerationlibraryæ¯ä¸ä¸ªå¼æºé¡¹ç®)
- [3.3 AOPæä½æ¯è¯](#33-aopæä½æ¯è¯)
- [3.4 SpringçAOPæä½](#34-springçaopæä½)
- [ï¼1ï¼AOPå夿ä½](#1aopå夿ä½)
- [ï¼2ï¼ä½¿ç¨è¡¨è¾¾å¼é
ç½®åå
¥ç¹](#2使ç¨è¡¨è¾¾å¼é
ç½®åå
¥ç¹)
- [3.5 使ç¨xmlå®ç°AOP](#35-使ç¨xmlå®ç°aop)
- [3.6 ä½¿ç¨æ³¨è§£å®ç°AOP](#36-ä½¿ç¨æ³¨è§£å®ç°aop)
- [3.7 为ä»ä¹éè¦ä»£ç模å¼ï¼](#37-为ä»ä¹éè¦ä»£ç模å¼)
- [3.8 éæä»£ç](#38-éæä»£ç)
- [3.9 卿代çï¼ä½¿ç¨JDKå
ç½®çProxyå®ç°](#39-卿代ç使ç¨jdkå
ç½®çproxyå®ç°)
- [3.10 卿代çï¼ä½¿ç¨cglibå®ç°](#310-卿代ç使ç¨cglibå®ç°)
- [4. Spring Ioc容å¨](#4-spring-ioc容å¨)
- [4.1 Beanä½ç¨å](#41-beanä½ç¨å)
- [4.2 Bean ççå½å¨æ](#42-bean-ççå½å¨æ)
- [4.3 BeanFactory åApplicationContextï¼Beanå·¥åååºç¨ä¸ä¸æï¼](#43-beanfactory-åapplicationcontextbeanå·¥åååºç¨ä¸ä¸æ)
# åè¨
ä¸ºäºæ´å¥½çæ·±å
¥å¦ä¹ Springæ ¸å¿ææ¯ï¼å¨è¿éæ´çäºSpringç¸å
³çå¸¸è§æ ¸å¿ç¥è¯ï¼åé¢è¯ç¥è¯ç¹ï¼æ¬æå°éè¿æµ
æ¾ææçè¯è¨å代ç å®ç°ï¼ç¸ä¿¡å¯ä»¥å¨æççæ¶é´å
è¿è¡å·©åºå¦ä¹ ã
æ¬æåèï¼
- [ç解并å®ç°ä¸ä¸ªIOC容å¨](https://github.com/biezhi/java-bible/blob/master/ioc/index.md)
- [ãæºç å®ç°ãJava-Guide/Springå¦ä¹ ä¸é¢è¯.md at master · Snailclimb/Java-Guide](https://github.com/Snailclimb/Java-Guide/blob/master/%E4%B8%BB%E6%B5%81%E6%A1%86%E6%9E%B6/Spring%E5%AD%A6%E4%B9%A0%E4%B8%8E%E9%9D%A2%E8%AF%95.md)
- [ä¸èµ·æ¥è°è° Spring AOPï¼ - æé](https://juejin.im/post/5aa7818af265da23844040c6)
- [é»é©¬ç¨åºåSpring2016å¦ä¹ ç¬è®°](https://github.com/Only-lezi/spring-learning/tree/master/spring-learning-article)
- [Springå¦ä¹ æ»ç»ï¼äºï¼ââéæä»£çãJDKä¸CGLIB卿代çãAOP+IoC - å¼ æ - å客å](http://www.cnblogs.com/best/p/5679656.html)
- [Spring IoCæä»ä¹å¥½å¤å¢ï¼ - ç¥ä¹](https://www.zhihu.com/question/23277575/answer/169698662)
- [æå®¢å¦é¢Spring Wiki](http://wiki.jikexueyuan.com/project/spring/transaction-management.html)
- [ãå¿
读ãSpring W3Cschoolæç¨](https://www.w3cschool.cn/wkspring/f6pk1ic8.html)
- [ãå¿
读ãJavaæ°æå¦ä½å¦ä¹ SpringãStrutsãHibernateä¸å¤§æ¡æ¶ï¼ - ç¥ä¹ï¼æ·±åº¦å¥½æ](https://www.zhihu.com/question/21142149)
个人ç使ç¨ä½ä¼
- **spring**ï¼æ ¸å¿æä¾ä¾èµæ³¨å
¥
- **spring mvc**ï¼Â mvcæ¡æ¶
- **spring boot**ï¼è¯´ä¸å¤ªåºä»ä¹æè§ï¼è·mvcæ¯å°±æè§é
ç½®å°äºå¥½å¤
- **spring cloud**ï¼å´ç»å¾®æå¡çä¸å¥ä¸è¥¿
from 2018/7/27
# ä¸ãåºç¡æ¦å¿µ
## 1. JavaBean
**JavaBeanæ¯ä¸ç§ç»ä»¶ææ¯**ï¼å°±å¥½åä½ åäºä¸ä¸ªæ³åï¼èè¿ä¸ªæ³åä¼å¨å¾å¤å°æ¹è¢«æ¿å»ç¨ï¼è¿ä¸ªæ³å乿ä¾å¤ç§åè½(ä½ å¯ä»¥æ¿è¿ä¸ªæ³åæ³ãé¤ãæ¬çç)ï¼èè¿ä¸ªæ³åå°±æ¯ä¸ä¸ªç»ä»¶ã
ã**JavaBeanæ¯ä¸ä¸ªéµå¾ªç¹å®åæ³çJavaç±»**ï¼å®é常å
·æå¦ä¸ç¹ç¹ï¼
- è¿ä¸ªJavaç±»å¿
é¡»å
·æä¸ä¸ªæ åçæé 彿°
- 屿§å¿
é¡»ç§æåã
- ç§æåç屿§å¿
é¡»éè¿publicç±»åçæ¹æ³æ´é²ç»å
¶å®ç¨åºï¼å¹¶ä¸æ¹æ³çå½åä¹å¿
é¡»éµå®ä¸å®çå½åè§èã
- è¿ä¸ªç±»åºæ¯å¯åºååçãï¼æ¯å¦å¯ä»¥å®ç°Serializable æ¥å£ï¼ç¨äºå®ç°beançæä¹
æ§ï¼
许å¤å¼åè
æJavaBeançä½éµä»ç¹å®å½å约å®çPOJOã ç®èè¨ä¹ï¼å½ä¸ä¸ªPOJOå¯åºååï¼æä¸ä¸ªæ åçæé 彿°ï¼ä½¿ç¨getteråsetteræ¹æ³æ¥è®¿é®å±æ§æ¶ï¼ä»å°±æ¯ä¸ä¸ªJavaBeanã
```java
package gacl.javabean.study;
/**
* @author gacl
* Person类就æ¯ä¸ä¸ªæç®åçJavaBean
*/
public class Person {
//Personç±»å°è£
çç§æå±æ§
// å§å Stringç±»å
private String name;
// æ§å« Stringç±»å
private String sex;
// å¹´é¾ intç±»å
private int age;
/**
* æ åæ°æé æ¹æ³
*/
public Person() {
}
//Personç±»å¯¹å¤æä¾çç¨äºè®¿é®ç§æå±æ§çpublicæ¹æ³
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
```
JavaBeanå¨J2EEå¼åä¸ï¼é常ç¨äºå°è£
æ°æ®ï¼å¯¹äºéµå¾ªä»¥ä¸åæ³çJavaBeanç»ä»¶ï¼å
¶å®ç¨åºå¯ä»¥éè¿åå°ææ¯å®ä¾åJavaBean对象ï¼å¹¶ä¸éè¿åå°é£äºéµå®å½åè§èçæ¹æ³ï¼ä»èè·ç¥JavaBeanç屿§ï¼è¿èè°ç¨å
¶å±æ§ä¿åæ°æ®ã
## 2. Bean
- **Beanç䏿å«ä¹æ¯âè±åâï¼Beançå«ä¹æ¯å¯éå¤ä½¿ç¨çJavaç»ä»¶**ãæè°ç»ä»¶å°±æ¯ä¸ä¸ªç±å¯ä»¥èªè¡è¿è¡å
é¨ç®¡ççä¸ä¸ªæå 个类æç»æãå¤çä¸äºè§£å
¶å
é¨ä¿¡æ¯åè¿è¡æ¹å¼ç群ä½ã使ç¨å®ç对象åªè½éè¿æ¥å£æ¥æä½ã
- Beanå¹¶ä¸éè¦ç»§æ¿ç¹å«çåºç±»(BaseClass)æå®ç°ç¹å®çæ¥å£(Interface)ãBeançç¼åè§è使Beanç容å¨(Container)è½å¤åæä¸ä¸ªJavaç±»æä»¶ï¼å¹¶å°å
¶æ¹æ³(Methods)ç¿»è¯æå±æ§(Properties)ï¼å³æJavaç±»ä½ä¸ºä¸ä¸ªBean类使ç¨ãBeançç¼åè§èå
æ¬Beanç±»çæé æ¹æ³ãå®ä¹å±æ§åè®¿é®æ¹æ³ç¼åè§åã
- Java Beanæ¯åºäºJavaçç»ä»¶æ¨¡åï¼ç±**屿§ãæ¹æ³åäºä»¶**3é¨åç»æãå¨è¯¥æ¨¡åä¸ï¼JavaBeanå¯ä»¥è¢«ä¿®æ¹æä¸å
¶ä»ç»ä»¶ç»åä»¥çææ°ç»ä»¶æå®æ´çç¨åºã宿¯ä¸ç§Javaç±»ï¼éè¿å°è£
æä¸ºå
·ææç§åè½æè
å¤çæä¸ªä¸å¡ç对象ãå æ¤ï¼ä¹å¯ä»¥éè¿åµå¨JSP页é¢å
çJava代ç 访é®Beanåå
¶å±æ§ã
## 3. ä¼ ç»Javabeanä¸Springä¸çbeançåºå«
Javabeanå·²ç»æ²¡äººç¨äº
springbeanå¯ä»¥è¯´æ¯javabeançåå±, ä½å·²ç»å®å
¨ä¸æ¯ä¸åäºå¿äº
**ç¨å¤ä¸åï¼**ä¼ ç»javabeanæ´å¤å°ä½ä¸ºå¼ä¼ éåæ°ï¼èspringä¸çbeanç¨å¤å 乿 å¤ä¸å¨ï¼ä»»ä½ç»ä»¶é½å¯ä»¥è¢«ç§°ä¸ºbeanã
**åæ³ä¸åï¼**ä¼ ç»javabeanä½ä¸ºå¼å¯¹è±¡ï¼è¦æ±æ¯ä¸ªå±æ§é½æä¾getteråsetteræ¹æ³ï¼ä½springä¸çbeanåªé为æ¥åè®¾å¼æ³¨å
¥ç屿§æä¾setteræ¹æ³ã
**çå½å¨æä¸åï¼**ä¼ ç»javabeanä½ä¸ºå¼å¯¹è±¡ä¼ éï¼ä¸æ¥åä»»ä½å®¹å¨ç®¡çå
¶çå½å¨æï¼springä¸çbeanæspring管çå
¶çå½å¨æè¡ä¸ºã
ææå¯ä»¥è¢«spring容å¨å®ä¾å并管ççjavaç±»é½å¯ä»¥ç§°ä¸ºbeanã
忥æå¡å¨å¤ç页é¢è¿åçå¼é½æ¯ç´æ¥ä½¿ç¨request对象ï¼åæ¥å¢å äºjavabeanæ¥ç®¡çå¯¹è±¡ï¼ææé¡µé¢å¼åªè¦æ¯åjavabean对åºï¼å°±å¯ä»¥ç¨ç±».GET屿§æ¹æ³æ¥è·åå¼ãjavabeanä¸åªå¯ä»¥ä¼ åæ°ï¼ä¹å¯ä»¥å¤çæ°æ®ï¼ç¸å½ä¸æä¸ä¸ªæå¡å¨æ§è¡çç±»æ¾å°äºé¡µé¢ä¸ï¼ä½¿å¯¹è±¡ç®¡çç¸å¯¹ä¸é£ä¹ä¹±ï¼å¯¹æ¯aspçæ¶åææå
容é½å¨é¡µé¢ä¸å®æï¼ã
springä¸çbeanï¼æ¯éè¿é
ç½®æä»¶ãjavaconfigççè®¾ç½®ï¼æspringèªå¨å®ä¾åï¼ç¨å®åèªå¨éæ¯ç对象ã让æä»¬åªéè¦å¨ç¨çæ¶å使ç¨å¯¹è±¡å°±å¯ä»¥ï¼ä¸ç¨èè妿å建类对象ï¼è¿å°±æ¯springçæ³¨å
¥ï¼ãä¸è¬æ¯ç¨å¨æå¡å¨ç«¯ä»£ç çæ§è¡ä¸ã
## 4. POJO
POJO åJavaBeanæ¯æä»¬å¸¸è§ç两个å
³é®åï¼ä¸è¬å®¹ææ··æ·ï¼POJOå
¨ç§°æ¯Plain Ordinary Java Object / Pure Old Java Objectï¼ä¸æå¯ä»¥ç¿»è¯æï¼æ®éJavaç±»ï¼**å
·æä¸é¨ågetter/setteræ¹æ³çé£ç§ç±»å°±å¯ä»¥ç§°ä½POJO**ï¼ä½æ¯JavaBean忝 POJO夿å¾å¤ï¼ Java Bean æ¯å¯å¤ç¨çç»ä»¶ï¼å¯¹ Java Bean 并没æä¸¥æ ¼çè§èï¼ç论ä¸è®²ï¼ä»»ä½ä¸ä¸ª Java ç±»é½å¯ä»¥æ¯ä¸ä¸ª Bean ãä½é常æ
åµä¸ï¼ç±äº Java Bean æ¯è¢«å®¹å¨æå建ï¼å¦ Tomcat) çï¼æä»¥ Java Bean åºå
·æä¸ä¸ªæ åçæé å¨ï¼å¦å¤ï¼é常 Java Bean è¿è¦å®ç° Serializable æ¥å£ç¨äºå®ç° Bean çæä¹
æ§ã Java Bean æ¯ä¸è½è¢«è·¨è¿ç¨è®¿é®ç
ä¸è¬å¨webåºç¨ç¨åºä¸å»ºç«ä¸ä¸ªæ°æ®åºçæ å°å¯¹è±¡æ¶ï¼æä»¬åªè½ç§°å®ä¸ºPOJOã
POJO(Plain Old Java Object)è¿ä¸ªååç¨æ¥å¼ºè°å®æ¯ä¸ä¸ªæ®éjava对象ï¼è䏿¯ä¸ä¸ªç¹æ®ç对象ã
2005å¹´11ææ¶ï¼âPOJOâ主è¦ç¨æ¥æä»£é£äºæ²¡ç¨éµä»ç¹å®çJava对象模åï¼çº¦å®ææ¡æ¶å¦EJBçJava对象.
çæ³å°è®²ï¼ä¸ä¸ªPOJOæ¯ä¸ä¸ªä¸åä»»ä½éå¶çJava对象ï¼é¤äºJavaè¯è¨è§èï¼ãä¾å¦ä¸ä¸ªPOJOä¸åºè¯¥æ¯
1. æ©å±é¢å®çç±»ï¼å¦ public class Foo extends javax.servlet.http.HttpServlet { ...
2. å®ç°é¢å®çæ¥å£ï¼å¦ public class Bar implements javax.ejb.EntityBean { ...
3. å
å«é¢å®çæ æ³¨ï¼å¦ @javax.ejb.Entity public class Baz{ ...
ç¶åï¼å ä¸ºææ¯ä¸çå°é¾åå
¶ä»åå ï¼è®¸å¤å
¼å®¹POJO飿 ¼çè½¯ä»¶äº§åææ¡æ¶äºå®ä¸ä»ç¶è¦æ±ä½¿ç¨é¢å®çæ æ³¨ï¼è¬å¦ç¨äºæ´æ¹ä¾¿çæä¹
åã
# äºãSpringæ ¸å¿ææ¯
## 1. IOCï¼æ§å¶å转ï¼
### 1.1 ä»ä¹æ¯IOC
IoC(Inversion of Control)ï¼æä¸ºæ§å¶å转ï¼ä¸æ¯ä»ä¹ææ¯ï¼èæ¯ä¸ç§è®¾è®¡ææ³ãIocæå³ç**å°ä½ 设计好ç对象交ç»å®¹å¨æ§å¶ï¼è䏿¯ä¼ ç»çå¨ä½ ç对象å
é¨ç´æ¥æ§å¶**ã
å¦ä½ç解好Iocå¢ï¼ç解好Iocçå
³é®æ¯è¦æç¡®âè°æ§å¶è°ï¼æ§å¶ä»ä¹ï¼ä¸ºä½æ¯åè½¬ï¼æå转就åºè¯¥ææ£è½¬äºï¼ï¼åªäºæ¹é¢å转äºâï¼é£æä»¬æ¥æ·±å
¥åæä¸ä¸ï¼
- **è°æ§å¶è°ï¼æ§å¶ä»ä¹**ï¼ä¼ ç»Java SEç¨åºè®¾è®¡ï¼æä»¬ç´æ¥å¨å¯¹è±¡å
é¨éè¿newè¿è¡åå»ºå¯¹è±¡ï¼æ¯ç¨åºä¸»å¨å»å建ä¾èµå¯¹è±¡ï¼èIoCæ¯æä¸é¨ä¸ä¸ªå®¹å¨æ¥å建è¿äºå¯¹è±¡ï¼å³ç±Ioc容卿¥æ§å¶å¯¹ 象çå建ï¼è°æ§å¶è°ï¼å½ç¶æ¯IoC 容卿§å¶äºå¯¹è±¡ï¼æ§å¶ä»ä¹ï¼é£å°±æ¯ä¸»è¦æ§å¶äºå¤é¨èµæºè·åï¼ä¸åªæ¯å¯¹è±¡å
æ¬æ¯å¦æä»¶çï¼ã
- **ä¸ºä½æ¯å转ï¼åªäºæ¹é¢å转äº**ï¼æåè½¬å°±ææ£è½¬ï¼ä¼ ç»åºç¨ç¨åºæ¯ç±æä»¬èªå·±å¨å¯¹è±¡ä¸ä¸»å¨æ§å¶å»ç´æ¥è·åä¾èµå¯¹è±¡ï¼ä¹å°±æ¯æ£è½¬ï¼èåè½¬åæ¯ç±å®¹å¨æ¥å¸®å¿åå»ºåæ³¨å
¥ä¾èµå¯¹è±¡ï¼ä¸ºä½æ¯å转ï¼å 为ç±å®¹å¨å¸®æä»¬æ¥æ¾å注å
¥ä¾èµå¯¹è±¡ï¼å¯¹è±¡åªæ¯è¢«å¨çæ¥åä¾èµå¯¹è±¡ï¼æä»¥æ¯å转ï¼åªäºæ¹é¢å转äºï¼ä¾èµå¯¹è±¡çè·å被å转äºã
**ç®åæ¥è¯´**
> æ£è½¬ï¼æ¯å¦æä¸ä¸ªç±»ï¼å¨ç±»éé¢ææ¹æ³ï¼ä¸æ¯éæçæ¹æ³ï¼ï¼è°ç¨ç±»éé¢çæ¹æ³ï¼å建类ç对象ï¼ä½¿ç¨å¯¹è±¡è°ç¨æ¹æ³ï¼å建类对象çè¿ç¨ï¼éè¦newåºæ¥å¯¹è±¡
>
> åè½¬ï¼æå¯¹è±¡çåå»ºä¸æ¯éè¿newæ¹å¼å®ç°ï¼èæ¯äº¤ç»Springé
ç½®å建类对象
ãå¿
读ãIOC深度çè§£ï¼è¯·è½¬åï¼[æ·±å
¥æµ
åºIOC](../JavaWeb/æ·±å
¥æµ
åºIOC.md)
### 1.2 IoCè½åä»ä¹
IoC 䏿¯ä¸ç§ææ¯ï¼åªæ¯ä¸ç§ææ³ï¼ä¸ä¸ªéè¦çé¢å对象ç¼ç¨çæ³åï¼å®è½æå¯¼æä»¬å¦ä½è®¾è®¡åºæ¾è¦åãæ´ä¼è¯çç¨åºãä¼ ç»åºç¨ç¨åºé½æ¯ç±æä»¬å¨ç±»å
é¨ä¸»å¨å建ä¾èµå¯¹è±¡ï¼ä»è导è´ç±»ä¸ç±»ä¹é´é«è¦åï¼é¾äºæµè¯ï¼æäºIoC容å¨åï¼æåå»ºåæ¥æ¾ä¾èµå¯¹è±¡çæ§å¶æäº¤ç»äºå®¹å¨ï¼ç±å®¹å¨è¿è¡æ³¨å
¥ç»åå¯¹è±¡ï¼æä»¥å¯¹è±¡ä¸å¯¹è±¡ä¹é´æ¯æ¾æ£è¦åï¼è¿æ ·ä¹æ¹ä¾¿æµè¯ï¼å©äºåè½å¤ç¨ï¼æ´éè¦çæ¯ä½¿å¾ç¨åºçæ´ä¸ªä½ç³»ç»æåå¾éå¸¸çµæ´»ã
å
¶å®IoC对ç¼ç¨å¸¦æ¥çæå¤§æ¹å䏿¯ä»ä»£ç ä¸ï¼èæ¯ä»ææ³ä¸ï¼åçäºâ䏻仿¢ä½âçååãåºç¨ç¨åºåæ¬æ¯è大ï¼è¦è·åä»ä¹èµæºé½æ¯ä¸»å¨åºå»ï¼ä½æ¯å¨IoC/DIææ³ä¸ï¼åºç¨ç¨åºå°±åæè¢«å¨çäºï¼è¢«å¨ççå¾
IoC容卿¥å建并注å
¥å®æéè¦çèµæºäºã
IoCå¾å¥½çä½ç°äºé¢å对象设计æ³åä¹ä¸ââ 好è±åæ³åï¼â嫿¾æä»¬ï¼æä»¬æ¾ä½ âï¼å³ç±IoC容å¨å¸®å¯¹è±¡æ¾ç¸åºçä¾èµå¯¹è±¡å¹¶æ³¨å
¥ï¼è䏿¯ç±å¯¹è±¡ä¸»å¨å»æ¾ã
### 1.3 IoCåDI
**DIâDependency Injectionï¼å³âä¾èµæ³¨å
¥â**ï¼ç»ä»¶ä¹é´ä¾èµå
³ç³»ç±å®¹å¨å¨è¿è¡æå³å®ï¼å½¢è±¡ç说ï¼å³ç±å®¹å¨å¨æçå°æä¸ªä¾èµå
³ç³»æ³¨å
¥å°ç»ä»¶ä¹ä¸ãä¾èµæ³¨å
¥çç®çå¹¶é为软件系ç»å¸¦æ¥æ´å¤åè½ï¼èæ¯ä¸ºäºæåç»ä»¶éç¨çé¢çï¼å¹¶ä¸ºç³»ç»æå»ºä¸ä¸ªçµæ´»ã坿©å±çå¹³å°ãéè¿ä¾èµæ³¨å
¥æºå¶ï¼æä»¬åªéè¦éè¿ç®åçé
ç½®ï¼èæ éä»»ä½ä»£ç 就坿å®ç®æ éè¦çèµæºï¼å®æèªèº«çä¸å¡é»è¾ï¼èä¸éè¦å
³å¿å
·ä½çèµæºæ¥èªä½å¤ï¼ç±è°å®ç°ã
çè§£DIçå
³é®æ¯ï¼â**è°ä¾èµè°ï¼ä¸ºä»ä¹éè¦ä¾èµï¼è°æ³¨å
¥è°ï¼æ³¨å
¥äºä»ä¹**âï¼é£æä»¬æ¥æ·±å
¥åæä¸ä¸ï¼
- **è°ä¾èµäºè°ï¼** å½ç¶æ¯åºç¨ç¨åºä¾èµäºIoC容å¨ï¼
- **为ä»ä¹éè¦ä¾èµï¼** åºç¨ç¨åºéè¦IoC容卿¥æä¾å¯¹è±¡éè¦çå¤é¨èµæºï¼
- **è°æ³¨å
¥è°ï¼** å¾ææ¾æ¯IoC容卿³¨å
¥åºç¨ç¨åºæä¸ªå¯¹è±¡ï¼åºç¨ç¨åºä¾èµç对象ï¼
- **注å
¥äºä»ä¹ï¼** å°±æ¯æ³¨å
¥æä¸ªå¯¹è±¡æéè¦çå¤é¨èµæºï¼å
æ¬å¯¹è±¡ãèµæºã叏鿰æ®ï¼ã
IoCåDIç±ä»ä¹å
³ç³»å¢ï¼å
¶å®å®ä»¬æ¯åä¸ä¸ªæ¦å¿µçä¸åè§åº¦æè¿°ï¼ç±äºæ§å¶å转æ¦å¿µæ¯è¾å«ç³ï¼å¯è½åªæ¯çè§£ä¸ºå®¹å¨æ§å¶å¯¹è±¡è¿ä¸ä¸ªå±é¢ï¼å¾é¾è®©äººæ³å°è°æ¥ç»´æ¤å¯¹è±¡å
³ç³»ï¼ï¼æä»¥2004年大å¸çº§äººç©Martin Fowleråç»åºäºä¸ä¸ªæ°çååï¼âä¾èµæ³¨å
¥âï¼ç¸å¯¹IoC èè¨ï¼**âä¾èµæ³¨å
¥â**æç¡®æè¿°äº**â被注å
¥å¯¹è±¡ä¾èµIoC容å¨é
ç½®ä¾èµå¯¹è±¡â**ã
对äºSpring Iocè¿ä¸ªæ ¸å¿æ¦å¿µï¼æç¸ä¿¡æ¯ä¸ä¸ªå¦ä¹ Springç人é½ä¼æèªå·±ççè§£ãè¿ç§æ¦å¿µä¸çç解没æç»å¯¹çæ åçæ¡ï¼ä»è
è§ä»æºè
è§æºã çè§£äºIoCåDIçæ¦å¿µåï¼ä¸åé½å°åå¾ç®åæäºï¼å©ä¸çå·¥ä½åªæ¯å¨æ¡æ¶ä¸å 积æ¨èå·²ï¼ä¸ä¸èæ¥ççSpringæ¯æä¹ç¨ç
### 1.4 IOCåºå±åç (éä½ç±»ä¹é´çè¦å度)
- åºå±åçä½¿ç¨ææ¯
- xmlé
ç½®æä»¶
- dom4jè§£å³xml
- å·¥å设计模å¼
- åå°
- åç
```java
//伪代ç
//éè¦å®ä¾åçç±»
public class UserService{
}
public class UserServlet{
//å¾å°UserServiceç对象
//åå§çåæ³ï¼new 对象(); æ¥å建
//ç»è¿springå
UserFactory.getService(); //(ä¸é¢ä¸¤æ¥ç代ç è°ç¨ç)
}
```
**ç¬¬ä¸æ¥ï¼å建xmlé
ç½®æä»¶ï¼é
ç½®è¦å建ç对象类**
```xml
```
**ç¬¬äºæ¥ï¼å建工åç±»ï¼ä½¿ç¨dom4jè§£æé
ç½®æä»¶+åå°**
```java
public class Factory {
//è¿åUserServiceå¯¹è±¡çæ¹æ³
public static UserService getService() {
//1.使ç¨dom4jæ¥è§£æxmlæä»¶
//æ ¹æ®idå¼userServiceï¼å¾å°idå¼å¯¹åºçclass屿§å¼
String classValue = "class屿§å¼";
//2.使ç¨åå°æ¥å建类对象
Class clazz = Class.forName(classValue)ï¼
//å建类ç对象
UserService service = clazz.newInstance();
return service;
}
}
```
è¶
详ç»åç讲解ï¼[java-bible/4.principle.md at master · biezhi/java-bible](https://github.com/biezhi/java-bible/blob/master/ioc/4.principle.md)

### 1.5 Spring䏿ä¹ç¨
#### ï¼1ï¼é
ç½®æä»¶æ¹å¼
æä»¬å¨Spring䏿¯è¿æ ·è·å对象çï¼
```java
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");
Lol lol = (Lol) context.getBean("lol");
lol.gank();
}
```
ä¸èµ·ççSpringå¦ä½è®©å®çæå¢ï¼å¨ `applicationContext.xml` é
ç½®æä»¶ä¸æ¯é
±ç´«çï¼
```xml
```
`Lol` ç±»æ¯è¿æ ·çï¼
```java
public class Lol {
private String name;
public Lol() {
}
public void gank(){
System.out.println(this.name + "å¨gank!!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
```
ä¸é¢ç代ç è¿è¡ç»æèªç¶æ¯ `åå£å¨gank!!`ã
#### ï¼2ï¼æ³¨è§£æ¹å¼
Springæ´é«çº§çç¨æ³ï¼å¨3.0çæ¬ä¹åæäºåºäºAnnotationçæ³¨å
¥å®ç°ï¼ä¸ºæ¯æ¯æ¬¡é½è¦é
ç½® `Xml` çå°é½èç¼ãã
é¦å
è¿æ¯è¦å¨ `xml` ä¸é
ç½®å¯ç¨æ³¨è§£æ¹å¼
```xml
```
è¿æ ·å°±è½ä½¿ç¨æ³¨è§£é©±å¨ä¾èµæ³¨å
¥äºï¼ä¸é¢æ¯ä¸ä¸ªä½¿ç¨åºæ¯
```java
public class Lol {
@Autowired
private DuangService duangService ;
public void buyDuang(String name, int money) {
duangService.buy(name, money);
}
}
```
```java
@Service("duangService")
public class DuangService {
public void buy(String name, int money){
if(money > 0){
System.out.println(name + "ä¹°äº" + money + "æ¯é±çç¹æï¼è£
鼿åï¼");
} else{
System.out.println(name + "没é±è¿æ³è£
é¼ï¼çæ¯åªå¤·ææ");
}
}
}
```
è¿åªæ¯ä¸ä¸ªç®åçä¾åï¼å壿éçæ¶åæ³è¦ä¹°5æ¯é±çä¸æç¹æï¼å¯ããè½ç¶ä¸ç¬¦åé»è¾
æ¤æ¶ `DuangService` å·²ç»æ³¨å
¥å° `Lol` 对象ä¸ï¼è¿è¡ä»£ç çç»æï¼è¿éæ¯ä¾åï¼ä»£ç ä¸è½è¿è¡çï¼å°±æ¯ï¼
```java
å¾·çä¹°äº5æ¯é±çç¹æï¼è£
鼿åï¼
```
## 2. DIï¼ä¾èµæ³¨å
¥ï¼
### 2.1 ä»ä¹æ¯ä¾èµæ³¨å
¥
å¨ä¾èµæ³¨å
¥ç模å¼ä¸ï¼å建被è°ç¨è
å¾å·¥ä½ä¸åç±è°ç¨è
æ¥å®æï¼å建被è°ç¨è
å®ä¾çå·¥ä½é常ç±Spring容å¨å®æï¼ç¶å注å
¥è°ç¨è
ã**å建对象æ¶ï¼åç±»éç屿§è®¾ç½®å¼**
### 2.2 为ä»ä¹ä½¿ç¨ä¾èµæ³¨å
¥
为äºå®ç°ä»£ç /模åä¹é´æ¾è¦åã
### 2.3 为ä»ä¹è¦å®ç°æ¾è¦å
ä¸å±è°ç¨ä¸å±ï¼ä¸å±ä¾èµäºä¸å±ï¼å½ä¸å±å§çå卿¶ä¸å±ä¹è¦è·çåå¨ï¼è¿å°±ä¼å¯¼è´æ¨¡åçå¤ç¨æ§éä½èä¸å¤§å¤§æé«äºå¼åçææ¬ã
ä¸è¬æ
åµä¸æ½è±¡çå忦çå¾å°ï¼è®©ç¨æ·ç¨åºä¾èµäºæ½è±¡ï¼å®ç°çç»èä¹ä¾èµäºæ½è±¡ãå³ä½¿å®ç°ç»è䏿åå¨ï¼åªè¦æ½è±¡ä¸åï¼å®¢æ·ç¨åºå°±ä¸éè¦ååãè¿å¤§å¤§éä½äºå®¢æ·ç¨åºä¸å®ç°ç»èçè¦å度ã
### 2.4 IOCåDIåºå«
1. IOCæ§å¶åè½¬ï¼æå¯¹è±¡å建交ç»Springé
ç½®
2. DIä¾èµæ³¨å
¥ï¼åç±»éé¢å±æ§æ³¨å
¥å¼
3. å
³ç³»ï¼ä¾èµæ³¨å
¥ä¸è½åç¬åå¨ï¼éè¦å¨IOCåºç¡ä¸å®ææä½
### 2.5 ä¾èµæ³¨å
¥æ¹å¼
1. 使ç¨setæ¹æ³æ³¨å
¥
2. ä½¿ç¨æåæé 注å
¥
3. ä½¿ç¨æ¥å£æ³¨å
¥
说æï¼Springæ¡æ¶ä¸æ¯æåä¸¤ç§æ¹å¼
#### ï¼1ï¼ä½¿ç¨setæ¹æ³æ³¨å
¥
```xml
1234567
```
#### ï¼2ï¼ä½¿ç¨æåæé 注å
¥
```java
public class Person {
private String pname;
public void setPname(String pname) {
this.pname = pname;
}
}
```
```xml
```
#### ï¼3ï¼æ³¨å
¥å¯¹è±¡ç±»å屿§
- å建serviceådaoç±»ï¼å¨serviceä¸å¾å°dao
å
·ä½å®ç°è¿ç¨
- å¨service䏿daoä½ä¸ºå±æ§ï¼çædaoçsetæ¹æ³
```java
public class UserService {
// 1.å®ä¹UserDaoç±»å屿§
private UserDao userDao;
// 2.çæsetæ¹æ³
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
```
1. é
ç½®æä»¶æ³¨å
¥å
³ç³»
```java
12345678
```
#### ï¼4ï¼påç§°ç©ºé´æ³¨å
¥


#### ï¼5ï¼æ³¨å
¥å¤æç±»å屿§
```java
aaa
bbb
ccc
qqq
www
eee
admin
admin
```
## 3. AOPï¼é¢ååé¢ç¼ç¨ï¼
### 3.1 ä»ä¹æ¯AOP
AOPï¼Aspect Oriented Programming ï¼ç§°ä¸ºé¢ååé¢ç¼ç¨ï¼æ©å±åè½ä¸æ¯ä¿®æ¹æºä»£ç å®ç°ï¼å¨ç¨åºå¼åä¸ä¸»è¦ç¨æ¥è§£å³ä¸äºç³»ç»å±é¢ä¸çé®é¢ï¼æ¯å¦æ¥å¿ï¼äºå¡ï¼æéçå¾
ï¼Struts2çæ¦æªå¨è®¾è®¡å°±æ¯åºäºAOPçææ³ï¼æ¯ä¸ªæ¯è¾ç»å
¸çä¾åã
- AOPï¼é¢ååé¢ç¼ç¨ï¼æ©å±åè½ä¸ä¿®æ¹æºä»£ç å®ç°
- AOPéå**æ¨ªåæ½åæºå¶**ï¼å代äºä¼ ç»**纵åç»§æ¿**ä½ç³»é夿§ä»£ç ï¼æ§è½çè§ãäºå¡ç®¡çãå®å
¨æ£æ¥ãç¼åï¼
**springçåºå±éç¨ä¸¤ç§æ¹å¼è¿è¡å¢å¼º**
第ä¸ï¼Springä¼ ç»AOP 纯javaå®ç°ï¼å¨è¿è¡æï¼å¯¹ç®æ 对象è¿è¡ä»£çï¼ç»å
¥å¢å¼ºä»£ç
第äºï¼AspectJç¬¬ä¸æ¹å¼æºææ¯ï¼Springå·²ç»æ´åAspectJï¼æä¾å¯¹AspectJæ³¨è§£çæ¯æï¼å¼åAOPç¨åº æ´å 容æï¼ä¼ä¸ä¸»æµï¼
### 3.2 åºå±åç
#### 第ä¸ç§ JDK èªå¸¦çå¨æä»£çææ¯
JDK卿代çå¿
é¡»åºäºæ¥å£è¿è¡ä»£ç
ä½ç¨ï¼ä½¿ç¨ä»£çå¯ä»¥å¯¹ç®æ 对象è¿è¡æ§è½çæ§ï¼è®¡ç®è¿è¡æ¶é´ï¼ãå®å
¨æ£æ¥ï¼æ¯å¦å
·ææéï¼ã è®°å½æ¥å¿çã
注æï¼å¿
é¡»è¦ææ¥å£æè½è¿è¡ä»£çï¼ä»£çå对象å¿
须转æ¢ä¸ºæ¥å£ç±»å
#### 第äºç§ CGLIB(CodeGenerationLibrary)æ¯ä¸ä¸ªå¼æºé¡¹ç®
Spring使ç¨CGlib è¿è¡AOP代çï¼ hibernate 乿¯æ¯æCGlibï¼é»è®¤ä½¿ç¨ javassist ï¼éè¦ä¸è½½cglib çjarå
ï¼Spring ææ°çæ¬3.2 å
é¨å·²ç»éæäºcglib ï¼**æ éä¸è½½cglibçjar** ï¼
**ä½ç¨ï¼å¯ä»¥ä¸ºç®æ ç±»ï¼å¨æå建åç±»ï¼å¯¹ç®æ ç±»æ¹æ³è¿è¡ä»£çï¼æ 鿥å£ï¼**
åçï¼Spring AOP åºå±ï¼ä¼å¤æç¨æ·æ¯æ ¹æ®æ¥å£ä»£çè¿æ¯ç®æ 类代çï¼å¦æé对æ¥å£ä»£ç就使ç¨JDK代çï¼å¦æéå¯¹ç®æ 类代ç就使ç¨Cglib代çã
### 3.3 AOPæä½æ¯è¯
以ä¸é¢ä»£ç 为ä¾ï¼
```java
public class User {
public void add() {...}
public void delete() {...}
public void update() {...}
public void query() {...}
}
```
- **Joinpointï¼è¿æ¥ç¹ï¼ï¼éè¦ï¼**
- ç±»éé¢å¯ä»¥è¢«å¢å¼ºçæ¹æ³ï¼è¿äºæ¹æ³ç§°ä¸ºè¿æ¥ç¹
- **Pointcutï¼åå
¥ç¹ï¼ï¼éè¦ï¼**
- æè°åå
¥ç¹æ¯ææä»¬è¦å¯¹åªäº Joinpoint è¿è¡æ¦æªçå®ä¹
- **Adviceï¼éç¥/å¢å¼ºï¼ï¼éè¦ï¼**
- æè°éç¥æ¯ææ¦æªå° Joinpoint ä¹åæè¦åçäºæ
å°±æ¯éç¥ãéç¥å为**åç½®éç¥ï¼åç½®éç¥ï¼å¼å¸¸éç¥ï¼æç»éç¥ï¼ç¯ç»éç¥**ï¼æ¹æ³ä¹ååæ¹æ³ä¹åï¼
- **Aspectï¼åé¢ï¼**ï¼
- æå¢å¼ºåºç¨å°å
·ä½æ¹æ³ä¸é¢ï¼è¿ç¨æä¸ºåé¢ã
- **Introductionï¼å¼ä»ï¼**
- å¼ä»æ¯ä¸ç§ç¹æ®çéç¥å¨ä¸ä¿®æ¹ç±»ä»£ç çåæä¸ï¼ Introduction å¯ä»¥å¨è¿è¡æä¸ºç±»å¨æå°æ·»å ä¸äºæ¹æ³æ Fieldã
- **Targetï¼ç®æ 对象ï¼**
- 代ççç®æ 对象ï¼è¦å¢å¼ºçç±»ï¼
- **Weavingï¼ç»å
¥ï¼**
- æ¯æå¢å¼ºåºç¨å°ç®æ çè¿ç¨ï¼æ advice åºç¨å° targetçè¿ç¨
- **Proxyï¼ä»£çï¼**
- ä¸ä¸ªç±»è¢« AOP ç»å
¥å¢å¼ºåï¼å°±äº§çä¸ä¸ªç»æä»£çç±»
### 3.4 SpringçAOPæä½
- å¨Springéé¢è¿è¡Aopæä½ï¼ä½¿ç¨aspectjå®ç°
- aspectj䏿¯Springçä¸é¨åï¼åSpringä¸èµ·ä½¿ç¨è¿è¡Aopæä½
- Spring2.0以忰å¢äºå¯¹aspectjçæ¯æ
- 使ç¨aspectjå®ç°aopæä¸¤ç§æ¹å¼
- åºäºaspectjçxmlé
ç½®
- åºäºaspectjçæ³¨è§£æ¹å¼
#### ï¼1ï¼AOPå夿ä½
1ãé¤äºå¯¼å
¥åºæ¬çjarå
ä¹å¤ï¼è¿éè¦å¯¼å
¥aopç¸å
³çjarå
ï¼
```
aopalliance-1.0.jar
aspectjweaver-1.8.7.jar
spring-aspects-5.0.4.RELEASE.jar
spring-aop-5.0.4.RELEASE.jar
```
2ãå建Springæ ¸å¿é
ç½®æä»¶
é¤äºå¼å
¥äºçº¦æspring-beansä¹å¤è¿éè¦å¼å
¥æ°çº¦æspring-aop
```xml
12345678
```
#### ï¼2ï¼ä½¿ç¨è¡¨è¾¾å¼é
ç½®åå
¥ç¹
1. åå
¥ç¹ï¼å®é
å¢å¼ºçæ¹æ³
2. 常ç¨ç表达å¼
execution(<访é®ä¿®é¥°ç¬¦>? <è¿åç±»å> <æ¹æ³å>(<åæ°>)<å¼å¸¸>)
ï¼1ï¼å¯¹å
å
çaddæ¹æ³è¿è¡å¢å¼º
`execution(* cn.blinkit.aop.Book.add(..))`
ï¼2ï¼* æ¯å¯¹ç±»éé¢çæææ¹æ³è¿è¡å¢å¼º
`execution(* cn.blinkit.aop.Book.*(..))`
ï¼3ï¼*.* æ¯ææçç±»ä¸çæ¹æ³è¿è¡å¢å¼º
`execution(* *.*(..))`
ï¼4ï¼å¹é
ææsaveå¼å¤´çæ¹æ³
`execution(* save*(..))`
### 3.5 使ç¨xmlå®ç°AOP
**aopé
置代ç ï¼** Book
```java
public class Book {
public void add() {
System.out.println("add......");
}
}
```
MyBook
```java
public class MyBook {
public void before1() {
System.out.println("åç½®å¢å¼º......");
}
public void after1() {
System.out.println("åç½®å¢å¼º......");
}
//ç¯ç»éç¥
public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//æ¹æ³ä¹å
System.out.println("æ¹æ³ä¹å.....");
//æ§è¡è¢«å¢å¼ºçæ¹æ³
proceedingJoinPoint.proceed();
//æ¹æ³ä¹å
System.out.println("æ¹æ³ä¹å......");
}
}
```
xmlé
ç½®
```xml
```
æµè¯ä»£ç
```java
public class AOPTest {
@Test
public void testBook() {
ApplicationContext context = new ClassPathXmlApplicationContext("cn/blinkit/aop/spring-aop.xml");
Book book = (Book) context.getBean("book");
book.add();
}
}
```
### 3.6 ä½¿ç¨æ³¨è§£å®ç°AOP
1. å建对象
(1)å建BookåMyBook **ï¼å¢å¼ºç±»ï¼** 对象
2. å¨springæ ¸å¿é
ç½®æä»¶ä¸ï¼å¼å¯aopæä½
å
·ä½æä½è§xmlé
ç½®æä»¶ä»£ç ï¼
```xml
```
3. å¨å¢å¼ºç±»ä¸é¢ä½¿ç¨æ³¨è§£å®æaopæä½
ï¼1ï¼ç±»ä¸é¢å ä¸`@Aspect`
ï¼2ï¼æ¹æ³ä¸é¢å ä¸
`@Before(value = "execution(* cn.blinkit.aop.anno.Book.*(..))")`
`@After(value = "表达å¼")`
`@Around(value = "表达å¼")`ç...
4.
**Book**
```java
public class Book {
public void add() {
System.out.println("add...æ³¨è§£çæ¬...");
}
}
```
**MyBookå¢å¼ºç±»**
```java
@Aspect
public class MyBook {
//卿¹æ³ä¸é¢ä½¿ç¨æ³¨è§£å®æå¢å¼ºé
ç½®
@Before(value = "execution(* cn.blinkit.aop.anno.Book.*(..))")
public void before1() {
System.out.println("åç½®å¢å¼º...æ³¨è§£çæ¬...");
}
@After(value = "execution(* cn.blinkit.aop.anno.Book.*(..))")
public void after1() {
System.out.println("åç½®å¢å¼º...æ³¨è§£çæ¬...");
}
//ç¯ç»éç¥
@Around(value = "execution(* cn.blinkit.aop.anno.Book.*(..))")
public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//æ¹æ³ä¹å
System.out.println("æ¹æ³ä¹å...æ³¨è§£çæ¬...");
//æ§è¡è¢«å¢å¼ºçæ¹æ³
proceedingJoinPoint.proceed();
//æ¹æ³ä¹å
System.out.println("æ¹æ³ä¹å...æ³¨è§£çæ¬...");
}
}
```
**xmlé
ç½®**
```xml
```
### 3.7 为ä»ä¹éè¦ä»£ç模å¼ï¼
å设éå®ç°ä¸ä¸ªè®¡ç®çç±»Mathã宿å ãåãä¹ãé¤åè½ï¼å¦ä¸æç¤ºï¼
```java
package com.zhangguo.Spring041.aop01;
public class Math {
//å
public int add(int n1,int n2){
int result=n1+n2;
System.out.println(n1+"+"+n2+"="+result);
return result;
}
//å
public int sub(int n1,int n2){
int result=n1-n2;
System.out.println(n1+"-"+n2+"="+result);
return result;
}
//ä¹
public int mut(int n1,int n2){
int result=n1*n2;
System.out.println(n1+"X"+n2+"="+result);
return result;
}
//é¤
public int div(int n1,int n2){
int result=n1/n2;
System.out.println(n1+"/"+n2+"="+result);
return result;
}
}
```
ç°å¨éæ±åçäºååï¼è¦æ±é¡¹ç®ä¸ææçç±»å¨æ§è¡æ¹æ³æ¶è¾åºæ§è¡èæ¶ãæç´æ¥çåæ³æ¯ä¿®æ¹æºä»£ç ï¼å¦ä¸æç¤ºï¼
```java
package com.zhangguo.Spring041.aop01;
import java.util.Random;
public class Math {
//å
public int add(int n1,int n2){
//å¼å§æ¶é´
long start=System.currentTimeMillis();
lazy();
int result=n1+n2;
System.out.println(n1+"+"+n2+"="+result);
Long span= System.currentTimeMillis()-start;
System.out.println("å
±ç¨æ¶ï¼"+span);
return result;
}
//å
public int sub(int n1,int n2){
//å¼å§æ¶é´
long start=System.currentTimeMillis();
lazy();
int result=n1-n2;
System.out.println(n1+"-"+n2+"="+result);
Long span= System.currentTimeMillis()-start;
System.out.println("å
±ç¨æ¶ï¼"+span);
return result;
}
//ä¹
public int mut(int n1,int n2){
//å¼å§æ¶é´
long start=System.currentTimeMillis();
lazy();
int result=n1*n2;
System.out.println(n1+"X"+n2+"="+result);
Long span= System.currentTimeMillis()-start;
System.out.println("å
±ç¨æ¶ï¼"+span);
return result;
}
//é¤
public int div(int n1,int n2){
//å¼å§æ¶é´
long start=System.currentTimeMillis();
lazy();
int result=n1/n2;
System.out.println(n1+"/"+n2+"="+result);
Long span= System.currentTimeMillis()-start;
System.out.println("å
±ç¨æ¶ï¼"+span);
return result;
}
//模æå»¶æ¶
public void lazy()
{
try {
int n=(int)new Random().nextInt(500);
Thread.sleep(n);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
缺ç¹ï¼
1. å·¥ä½éç¹å«å¤§ï¼å¦æé¡¹ç®ä¸æå¤ä¸ªç±»ï¼å¤ä¸ªæ¹æ³ï¼åè¦ä¿®æ¹å¤æ¬¡ã
2. è¿èäºè®¾è®¡ååï¼å¼éååï¼OCPï¼ï¼å¯¹æ©å±å¼æ¾ï¼å¯¹ä¿®æ¹å
³éï¼è为äºå¢å åè½ææ¯ä¸ªæ¹æ³é½ä¿®æ¹äºï¼ä¹ä¸ä¾¿äºç»´æ¤ã
3. è¿èäºè®¾è®¡ååï¼åä¸èè´£ï¼SRPï¼ï¼æ¯ä¸ªæ¹æ³é¤äºè¦å®æèªå·±æ¬èº«çåè½ï¼è¿è¦è®¡ç®èæ¶ãå»¶æ¶ï¼æ¯ä¸ä¸ªæ¹æ³å¼èµ·å®ååçåå å°±æå¤ç§ã
4. è¿èäºè®¾è®¡ååï¼ä¾èµå转ï¼DIPï¼ï¼æ½è±¡ä¸åºè¯¥ä¾èµç»èï¼ä¸¤è
é½åºè¯¥ä¾èµæ½è±¡ãèå¨Testç±»ä¸ï¼Testä¸Math齿¯ç»èã
è§£å³ï¼
- 使ç¨éæä»£çå¯ä»¥è§£å³é¨åé®é¢ï¼è¯·å¾ä¸ç...ï¼
### 3.8 éæä»£ç
 1ãå®ä¹æ½è±¡ä¸»é¢æ¥å£
```java
package com.zhangguo.Spring041.aop02;
/**
* æ¥å£
* æ½è±¡ä¸»é¢
*/
public interface IMath {
//å
int add(int n1, int n2);
//å
int sub(int n1, int n2);
//ä¹
int mut(int n1, int n2);
//é¤
int div(int n1, int n2);
}
```
2ã主é¢ç±»ï¼ç®æ¯ç±»ï¼å®ç°æ½è±¡æ¥å£
```java
package com.zhangguo.Spring041.aop02;
/**
* 被代ççç®æ 对象
*çå®ä¸»é¢
*/
public class Math implements IMath {
//å
public int add(int n1,int n2){
int result=n1+n2;
System.out.println(n1+"+"+n2+"="+result);
return result;
}
//å
public int sub(int n1,int n2){
int result=n1-n2;
System.out.println(n1+"-"+n2+"="+result);
return result;
}
//ä¹
public int mut(int n1,int n2){
int result=n1*n2;
System.out.println(n1+"X"+n2+"="+result);
return result;
}
//é¤
public int div(int n1,int n2){
int result=n1/n2;
System.out.println(n1+"/"+n2+"="+result);
return result;
}
}
```
3ã代çç±»
```java
package com.zhangguo.Spring041.aop02;
import java.util.Random;
/**
* éæä»£çç±»
*/
public class MathProxy implements IMath {
//被代çç对象
IMath math=new Math();
//å
public int add(int n1, int n2) {
//å¼å§æ¶é´
long start=System.currentTimeMillis();
lazy();
int result=math.add(n1, n2);
Long span= System.currentTimeMillis()-start;
System.out.println("å
±ç¨æ¶ï¼"+span);
return result;
}
//åæ³
public int sub(int n1, int n2) {
//å¼å§æ¶é´
long start=System.currentTimeMillis();
lazy();
int result=math.sub(n1, n2);
Long span= System.currentTimeMillis()-start;
System.out.println("å
±ç¨æ¶ï¼"+span);
return result;
}
//ä¹
public int mut(int n1, int n2) {
//å¼å§æ¶é´
long start=System.currentTimeMillis();
lazy();
int result=math.mut(n1, n2);
Long span= System.currentTimeMillis()-start;
System.out.println("å
±ç¨æ¶ï¼"+span);
return result;
}
//é¤
public int div(int n1, int n2) {
//å¼å§æ¶é´
long start=System.currentTimeMillis();
lazy();
int result=math.div(n1, n2);
Long span= System.currentTimeMillis()-start;
System.out.println("å
±ç¨æ¶ï¼"+span);
return result;
}
//模æå»¶æ¶
public void lazy()
{
try {
int n=(int)new Random().nextInt(500);
Thread.sleep(n);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
4ãæµè¯è¿è¡
```java
package com.zhangguo.Spring041.aop02;
public class Test {
IMath math=new MathProxy();
@org.junit.Test
public void test01()
{
int n1=100,n2=5;
math.add(n1, n2);
math.sub(n1, n2);
math.mut(n1, n2);
math.div(n1, n2);
}
}
```
5ãå°ç»
éè¿éæä»£çï¼æ¯å¦å®å
¨è§£å³äºä¸è¿°ç4个é®é¢ï¼
**已解å³ï¼**
- è§£å³äºâå¼éååï¼OCPï¼âçé®é¢ï¼å 为并没æä¿®æ¹Mathç±»ï¼èæ©å±åºäºMathProxyç±»ã
- è§£å³äºâä¾èµå转ï¼DIPï¼âçé®é¢ï¼éè¿å¼å
¥æ¥å£ã
- è§£å³äºâåä¸èè´£ï¼SRPï¼âçé®é¢ï¼Mathç±»ä¸åéè¦å»è®¡ç®èæ¶ä¸å»¶æ¶æä½ï¼ä½ä»æäºæ¹é¢è®²MathProxyè¿æ¯åå¨è¯¥é®é¢ã
**æªè§£å³ï¼**
- 妿项ç®ä¸æå¤ä¸ªç±»ï¼åéè¦ç¼åå¤ä¸ªä»£çç±»ï¼å·¥ä½é大ï¼ä¸å¥½ä¿®æ¹ï¼ä¸å¥½ç»´æ¤ï¼ä¸è½åºå¯¹ååã
妿è¦è§£å³ä¸é¢çé®é¢ï¼å¯ä»¥ä½¿ç¨å¨æä»£çã
### 3.9 卿代çï¼ä½¿ç¨JDKå
ç½®çProxyå®ç°
åªéè¦ä¸ä¸ªä»£çç±»ï¼è䏿¯é对æ¯ä¸ªç±»ç¼å代çç±»ã
å¨ä¸ä¸ä¸ªç¤ºä¾ä¸ä¿®æ¹ä»£çç±»MathProxyå¦ä¸ï¼
```java
package com.zhangguo.Spring041.aop03;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Random;
/**
* 卿代çç±»
*/
public class DynamicProxy implements InvocationHandler {
//被代çç对象
Object targetObject;
/**
* è·å¾è¢«ä»£çåç对象
* @param object 被代çç对象
* @return 代çåç对象
*/
public Object getProxyObject(Object object){
this.targetObject=object;
return Proxy.newProxyInstance(
targetObject.getClass().getClassLoader(), //ç±»å è½½å¨
targetObject.getClass().getInterfaces(), //è·å¾è¢«ä»£çå¯¹è±¡çæææ¥å£
this); //InvocationHandler对象
//loader:ä¸ä¸ªClassLoader对象ï¼å®ä¹äºç±åªä¸ªClassLoader对象æ¥çæä»£ç对象è¿è¡å è½½
//interfaces:ä¸ä¸ªInterfaceå¯¹è±¡çæ°ç»ï¼è¡¨ç¤ºçæ¯æå°è¦ç»æéè¦ä»£çç对象æä¾ä¸ç»ä»ä¹æ¥å£ï¼å¦æææä¾äºä¸ç»æ¥å£ç»å®ï¼é£ä¹è¿ä¸ªä»£ç对象就宣称å®ç°äºè¯¥æ¥å£(夿)ï¼è¿æ ·æå°±è½è°ç¨è¿ç»æ¥å£ä¸çæ¹æ³äº
//h:ä¸ä¸ªInvocationHandler对象ï¼è¡¨ç¤ºçæ¯å½æè¿ä¸ªå¨æä»£ç对象å¨è°ç¨æ¹æ³çæ¶åï¼ä¼å
³èå°åªä¸ä¸ªInvocationHandler对象ä¸ï¼é´æ¥éè¿invokeæ¥æ§è¡
}
/**
* å½ç¨æ·è°ç¨å¯¹è±¡ä¸çæ¯ä¸ªæ¹æ³æ¶é½éè¿ä¸é¢çæ¹æ³æ§è¡ï¼æ¹æ³å¿
须卿¥å£
* proxy 被代çåç对象
* method å°è¦è¢«æ§è¡çæ¹æ³ä¿¡æ¯ï¼åå°ï¼
* args æ§è¡æ¹æ³æ¶éè¦çåæ°
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//被ç»å
¥çå
容ï¼å¼å§æ¶é´
long start=System.currentTimeMillis();
lazy();
//使ç¨åå°å¨ç®æ 对象ä¸è°ç¨æ¹æ³å¹¶ä¼ å
¥åæ°
Object result=method.invoke(targetObject, args);
//被ç»å
¥çå
容ï¼ç»ææ¶é´
Long span= System.currentTimeMillis()-start;
System.out.println("å
±ç¨æ¶ï¼"+span);
return result;
}
//模æå»¶æ¶
public void lazy()
{
try {
int n=(int)new Random().nextInt(500);
Thread.sleep(n);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
æµè¯è¿è¡ï¼
```java
package com.zhangguo.Spring041.aop03;
public class Test {
//å®ä¾åä¸ä¸ªMathProxy代ç对象
//éè¿getProxyObjectæ¹æ³è·å¾è¢«ä»£çåç对象
IMath math=(IMath)new DynamicProxy().getProxyObject(new Math());
@org.junit.Test
public void test01()
{
int n1=100,n2=5;
math.add(n1, n2);
math.sub(n1, n2);
math.mut(n1, n2);
math.div(n1, n2);
}
IMessage message=(IMessage) new DynamicProxy().getProxyObject(new Message());
@org.junit.Test
public void test02()
{
message.message();
}
}
```
å°ç»ï¼
JDKå
ç½®çProxy卿代çå¯ä»¥å¨è¿è¡æ¶å¨æçæåèç ï¼è没å¿
è¦é对æ¯ä¸ªç±»ç¼å代çç±»ãä¸é´ä¸»è¦ä½¿ç¨å°äºä¸ä¸ªæ¥å£InvocationHandlerä¸Proxy.newProxyInstanceéææ¹æ³ï¼åæ°è¯´æå¦ä¸ï¼
使ç¨å
ç½®çProxyå®ç°å¨æä»£çæä¸ä¸ªé®é¢ï¼**被代ççç±»å¿
é¡»å®ç°æ¥å£ï¼æªå®ç°æ¥å£åæ²¡åæ³å®æå¨æä»£çã**
妿项ç®ä¸æäºç±»æ²¡æå®ç°æ¥å£ï¼åä¸åºè¯¥ä¸ºäºå®ç°å¨æä»£çè廿廿½åºä¸äºæ²¡æå®ä¾æä¹çæ¥å£ï¼éè¿cglibå¯ä»¥è§£å³è¯¥é®é¢ã
### 3.10 卿代çï¼ä½¿ç¨cglibå®ç°
CGLIB(Code Generation Library)æ¯ä¸ä¸ªå¼æºé¡¹ç®,æ¯ä¸ä¸ªå¼ºå¤§çï¼é«æ§è½ï¼é«è´¨éçCodeçæç±»åºï¼å®å¯ä»¥å¨è¿è¡ææ©å±Javaç±»ä¸å®ç°Javaæ¥å£ï¼éä¿è¯´cglibå¯ä»¥å¨è¿è¡æ¶å¨æçæåèç ã
1ãå¼ç¨cglibï¼éè¿maven
2ã使ç¨cglib宿卿代çï¼å¤§æ¦çåçæ¯ï¼cglibç»§æ¿è¢«ä»£ççç±»ï¼éåæ¹æ³ï¼ç»å
¥éç¥ï¼å¨æçæåèç å¹¶è¿è¡ï¼å 为æ¯ç»§æ¿æä»¥finalç±»æ¯æ²¡æåæ³å¨æä»£ççãå
·ä½å®ç°å¦ä¸ï¼
```java
package com.zhangguo.Spring041.aop04;
import java.lang.reflect.Method;
import java.util.Random;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/*
* 卿代çç±»
* å®ç°äºä¸ä¸ªæ¹æ³æ¦æªå¨æ¥å£
*/
public class DynamicProxy implements MethodInterceptor {
// 被代ç对象
Object targetObject;
//Generate a new class if necessary and uses the specified callbacks (if any) to create a new object instance.
//Uses the no-arg constructor of the superclass.
//卿çæä¸ä¸ªæ°çç±»ï¼ä½¿ç¨ç¶ç±»çæ åæé æ¹æ³å建ä¸ä¸ªæå®äºç¹å®åè°ç代çå®ä¾
public Object getProxyObject(Object object) {
this.targetObject = object;
//å¢å¼ºå¨ï¼å¨æä»£ç çæå¨
Enhancer enhancer=new Enhancer();
//åè°æ¹æ³
enhancer.setCallback(this);
//设置çæç±»çç¶ç±»ç±»å
enhancer.setSuperclass(targetObject.getClass());
//卿çæåèç å¹¶è¿å代ç对象
return enhancer.create();
}
// æ¦æªæ¹æ³
public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
// 被ç»å
¥ç横åå
容ï¼å¼å§æ¶é´ before
long start = System.currentTimeMillis();
lazy();
// è°ç¨æ¹æ³
Object result = methodProxy.invoke(targetObject, args);
// 被ç»å
¥ç横åå
容ï¼ç»ææ¶é´
Long span = System.currentTimeMillis() - start;
System.out.println("å
±ç¨æ¶ï¼" + span);
return result;
}
// 模æå»¶æ¶
public void lazy() {
try {
int n = (int) new Random().nextInt(500);
Thread.sleep(n);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
æµè¯è¿è¡ï¼
```java
package com.zhangguo.Spring041.aop04;
public class Test {
//å®ä¾åä¸ä¸ªDynamicProxy代ç对象
//éè¿getProxyObjectæ¹æ³è·å¾è¢«ä»£çåç对象
Math math=(Math)new DynamicProxy().getProxyObject(new Math());
@org.junit.Test
public void test01()
{
int n1=100,n2=5;
math.add(n1, n2);
math.sub(n1, n2);
math.mut(n1, n2);
math.div(n1, n2);
}
//å¦ä¸ä¸ªè¢«ä»£çç对象,ä¸åéè¦éæ°ç¼è¾ä»£ç代ç
Message message=(Message) new DynamicProxy().getProxyObject(new Message());
@org.junit.Test
public void test02()
{
message.message();
}
}
```
**å°ç»**
使ç¨cglibå¯ä»¥å®ç°å¨æä»£çï¼å³ä½¿è¢«ä»£çç类没æå®ç°æ¥å£ï¼ä½è¢«ä»£ççç±»å¿
须䏿¯finalç±»ã
## 4. Spring Ioc容å¨
### 4.1 Beanä½ç¨å
Spring æ¡æ¶æ¯æä»¥ä¸äºä¸ªä½ç¨åï¼å¦æä½ ä½¿ç¨ web-aware ApplicationContext æ¶ï¼å
¶ä¸ä¸ä¸ªæ¯å¯ç¨çã
| ä½ç¨å | æè¿° |
| -------------- | ------------------------------------------------------------ |
| singleton | å¨spring IoC容å¨ä»
åå¨ä¸ä¸ªBeanå®ä¾ï¼Bean以å便¹å¼åå¨ï¼é»è®¤å¼ |
| prototype | æ¯æ¬¡ä»å®¹å¨ä¸è°ç¨Beanæ¶ï¼é½è¿åä¸ä¸ªæ°çå®ä¾ï¼å³æ¯æ¬¡è°ç¨getBean()æ¶ï¼ç¸å½äºæ§è¡newXxxBean() |
| request | æ¯æ¬¡HTTP请æ±é½ä¼å建ä¸ä¸ªæ°çBeanï¼è¯¥ä½ç¨åä»
éç¨äºWebApplicationContextç¯å¢ |
| session | åä¸ä¸ªHTTP Sessionå
±äº«ä¸ä¸ªBeanï¼ä¸åSession使ç¨ä¸åçBeanï¼ä»
éç¨äºWebApplicationContextç¯å¢ |
| global-session | ä¸è¬ç¨äºPortletåºç¨ç¯å¢ï¼æ¹ä½ç¨äºä»
éç¨äºWebApplicationContextç¯å¢ |
### 4.2 Bean ççå½å¨æ
å¨ä¼ ç»çJavaåºç¨ä¸ï¼beanççå½å¨æå¾ç®åã使ç¨Javaå
³é®ånewè¿è¡beanå®ä¾åï¼ç¶å该beanå°±å¯ä»¥ä½¿ç¨äºã䏿¦è¯¥beanä¸å被使ç¨ï¼åç±Javaèªå¨è¿è¡åå¾åæ¶ã
ç¸æ¯ä¹ä¸ï¼Spring容å¨ä¸çbeanççå½å¨æå°±æ¾å¾ç¸å¯¹å¤æå¤äºãæ£ç¡®çè§£Spring beanççå½å¨æé常éè¦ï¼å ä¸ºä½ æè®¸è¦å©ç¨Springæä¾çæ©å±ç¹æ¥èªå®ä¹beançå建è¿ç¨ãä¸å¾å±ç¤ºäºbeanè£
è½½å°Springåºç¨ä¸ä¸æä¸çä¸ä¸ªå
¸åççå½å¨æè¿ç¨ã
ä¸å¾beanå¨Spring容å¨ä¸ä»å建å°éæ¯ç»åäºè¥å¹²é¶æ®µï¼æ¯ä¸é¶æ®µé½å¯ä»¥é对Springå¦ä½ç®¡çbeanè¿è¡ä¸ªæ§åå®å¶
**æ£å¦ä½ æè§ï¼å¨beanåå¤å°±ç»ªä¹åï¼bean工忧è¡äºè¥å¹²å¯å¨æ¥éª¤ãæä»¬å¯¹ä¸å¾è¿è¡è¯¦ç»æè¿°ï¼**
1. Spring 对 Bean è¿è¡å®ä¾åï¼
- ç¸å½äºç¨åºä¸çnew Xx()
2. Spring å°å¼å Bean çå¼ç¨æ³¨å
¥è¿ Bean 对åºç屿§ä¸ï¼
3. **妿Beanå®ç°äº BeanNameAware æ¥å£**ï¼Spring å° Bean ç ID ä¼ éç»setBeanName()æ¹æ³
- å®ç°BeanNameAwareæ¸
ä¸»è¦æ¯ä¸ºäºéè¿Beançå¼ç¨æ¥è·å¾BeançIDï¼ä¸è¬ä¸å¡ä¸æ¯å¾å°æå¨BeançIDç
4. **妿Beanå®ç°äºBeanFactoryAwareæ¥å£**ï¼Springå°è°ç¨setBeanDactory(BeanFactory bf)æ¹æ³å¹¶æBeanFactory容å¨å®ä¾ä½ä¸ºåæ°ä¼ å
¥ã
- å®ç°BeanFactoryAware 主è¦ç®çæ¯ä¸ºäºè·åSpring容å¨ï¼å¦Beanéè¿Spring容å¨åå¸äºä»¶ç
5. **妿Beanå®ç°äºApplicationContextAwaeræ¥å£**ï¼Spring容å¨å°è°ç¨setApplicationContext(ApplicationContext ctx)æ¹æ³ï¼å°beanæå¨çåºç¨ä¸ä¸æçå¼ç¨ä¼ å
¥è¿æ¥
- ä½ç¨ä¸BeanFactoryç±»ä¼¼é½æ¯ä¸ºäºè·åSpring容å¨ï¼ä¸åçæ¯Spring容å¨å¨è°ç¨setApplicationContextæ¹æ³æ¶ä¼æå®èªå·±ä½ä¸ºsetApplicationContext çåæ°ä¼ å
¥ï¼èSpring容å¨å¨è°ç¨setBeanDactoryåéè¦ç¨åºåèªå·±æå®ï¼æ³¨å
¥ï¼setBeanDactoryéçåæ°BeanFactory
6. **妿Beanå®ç°äºBeanPostProcessæ¥å£**ï¼Springå°è°ç¨å®ä»¬çpostProcessBeforeInitializationï¼é¢åå§åï¼æ¹æ³
- ä½ç¨æ¯å¨Beanå®ä¾å建æåå对è¿è¡å¢å¼ºå¤çï¼å¦å¯¹Beanè¿è¡ä¿®æ¹ï¼å¢å æä¸ªåè½
7. **妿Beanå®ç°äºInitializingBeanæ¥å£**ï¼Springå°è°ç¨å®ä»¬çafterPropertiesSetæ¹æ³ï¼ä½ç¨ä¸å¨é
ç½®æä»¶ä¸å¯¹Bean使ç¨init-method声æåå§åçä½ç¨ä¸æ ·ï¼é½æ¯å¨Beançå
¨é¨å±æ§è®¾ç½®æååæ§è¡çåå§åæ¹æ³ã
8. **妿Beanå®ç°äºBeanPostProcessæ¥å£**ï¼Springå°è°ç¨å®ä»¬çpostProcessAfterInitializationï¼ååå§åï¼æ¹æ³
- ä½ç¨ä¸6ç䏿 ·ï¼åªä¸è¿6æ¯å¨Beanåå§ååæ§è¡çï¼èè¿ä¸ªæ¯å¨Beanåå§ååæ§è¡çï¼æ¶æºä¸å
9. ç»è¿ä»¥ä¸çå·¥ä½åï¼Beanå°ä¸ç´é©»çå¨åºç¨ä¸ä¸æä¸ç»åºç¨ä½¿ç¨ï¼ç´å°åºç¨ä¸ä¸æè¢«éæ¯
10. **妿Beanå®ç°äºDispostbleBeanæ¥å£**ï¼Springå°è°ç¨å®çdestoryæ¹æ³ï¼ä½ç¨ä¸å¨é
ç½®æä»¶ä¸å¯¹Bean使ç¨destory-method屿§çä½ç¨ä¸æ ·ï¼é½æ¯å¨Beanå®ä¾éæ¯åæ§è¡çæ¹æ³ã
### 4.3 BeanFactory åApplicationContextï¼Beanå·¥åååºç¨ä¸ä¸æï¼
Bean å·¥åï¼com.springframework.beans.factory.BeanFactoryï¼æ¯Spring æ¡æ¶ææ ¸å¿çæ¥å£ï¼å®æä¾äºé«çº§IoC çé
ç½®æºå¶ã
åºç¨ä¸ä¸æï¼com.springframework.context.ApplicationContextï¼å»ºç«å¨BeanFactory åºç¡ä¹ä¸ã
å 乿æçåºç¨åºåæä»¬é½ç´æ¥ä½¿ç¨ApplicationContext èéåºå±çBeanFactoryã
ApplicationContext çåå§ååBeanFactoryæä¸ä¸ªé大çåºå«ï¼
- BeanFactoryå¨åå§å容卿¶ï¼å¹¶æªå®ä¾åBeanï¼ç´å°ç¬¬ä¸æ¬¡è®¿é®æä¸ªBean æ¶æå®ä¾ç®æ Beanï¼
- èApplicationContext åå¨åå§ååºç¨ä¸ä¸ææ¶å°±å®ä¾åææåå®ä¾çBean ã
```xml
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/baobaotao/context/beans.xml");
ApplicationContext ctx = new FileSystemXmlApplicationContext("com/baobaotao/context/beans.xml");
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"conf/beans1.xml","conf/beans2.xml"});
```
åèèµæï¼
- [BeanFactory åApplicationContextï¼Beanå·¥åååºç¨ä¸ä¸æï¼ - åäºç½ç»](http://www.pinhuba.com/spring/101250.htm)