Java-EE-SpringMVC與MyBatis企業(yè)開(kāi)發(fā)實(shí)戰(zhàn)-5--Spring-IoC和AOP課件_第1頁(yè)
Java-EE-SpringMVC與MyBatis企業(yè)開(kāi)發(fā)實(shí)戰(zhàn)-5--Spring-IoC和AOP課件_第2頁(yè)
Java-EE-SpringMVC與MyBatis企業(yè)開(kāi)發(fā)實(shí)戰(zhàn)-5--Spring-IoC和AOP課件_第3頁(yè)
Java-EE-SpringMVC與MyBatis企業(yè)開(kāi)發(fā)實(shí)戰(zhàn)-5--Spring-IoC和AOP課件_第4頁(yè)
Java-EE-SpringMVC與MyBatis企業(yè)開(kāi)發(fā)實(shí)戰(zhàn)-5--Spring-IoC和AOP課件_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論