![Java-EE-SpringMVC與MyBatis企業(yè)開(kāi)發(fā)實(shí)戰(zhàn)-5--Spring-IoC和AOP課件_第1頁(yè)](http://file4.renrendoc.com/view/18093cf53f89d28b230ef406404db971/18093cf53f89d28b230ef406404db9711.gif)
![Java-EE-SpringMVC與MyBatis企業(yè)開(kāi)發(fā)實(shí)戰(zhàn)-5--Spring-IoC和AOP課件_第2頁(yè)](http://file4.renrendoc.com/view/18093cf53f89d28b230ef406404db971/18093cf53f89d28b230ef406404db9712.gif)
![Java-EE-SpringMVC與MyBatis企業(yè)開(kāi)發(fā)實(shí)戰(zhàn)-5--Spring-IoC和AOP課件_第3頁(yè)](http://file4.renrendoc.com/view/18093cf53f89d28b230ef406404db971/18093cf53f89d28b230ef406404db9713.gif)
![Java-EE-SpringMVC與MyBatis企業(yè)開(kāi)發(fā)實(shí)戰(zhàn)-5--Spring-IoC和AOP課件_第4頁(yè)](http://file4.renrendoc.com/view/18093cf53f89d28b230ef406404db971/18093cf53f89d28b230ef406404db9714.gif)
![Java-EE-SpringMVC與MyBatis企業(yè)開(kāi)發(fā)實(shí)戰(zhàn)-5--Spring-IoC和AOP課件_第5頁(yè)](http://file4.renrendoc.com/view/18093cf53f89d28b230ef406404db971/18093cf53f89d28b230ef406404db9715.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第五章 Spring框架(IoC和AOP)SpringMVC與MyBatis企業(yè)開(kāi)發(fā)實(shí)戰(zhàn)Spring框架的組成IoC (Inversion of Control控制反轉(zhuǎn))在Java代碼中就需要用到Spring的容器來(lái)管理所有的JavaBean類(lèi),把這種主動(dòng)的依賴(lài)關(guān)系變成被動(dòng)的依賴(lài)注入。也就是我們不主動(dòng)實(shí)例化對(duì)象,你將看不到類(lèi)似于new Engine()這樣的代碼,而是通過(guò)Spring容器來(lái)管理類(lèi)的實(shí)例化以及類(lèi)與類(lèi)之間的關(guān)系。當(dāng)我們需要某個(gè)對(duì)象(Engine或Tire)的時(shí)候,由Spring容器來(lái)實(shí)例化需要的對(duì)象。所有的這些實(shí)例化好的對(duì)象共同存在Spring容器中,當(dāng)我們的主動(dòng)請(qǐng)求方(Car)需
2、要Engine或Tire對(duì)象的時(shí)候,由Spring容器把實(shí)例化好的Engine和Tire對(duì)象注入到Car中,這個(gè)就叫依賴(lài)注入。而原來(lái)主動(dòng)創(chuàng)建對(duì)象的方式則變成了被動(dòng)注入對(duì)象的方式,原來(lái)的主從關(guān)系也就發(fā)生了反轉(zhuǎn),我們稱(chēng)之為控制反轉(zhuǎn)(Inversion of Control,英文縮寫(xiě)為IoC),所以Spring容器也是一個(gè)IoC容器。案例講解案例代碼通過(guò)set方法注入engine和tire對(duì)象/*汽車(chē)類(lèi) */public class Car private Engine engine;/ 發(fā)動(dòng)機(jī)類(lèi)private Tire tire;/輪胎類(lèi)/添加set方法用于注入public void setEng
3、ine(Engine engine) this.engine = engine;public void setTire(Tire tire) this.tire = tire;/*汽車(chē)發(fā)動(dòng)的方法 */public void run() engine.fire(); / 調(diào)用發(fā)動(dòng)機(jī)類(lèi)的點(diǎn)火方法tire.roll();/ 調(diào)用輪胎的滾動(dòng)方法System.out.println(3.汽車(chē)開(kāi)動(dòng));/ 汽車(chē)開(kāi)動(dòng)package org.newboy.test;import org.newboy.bean.Car;import org.springframework.context.ApplicationC
4、ontext;import org.springframework.context.support.ClassPathXmlApplicationContext;/* 汽車(chē)的測(cè)試類(lèi) */public class TestCar public static void main(String args) /* 創(chuàng)建Spring的上下文,相當(dāng)于得到Spring的容器 * ApplicationContext是個(gè)接口,ClassPathXmlApplicationContext是實(shí)現(xiàn)類(lèi), * 所帶的參數(shù)applicationContext.xml是配置文件名 */ApplicationContext
5、context = new ClassPathXmlApplicationContext(applicationContext.xml);/* getBean(car)相當(dāng)于從Spring容器中取出id=car的對(duì)象 * 這個(gè)方法返回的是Object對(duì)象,所以強(qiáng)轉(zhuǎn)成Car對(duì)象 */Car car = (Car) context.getBean(car);/ 調(diào)用car的run()方法car.run();package org.newboy.bean;/* 發(fā)動(dòng)機(jī)的接口 */public interface Engine /* 發(fā)動(dòng)機(jī)點(diǎn)火的方法 */public void fire();pack
6、age org.newboy.bean;/* 輪胎類(lèi) */public interface Tire /* 輪胎轉(zhuǎn)動(dòng)的方法 */public void roll();package org.newboy.bean.impl;import org.newboy.bean.Engine;/*自動(dòng)發(fā)動(dòng)機(jī)的實(shí)現(xiàn)類(lèi) */public class AutoEngineImpl implements Engine /* 實(shí)現(xiàn)發(fā)動(dòng)機(jī)點(diǎn)火的方法 */public void fire() System.out.println(1.自動(dòng)檔發(fā)動(dòng)點(diǎn)火);案例代碼package org.newboy.bean.impl;
7、import org.newboy.bean.Engine;/*手動(dòng)發(fā)動(dòng)機(jī)類(lèi) */public class ManualEngineImpl implements Engine /* 手動(dòng)發(fā)動(dòng)機(jī)點(diǎn)火的方法 */public void fire() System.out.println(1.手動(dòng)檔發(fā)動(dòng)點(diǎn)火);package org.newboy.bean.impl;import org.newboy.bean.Tire;/* 15寸輪胎實(shí)現(xiàn)類(lèi) */public class TireR15Impl implements Tire /* 輪胎轉(zhuǎn)動(dòng)的方法 */public void roll() Sy
8、stem.out.println(2.半徑為15的輪胎滾動(dòng));/*汽車(chē)類(lèi) */public class Car private Engine engine;/ 發(fā)動(dòng)機(jī)接口private Tire tire;/輪胎接口public void setEngine(Engine engine) this.engine = engine;public void setTire(Tire tire) this.tire = tire;/*汽車(chē)發(fā)動(dòng)的方法 */public void run() engine.fire(); / 調(diào)用發(fā)動(dòng)機(jī)類(lèi)的點(diǎn)火方法tire.roll();/ 調(diào)用輪胎的滾動(dòng)方法Syste
9、m.out.println(3.汽車(chē)開(kāi)動(dòng));/ 汽車(chē)開(kāi)動(dòng)代碼import org.newboy.bean.Car;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/* 汽車(chē)的測(cè)試類(lèi) */public class TestCar public static void main(String args) ApplicationContext context = new ClassPathXml
10、ApplicationContext(applicationContext.xml);/分別得到自動(dòng)和手動(dòng)汽車(chē)Car autoCar = (Car) context.getBean(autoCar);Car manualCar = (Car) context.getBean(manualCar);/ 調(diào)用car的run()方法autoCar.run();System.out.println();manualCar.run();使用p命名空間注入屬性代碼自動(dòng)注入通過(guò)上面的applicationContext.xml配置文件會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,當(dāng)一個(gè)類(lèi)需要注入的屬性特別多的時(shí)候,就需要寫(xiě)大量的注入代碼
11、。如果一個(gè)項(xiàng)目中的類(lèi)比較多,尤其是大量項(xiàng)目,有大量的類(lèi)需要配置和屬性需要注入的時(shí)候,就會(huì)導(dǎo)致applicationContext.xml配置文件臃腫。所以Spring提供了自動(dòng)注入的方式減少XML配置文件的工作量。代碼構(gòu)造器注入/ 默認(rèn)構(gòu)造方法public Car() super();/ 帶全部參數(shù)的構(gòu)造方法public Car(Engine engine, Tire tire) this();this.engine = engine;this.tire = tire;Bean的作用域Bean的作用域含義singleton默認(rèn)的作用域,僅為每個(gè)Bean對(duì)象創(chuàng)建一個(gè)實(shí)例。prototype可以根
12、據(jù)需要為每個(gè)Bean對(duì)象創(chuàng)建多個(gè)實(shí)例。request為每個(gè)HTTP請(qǐng)求創(chuàng)建它自有的一個(gè)Bean實(shí)例,僅在Web相關(guān)的ApplicationContext中生效。session為每個(gè)HTTP會(huì)話創(chuàng)建一個(gè)實(shí)例,僅在Web相關(guān)的ApplicationContext中生效。global session為每個(gè)全局的HTTP會(huì)話創(chuàng)建一個(gè)實(shí)例。一般僅在porlet上下文中使用生效,同時(shí)僅在Web相關(guān)的ApplicationContext中生效。application為每個(gè)ServletContext創(chuàng)建一個(gè)實(shí)例。僅在Web相關(guān)的ApplicationContext中生效。AOP(Aspect Oriente
13、d Programming面向切面編程)AOP 的實(shí)現(xiàn)原理其實(shí)就是使用代理模式,由 AOP 框架動(dòng)態(tài)生成的一個(gè)代理對(duì)象,該對(duì)象可作為代替目標(biāo)對(duì)象使用。AOP 代理包含了目標(biāo)對(duì)象的全部方法,但 AOP 代理中的方法與目標(biāo)對(duì)象的方法存在差異,AOP 方法在特定切入點(diǎn)添加了增強(qiáng)處理,并回調(diào)了目標(biāo)對(duì)象的方法。Spring 中 AOP 代理由 Spring 的 IoC 容器負(fù)責(zé)生成、管理,其依賴(lài)關(guān)系也由 IoC 容器負(fù)責(zé)管理。因此,AOP 代理可以直接使用容器中的其他 Bean 實(shí)例作為目標(biāo),這種關(guān)系可由 IoC 容器的依賴(lài)注入提供。使用注解實(shí)現(xiàn)AOPAspectJ是一個(gè)面向切面的框架,它擴(kuò)展了Java
14、語(yǔ)言,定義了AOP 語(yǔ)法,能夠在編譯期提供代碼的織入。Spring通過(guò)集成AspectJ實(shí)現(xiàn)了以注解的方式定義增強(qiáng)類(lèi),大大減少了配置文件中的工作量。案例代碼package org.newboy.entity;/* * 用戶(hù)實(shí)體類(lèi)對(duì)象 */public class User private int id; / 主鍵private String name; / 用戶(hù)名private String password; / 密碼public User(int id, String name, String password) /帶全參的構(gòu)造方法super();this.id = id; = name;
15、this.password = password;public User() /默認(rèn)無(wú)參構(gòu)造方法super();/getter和setter方法省略package org.newboy.dao;import org.newboy.entity.User;/* * 用戶(hù)DAO的接口 */public interface UserDao /* * 通過(guò)名字和密碼查詢(xún)用戶(hù) */public User findUser(String name,String password);package org.newboy.dao.impl;import org.newboy.dao.UserDao;impor
16、t org.newboy.entity.User;/* * 用戶(hù)DAO的實(shí)現(xiàn)類(lèi) */public class UserDaoImpl implements UserDao Overridepublic User findUser(String name, String password) if (張三.equals(name) & 123.equals(password) / 假設(shè)從數(shù)據(jù)庫(kù)中查出return new User(1000, 張三, 123); else return null;package ;import org.newboy.entity.User;/* * 用戶(hù)的業(yè)務(wù)接口
17、*/public interface UserBiz /* * 登錄的方法 * param name 用戶(hù)名 * param password 密碼 * return 登錄成功返回User對(duì)象,登錄失敗返回null */public User login(String name,String password);package .impl;import java.util.Random;import .UserBiz;import org.newboy.dao.UserDao;import org.newboy.entity.User;/* * 用戶(hù)業(yè)務(wù)類(lèi)的實(shí)現(xiàn)*/public class U
18、serBizImpl implements UserBiz private UserDao userDao;/依賴(lài)于userDao對(duì)象/通過(guò)set方法注入public void setUserDao(UserDao userDao) this.userDao = userDao;Overridepublic User login(String name, String password) try /這里隨機(jī)產(chǎn)生1個(gè)4秒以?xún)?nèi)的暫停,模擬現(xiàn)實(shí)中的登錄操作Thread.sleep(new Random().nextInt(4000);System.out.println(業(yè)務(wù)方法login運(yùn)行,正在
19、登錄.); catch (InterruptedException e) e.printStackTrace();return userDao.findUser(name, password);代碼/* 需要織入的日志切面類(lèi) */Aspect public class LoggerAdvice /log4j日志類(lèi)Logger logger = Logger.getLogger(LoggerAdvice.class);/ 后置增強(qiáng)AfterReturning(pointcut = execution(* .*.*(.), returning = ret)public void afterRetu
20、rning(JoinPoint join, Object ret) String method = join.getSignature().getName();Object args = join.getArgs();if (login.equals(method) if (ret != null) (new Timestamp(System.currentTimeMillis() + + args0 + 登錄成功); else (new Timestamp(System.currentTimeMillis() + + args0 + 登錄失敗);/ 前置增強(qiáng)Before(value=exec
21、ution(* .*.*(.)public void methodBefore(JoinPoint join) String method = join.getSignature().getName();Object args = join.getArgs();if (login.equals(method) (new Timestamp(System.currentTimeMillis() + + args0 + 開(kāi)始登錄);public class Test public static void main(String args) ApplicationContext ctx = new
22、ClassPathXmlApplicationContext(applicationContext.xml);/得到業(yè)務(wù)類(lèi)UserBiz userBiz = (UserBiz) ctx.getBean(userBiz);/運(yùn)行業(yè)務(wù)登錄方法userBiz.login(張三, 123);Spring注解管理IoCComponent:通用注解,可以用在任何一個(gè)類(lèi)上,表示該類(lèi)定義為Spring管理Bean,使用默認(rèn)value(可選)屬性表示Bean標(biāo)識(shí)符。Repository:用于標(biāo)注DAO類(lèi),使用方法與Component相同。Service:用于標(biāo)注業(yè)務(wù)類(lèi),使用方法與Component相同。Cont
23、roller:用于標(biāo)注控制器類(lèi),使用方法與Component相同。Autowired:注解實(shí)現(xiàn)Bean的自動(dòng)注入,默認(rèn)按類(lèi)型進(jìn)行匹配。這個(gè)注解是Spring提供的。Resource的作用相當(dāng)于Autowired,只不過(guò)Autowired按byType自動(dòng)注入,而Resource默認(rèn)按byName自動(dòng)注入,這個(gè)注解是由Java JDK自帶的。Qualifier:按指定名稱(chēng)匹配進(jìn)行注入。Scope注解指定Bean的作用域。案例代碼/* * 用戶(hù)業(yè)務(wù)類(lèi)的實(shí)現(xiàn) */Service(userBiz)public class UserBizImpl implements UserBiz Autowired
24、private UserDao userDao; / 這次連set方法都沒(méi)有Overridepublic User login(String name, String password) try / 這里隨機(jī)產(chǎn)生1個(gè)4秒以?xún)?nèi)的暫停,模擬現(xiàn)實(shí)中的登錄操作Thread.sleep(new Random().nextInt(4000);System.out.println(業(yè)務(wù)方法login運(yùn)行,正在登錄.); catch (InterruptedException e) e.printStackTrace();return userDao.findUser(name, password);Repository(userDao)public class UserDaoImpl implements UserDao Overridepublic User findUser(String name, String password) if (張三.equals(name) & 123.equals(password) / 假設(shè)從數(shù)據(jù)庫(kù)中查出return new User(1
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- LY/T 3418-2024林草電子公文處理流程及系統(tǒng)運(yùn)行管理規(guī)范
- 四年級(jí)數(shù)學(xué)上聽(tīng)評(píng)課記錄
- 湘教版數(shù)學(xué)七年級(jí)下冊(cè)3.2《提多項(xiàng)式公因式》聽(tīng)評(píng)課記錄
- 生活保障信托協(xié)議書(shū)(2篇)
- 環(huán)保工程承包協(xié)議書(shū)
- 新版湘教版秋八年級(jí)數(shù)學(xué)上冊(cè)第三章實(shí)數(shù)課題實(shí)數(shù)的運(yùn)算和大小比較聽(tīng)評(píng)課記錄
- 人教部編版七年級(jí)道德與法治上冊(cè):6.2《師生交往》聽(tīng)課評(píng)課記錄1
- 湘教版數(shù)學(xué)七年級(jí)下冊(cè)《4.2 平移》聽(tīng)評(píng)課記錄
- 浙教版數(shù)學(xué)七年級(jí)下冊(cè)《閱讀材料 楊輝三角與兩數(shù)和的乘方》聽(tīng)評(píng)課記錄2
- 新北師大版小學(xué)數(shù)學(xué)一年級(jí)上冊(cè)《教室》聽(tīng)評(píng)課記錄
- 開(kāi)展課外讀物負(fù)面清單管理的具體實(shí)施舉措方案
- 中國(guó)律師學(xué)完整版課件全套教學(xué)ppt教程
- 守紀(jì)律講衛(wèi)生懂禮儀
- 腦控受害者解救方法
- 全國(guó)“創(chuàng)新杯”說(shuō)課大賽計(jì)算機(jī)應(yīng)用基礎(chǔ)類(lèi)優(yōu)秀作品-:處理數(shù)據(jù)說(shuō)課課件(35頁(yè)P(yáng)PT)
- 滁州市城市規(guī)劃管理技術(shù)規(guī)定
- 保理業(yè)務(wù)解決方案
- 圖紙會(huì)審答疑
- PCCP安裝與水壓試驗(yàn)
- 招標(biāo)工作手冊(cè)
- 信訪事項(xiàng)聽(tīng)證程序流程圖
評(píng)論
0/150
提交評(píng)論