一、Spring的Bean管理(註解方式) 1.1 什麼是註解 要使用註解方式實現Spring的Bean管理,首先要明白什麼是註解。通俗地講,註解就是代碼里的特殊標記,使用註解可以完成相應功能。 註解的寫法:@註解名稱(屬性名稱=屬性值)。 註解的用法:可以使用在類上、方法上和屬性上。 1.2 註解 ...
一、Spring的Bean管理(註解方式)
1.1 什麼是註解
要使用註解方式實現Spring的Bean管理,首先要明白什麼是註解。通俗地講,註解就是代碼里的特殊標記,使用註解可以完成相應功能。
註解的寫法:@註解名稱(屬性名稱=屬性值)。
註解的用法:可以使用在類上、方法上和屬性上。
1.2 註解開發準備工作
● 導入jar包,其中包括基本jar包和aop相關的jar包,如下圖:
● 引入相關約束(除了第一節學習中用到的beans約束,還要加入新的約束),如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" >
1.3 編寫相關的測試類
package com.Kevin.anno; import org.springframework.stereotype.Component; /** * 使用註解方式在service中調用dao方法 * @author Kevin * */ @Component("userDao") //value屬性名稱可以省略不寫 public class UserDao { public void add(){ System.out.println("Dao------"); } }
1.4 在配置文件中配置註解掃描
<!-- 開啟註解掃描 到對應的包里掃描 類、屬性、方法上的註解 --> <context:component-scan base-package="com.Kevin.anno"></context:component-scan>
1.5 在相關的類上添加註解
package com.Kevin.anno; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * 使用註解方式在service中調用dao方法 * @author Kevin * */ @Service("userService") public class UserService { //得到dao對象 //1.定義dao類型屬性 //在dao屬性上使用註解完成對象註入 //@Autowired //name屬性值填寫 註解創建dao對象的value值 @Resource(name="userDao") private UserDao userDao; public void add(){ System.out.println("Service------"); userDao.add(); } }
1.6 編寫測試類進行測試:
package com.Kevin.anno; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 測試註解創建類對象 * @author Kevin * */ public class TestAnno { @Test public void testService(){ ApplicationContext context=new ClassPathXmlApplicationContext("beans1.xml"); UserService service=(UserService) context.getBean("userService"); System.out.println(service); service.add(); } }
二、Spring的Bean管理中常用的註解
2.1 Component組件(作用在類上)
Spring 中提供@Component 的三個衍生註解:(功能目前來講是一致的)
● @Controller:WEB 層
● @Service:業務層
● @Repository:持久層
這三個註解是為了讓標註類本身的用途清晰,Spring 在後續版本會對其增強
2.2 屬性註入的註解(使用註解註入的方式,可以不用提供set方法)
● @Value:用於註入普通類型。
● @Autowired:自動裝配:
①按預設類型進行裝配
②按名稱註入:@Qualifier:強制使用名稱註入。
● @Resource:相當於@Autowired和@Qualifier一起使用。
2.3 Bean的作用範圍的註解
● @Scope:
* singleton:單例
* prototype:多例
2.4 Bean的生命周期的配置
● @PostConstruct:相當於init-method。
● @PreDestroy:相當於destroy-method。
三、Spring的Bean管理方式的比較
XML和註解比較:
● XML:結構清晰.
● 註解:開發方便.(屬性註入.)
實際開發中還有一種 XML 和註解整合開發:
● Bean 有 XML 配置,是使用的屬性使用註解註入。
四、AOP的概述
4.1 什麼是AOP
在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切麵編程,通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。
4.2 為什麼學習AOP
面向切麵編程,擴展功能不通過源代碼修改。AOP採取橫向抽取機制,取代了傳統的縱向繼承體系重覆性代碼。
4.3 Spring的AOP的由來
AOP 最早由 AOP 聯盟的組織提出的,制定了一套規範.Spring 將 AOP 思想引入到框架中,必須遵守 AOP 聯盟的規範。
4.4 AOP的底層實現
代理機制:
● Spring 的 AOP 的底層用到兩種代理機制:
● JDK 的動態代理 :針對實現了介面的類產生代理.
● Cglib 的動態代理:針對沒有實現介面的類產生代理. 應用的是底層的位元組碼增強的技術 生成當前類的子類對象.
五、Spring底層AOP
六、Spring 的基於 AspectJ 的 AOP 開發
6.1 AOP開發中相關的術語
● Pointcut:切入點,在類中有很多方法可以被增強,而只有實際增強的方法稱為切入點;
● Advice:通知/增強,實際增強的邏輯,被稱為通知/增強,比如拓展日誌功能,日誌功能被稱為通知/增強;
前置通知:在方法之前執行
後置通知:在方法之後執行
異常通知:方法出現異常
最終通知:在後置之後執行
環繞通知:在方法之前和之後執行
● Introduction(引介):引介是一種特殊的通知在不修改類代碼的前提下, Introduction 可以在運行期為類動態地添加一些方法或 Field;
● Target(目標對象):代理的目標對象;
● Weaving(織入):是指把增強應用到目標對象來創建新的代理對象的過程(spring 採用動態代理織入,而 AspectJ 採用編譯期織入和類裝在期織入);
● Proxy(代理):一個類被 AOP 織入增強後,就產生一個結果代理類。
● Aspect:切麵,將增強應用到具體方法上的過程稱為切麵(把增強用到切入點過程)
● Joinpoint:連接點,類裡面可以被增強的方法,被稱為連接點
七、Spring 使用 AspectJ 進行 AOP 的開發:XML 的方式
7.1 編寫被增強類
package com.Kevin.aop; /** * AOP操作被增強類 * @author Kevin * */ public class Book { public void add(){ System.out.println("Bookadd-----"); } }
7.2 編寫增強類
package com.Kevin.aop; import org.aspectj.lang.ProceedingJoinPoint; /** * AOP操作增強類 * 前值增強 * @author Kevin * */ public class StrBook { public void strbefore(){ System.out.println("Before Strength BookClass---"); } public void strafter(){ System.out.println("Atfer Strentgh BookClass---"); } //環繞增強 public void straround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{ //方法之前 System.out.println("Before around---"); //執行被增強方法 proceedingJoinPoint.proceed(); //方法之後 System.out.println("After around---"); } }
7.3 編寫測試代碼
package com.Kevin.aop; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestUsage { //AOP前置增強 @Test public void test(){ ApplicationContext context=new ClassPathXmlApplicationContext("beans3.xml"); Book book=(Book) context.getBean("book"); book.add(); } }
八、Spring 的Bean管理:XML+註解 的方式實現
8.1 使用註解方式註入對象
創建BookDao和OrdersDao兩個類,在BookService中使用註解的方式註入兩個dao。
package com.Kevin.XMLanno; /** * 配置文件和註解混合使用 * 創建對象操作使用配置文件方式實現 註入屬性的操作使用註解方式實現 * @author Kevin * */ public class BookDao { public void book(){ System.out.println("BookDao----"); } }
package com.Kevin.XMLanno; /** * 配置文件和註解混合使用 * 創建對象操作使用配置文件方式實現 註入屬性的操作使用註解方式實現 * @author Kevin * */ public class OrdersDao { public void buy(){ System.out.println("OrdersDao----"); } }
package com.Kevin.XMLanno; import javax.annotation.Resource; /** * 配置文件和註解混合使用 * 創建對象操作使用配置文件方式實現 註入屬性的操作使用註解方式實現 * @author Kevin * */ public class BookService { //得到BookDao和OrdersDao的對象 @Resource(name="bookDao") private BookDao bookDao; @Resource(name="ordersDao") private OrdersDao ordersDao; public void add(){ System.out.println("BookService----"); bookDao.book(); ordersDao.buy(); } }
8.2 用xml配置文件的形式創建對象
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here --> <!-- 開啟註解掃描 到對應的包里掃描 類、屬性、方法上的註解 --> <context:component-scan base-package="com.Kevin.XMLanno"></context:component-scan> <!-- 配置對象 --> <bean id="bookService" class="com.Kevin.XMLanno.BookService"></bean> <bean id="ordersDao" class="com.Kevin.XMLanno.OrdersDao"></bean> <bean id="bookDao" class="com.Kevin.XMLanno.BookDao"></bean> </beans>