版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第五章 Spring框架(IoC和AOP)SpringMVC與MyBatis企業(yè)開發(fā)實戰(zhàn)Spring框架的組成IoC (Inversion of Control控制反轉(zhuǎn))在Java代碼中就需要用到Spring的容器來管理所有的JavaBean類,把這種主動的依賴關(guān)系變成被動的依賴注入。也就是我們不主動實例化對象,你將看不到類似于new Engine()這樣的代碼,而是通過Spring容器來管理類的實例化以及類與類之間的關(guān)系。當我們需要某個對象(Engine或Tire)的時候,由Spring容器來實例化需要的對象。所有的這些實例化好的對象共同存在Spring容器中,當我們的主動請求方(Car)需
2、要Engine或Tire對象的時候,由Spring容器把實例化好的Engine和Tire對象注入到Car中,這個就叫依賴注入。而原來主動創(chuàng)建對象的方式則變成了被動注入對象的方式,原來的主從關(guān)系也就發(fā)生了反轉(zhuǎn),我們稱之為控制反轉(zhuǎn)(Inversion of Control,英文縮寫為IoC),所以Spring容器也是一個IoC容器。案例講解案例代碼通過set方法注入engine和tire對象/*汽車類 */public class Car private Engine engine;/ 發(fā)動機類private Tire tire;/輪胎類/添加set方法用于注入public void setEng
3、ine(Engine engine) this.engine = engine;public void setTire(Tire tire) this.tire = tire;/*汽車發(fā)動的方法 */public void run() engine.fire(); / 調(diào)用發(fā)動機類的點火方法tire.roll();/ 調(diào)用輪胎的滾動方法System.out.println(3.汽車開動);/ 汽車開動package org.newboy.test;import org.newboy.bean.Car;import org.springframework.context.ApplicationC
4、ontext;import org.springframework.context.support.ClassPathXmlApplicationContext;/* 汽車的測試類 */public class TestCar public static void main(String args) /* 創(chuàng)建Spring的上下文,相當于得到Spring的容器 * ApplicationContext是個接口,ClassPathXmlApplicationContext是實現(xiàn)類, * 所帶的參數(shù)applicationContext.xml是配置文件名 */ApplicationContext
5、context = new ClassPathXmlApplicationContext(applicationContext.xml);/* getBean(car)相當于從Spring容器中取出id=car的對象 * 這個方法返回的是Object對象,所以強轉(zhuǎn)成Car對象 */Car car = (Car) context.getBean(car);/ 調(diào)用car的run()方法car.run();package org.newboy.bean;/* 發(fā)動機的接口 */public interface Engine /* 發(fā)動機點火的方法 */public void fire();pack
6、age org.newboy.bean;/* 輪胎類 */public interface Tire /* 輪胎轉(zhuǎn)動的方法 */public void roll();package org.newboy.bean.impl;import org.newboy.bean.Engine;/*自動發(fā)動機的實現(xiàn)類 */public class AutoEngineImpl implements Engine /* 實現(xiàn)發(fā)動機點火的方法 */public void fire() System.out.println(1.自動檔發(fā)動點火);案例代碼package org.newboy.bean.impl;
7、import org.newboy.bean.Engine;/*手動發(fā)動機類 */public class ManualEngineImpl implements Engine /* 手動發(fā)動機點火的方法 */public void fire() System.out.println(1.手動檔發(fā)動點火);package org.newboy.bean.impl;import org.newboy.bean.Tire;/* 15寸輪胎實現(xiàn)類 */public class TireR15Impl implements Tire /* 輪胎轉(zhuǎn)動的方法 */public void roll() Sy
8、stem.out.println(2.半徑為15的輪胎滾動);/*汽車類 */public class Car private Engine engine;/ 發(fā)動機接口private Tire tire;/輪胎接口public void setEngine(Engine engine) this.engine = engine;public void setTire(Tire tire) this.tire = tire;/*汽車發(fā)動的方法 */public void run() engine.fire(); / 調(diào)用發(fā)動機類的點火方法tire.roll();/ 調(diào)用輪胎的滾動方法Syste
9、m.out.println(3.汽車開動);/ 汽車開動代碼import org.newboy.bean.Car;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/* 汽車的測試類 */public class TestCar public static void main(String args) ApplicationContext context = new ClassPathXml
10、ApplicationContext(applicationContext.xml);/分別得到自動和手動汽車Car autoCar = (Car) context.getBean(autoCar);Car manualCar = (Car) context.getBean(manualCar);/ 調(diào)用car的run()方法autoCar.run();System.out.println();manualCar.run();使用p命名空間注入屬性代碼自動注入通過上面的applicationContext.xml配置文件會發(fā)現(xiàn)一個問題,當一個類需要注入的屬性特別多的時候,就需要寫大量的注入代碼
11、。如果一個項目中的類比較多,尤其是大量項目,有大量的類需要配置和屬性需要注入的時候,就會導致applicationContext.xml配置文件臃腫。所以Spring提供了自動注入的方式減少XML配置文件的工作量。代碼構(gòu)造器注入/ 默認構(gòu)造方法public Car() super();/ 帶全部參數(shù)的構(gòu)造方法public Car(Engine engine, Tire tire) this();this.engine = engine;this.tire = tire;Bean的作用域Bean的作用域含義singleton默認的作用域,僅為每個Bean對象創(chuàng)建一個實例。prototype可以根
12、據(jù)需要為每個Bean對象創(chuàng)建多個實例。request為每個HTTP請求創(chuàng)建它自有的一個Bean實例,僅在Web相關(guān)的ApplicationContext中生效。session為每個HTTP會話創(chuàng)建一個實例,僅在Web相關(guān)的ApplicationContext中生效。global session為每個全局的HTTP會話創(chuàng)建一個實例。一般僅在porlet上下文中使用生效,同時僅在Web相關(guān)的ApplicationContext中生效。application為每個ServletContext創(chuàng)建一個實例。僅在Web相關(guān)的ApplicationContext中生效。AOP(Aspect Oriente
13、d Programming面向切面編程)AOP 的實現(xiàn)原理其實就是使用代理模式,由 AOP 框架動態(tài)生成的一個代理對象,該對象可作為代替目標對象使用。AOP 代理包含了目標對象的全部方法,但 AOP 代理中的方法與目標對象的方法存在差異,AOP 方法在特定切入點添加了增強處理,并回調(diào)了目標對象的方法。Spring 中 AOP 代理由 Spring 的 IoC 容器負責生成、管理,其依賴關(guān)系也由 IoC 容器負責管理。因此,AOP 代理可以直接使用容器中的其他 Bean 實例作為目標,這種關(guān)系可由 IoC 容器的依賴注入提供。使用注解實現(xiàn)AOPAspectJ是一個面向切面的框架,它擴展了Java
14、語言,定義了AOP 語法,能夠在編譯期提供代碼的織入。Spring通過集成AspectJ實現(xiàn)了以注解的方式定義增強類,大大減少了配置文件中的工作量。案例代碼package org.newboy.entity;/* * 用戶實體類對象 */public class User private int id; / 主鍵private String name; / 用戶名private String password; / 密碼public User(int id, String name, String password) /帶全參的構(gòu)造方法super();this.id = id; = name;
15、this.password = password;public User() /默認無參構(gòu)造方法super();/getter和setter方法省略package org.newboy.dao;import org.newboy.entity.User;/* * 用戶DAO的接口 */public interface UserDao /* * 通過名字和密碼查詢用戶 */public User findUser(String name,String password);package org.newboy.dao.impl;import org.newboy.dao.UserDao;impor
16、t org.newboy.entity.User;/* * 用戶DAO的實現(xiàn)類 */public class UserDaoImpl implements UserDao Overridepublic User findUser(String name, String password) if (張三.equals(name) & 123.equals(password) / 假設(shè)從數(shù)據(jù)庫中查出return new User(1000, 張三, 123); else return null;package ;import org.newboy.entity.User;/* * 用戶的業(yè)務接口
17、*/public interface UserBiz /* * 登錄的方法 * param name 用戶名 * param password 密碼 * return 登錄成功返回User對象,登錄失敗返回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;/* * 用戶業(yè)務類的實現(xiàn)*/public class U
18、serBizImpl implements UserBiz private UserDao userDao;/依賴于userDao對象/通過set方法注入public void setUserDao(UserDao userDao) this.userDao = userDao;Overridepublic User login(String name, String password) try /這里隨機產(chǎn)生1個4秒以內(nèi)的暫停,模擬現(xiàn)實中的登錄操作Thread.sleep(new Random().nextInt(4000);System.out.println(業(yè)務方法login運行,正在
19、登錄.); catch (InterruptedException e) e.printStackTrace();return userDao.findUser(name, password);代碼/* 需要織入的日志切面類 */Aspect public class LoggerAdvice /log4j日志類Logger logger = Logger.getLogger(LoggerAdvice.class);/ 后置增強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 + 登錄失敗);/ 前置增強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 + 開始登錄);public class Test public static void main(String args) ApplicationContext ctx = new
22、ClassPathXmlApplicationContext(applicationContext.xml);/得到業(yè)務類UserBiz userBiz = (UserBiz) ctx.getBean(userBiz);/運行業(yè)務登錄方法userBiz.login(張三, 123);Spring注解管理IoCComponent:通用注解,可以用在任何一個類上,表示該類定義為Spring管理Bean,使用默認value(可選)屬性表示Bean標識符。Repository:用于標注DAO類,使用方法與Component相同。Service:用于標注業(yè)務類,使用方法與Component相同。Cont
23、roller:用于標注控制器類,使用方法與Component相同。Autowired:注解實現(xiàn)Bean的自動注入,默認按類型進行匹配。這個注解是Spring提供的。Resource的作用相當于Autowired,只不過Autowired按byType自動注入,而Resource默認按byName自動注入,這個注解是由Java JDK自帶的。Qualifier:按指定名稱匹配進行注入。Scope注解指定Bean的作用域。案例代碼/* * 用戶業(yè)務類的實現(xiàn) */Service(userBiz)public class UserBizImpl implements UserBiz Autowired
24、private UserDao userDao; / 這次連set方法都沒有Overridepublic User login(String name, String password) try / 這里隨機產(chǎn)生1個4秒以內(nèi)的暫停,模擬現(xiàn)實中的登錄操作Thread.sleep(new Random().nextInt(4000);System.out.println(業(yè)務方法login運行,正在登錄.); 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ù)庫中查出return new User(1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山石工崗前技術(shù)管理考核試卷含答案
- 廣西農(nóng)墾集團招聘面試題及答案
- 甘肅工程咨詢集團招聘面試題及答案
- 拖拉機制造工安全防護模擬考核試卷含答案
- 潤滑油脂灌裝制桶工班組評比強化考核試卷含答案
- 德華安顧人壽保險公司招聘面試題及答案
- 含氟烯烴生產(chǎn)工崗前風險評估考核試卷含答案
- 考古探掘工崗前崗中考核試卷含答案
- 拼布工安全管理測試考核試卷含答案
- 紙盒制作工安全培訓模擬考核試卷含答案
- GB/T 45481-2025硅橡膠混煉膠醫(yī)療導管用
- GB/T 32468-2025銅鋁復合板帶箔
- 山西交控集團招聘筆試內(nèi)容
- 大窯校本教材合唱的魅力
- 2025字節(jié)跳動智能廣告發(fā)布服務合同(模板)
- 《建筑測繪》課件
- 《健康體檢報告解讀》課件
- 前臺電話禮儀培訓
- T-CET 402-2024 金屬結(jié)構(gòu)曲面屋頂晶硅組件建筑光伏一體化技術(shù)規(guī)范
- 智慧健康養(yǎng)老管理基礎(chǔ)知識單選題100道及答案解析
- 車床設(shè)備大修計劃方案
評論
0/150
提交評論