Spring的Bean操做(註解方式):spring
註解:代碼中特殊的標記,使用註解能夠完成相關功能。
@註解名稱(屬性名稱=屬性值)
註解可使用在類、方法、屬性上面。
主要用途:能夠替代配置文件來建立對象和屬性注入。express
在作ioc基本功能時,配置文件引入的schema約束爲beans約束,而在作spring的ioc註解開發,引入新schema約束的context約束。編程
<?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"> </beans>
引入約束後,註解方式還須要在配置文件中開啓註解掃描:緩存
<!-- 開啓註解掃描:該配置掃描包中的類、方法、屬性上是否有註解 --> <context:component-scan base-package="包名"></context:component-scan> <!-- 該配置只掃描屬性上是否有註解 --> <context:annotation-config></context:annotation-config>
使用註解建立對象:在建立的類上方使用註解便可。安全
/** * 該註解中的value="test"至關於配置文件中的<bean id="test"...... */ @Component(value="test") public class Test{ }
建立對象含有四種註解方式:框架
四個註解的目前功能都是同樣的。Spring種提供@Component的三個衍生註解:
@Controller:wen層 @Service:業務層 @Repository:持久層
該三種註解方式時爲了讓標註類自己的用途清晰。Spring後續版本會對其加強。性能
@Scope(Value="prototype"):多實例;做用範圍。spa
@Component(value="test") @Scope(value="singleton")//單實例的 public class Test{ }
使用註解注入屬性:prototype
使用註解方式的屬性注入時不須要set方法,而是在須要注入的屬性上方使用註解@Autowired便可。代理
除去@Autowired註解外還有另外一種註解方式:@Resource(name="指定註解類種的value值")
XML和註解方式混合使用:
建立對象操做使用配置文件方式實現。
注入屬性的操做使用註解方式實現。
AOP:
面向切面編程。擴展功能不修改源代碼實現。AOP採起橫向抽取機制,取代了傳統的縱向繼承體系重複性代碼(性能監視、事務管理、安全檢查、緩存)
aop操做相關術語:
Joinpoint(鏈接點):指那些被攔截到的點。在Spring中,這些點指的時方法,由於Spring只支持方法類型的鏈接點。
簡述:指類中那些方法能夠被加強,這些方法稱爲鏈接點。
Pointcut(切入點):指要對那些Joinpoint進行攔截的定義。
簡述:指在類中能夠有不少的方法被加強,實際加強的方法稱爲切入點。
Advice(通知/加強):加強的邏輯稱爲加強。所謂通知是指攔截到Joinpoint以後所要作的事情就是通知,通知分爲:
前置通知:在方法以前執行。
後置通知:在方法以後執行。
異常通知:方法出現異常。
最終通知:在後置以後執行。
環繞通知(切面要完成的功能):在方法以前和以後執行。
Aspect(切面):是切入點和通知(引介)的結合。
簡述:把加強應用到具體方法上,就是把加強用到切入點的過程稱爲切面。
Introduction(引介):引介是一種特殊的通知在不修改類代碼的前提下,Introduction能夠在運行期爲類動態的添加一些方法或Field。
Target(目標對象):代理的目標對象(要加強的類)。
Weaving(織入):是把加強應用到目標的過程。把advice應用到target的過程。
Proxy(代理):一個類被AOP織入加強後,就產生一個結果代理類。
Spring基於aspectj的xml方式的AOP操做:
在Spring中進行aop操做,須要使用aspectj來實現。aspectj是一個面向切面的框架,是一個基於Java語言的aop框架。
aspectj不是Spring的一部分,和Spring一塊兒使用進行aop操做。Spring2.0以後新增了對aspectj支持。
使用aspectj來實現aop有兩種方式:一、基於aspectj的XML配置。二、基於aspectj的註解方式。
AOP操做準備:
一、除去導入基本的jar包以外,還須要導入aop相關的jar包:
aopalliance.jar、aspectjweaver.jar、spring-aop.RELEASE.jar、spring-aspects.RELEASE.jar
二、建立Spring核心配置文件。須要導入aop約束。
<?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:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> </beans>
使用表達式配置切入點:
一、切入點:實際加強的方法。
二、經常使用表達式格式:execution(<訪問修飾符>?<返回類型><方法名>(<參數>)<異常>)
例:execution(* 加強方法的全路徑(..)) *:任意的修飾符
execution(* cn.test.aop.Test.*(..)) 類.*:對類中的全部方法加強
execution(* *.*(..)) *.*:對全部類中的全部方法進行加強
execution(* save*(..)) save*:匹配全部save開頭的方法進行加強
<!-- 配置對象 --> <bean id="test" class="Test全路徑"></bean> <bean id="zqtest" class="ZQTest全路徑"></bean> <!-- 配置aop操做 --> <aop:config> <!-- 配置切入點 --> <!-- 對Test類中全部方法進行加強 --> <aop:pointcut expression="execution(* Test全路徑.*(..))" id="pc1"></aop:pointcut> <!-- 配置切面 --> <!-- 把加強用到方法上 --> <aop:aspect ref="zqtest"> <!-- 配置加強類型 method:加強類中使用那個方法做爲前置執行 pointcut-ref:做用在那個切入點上, 對應配置切入點的id值--> <aop:before method="方法名" pointcut-ref="pc1"/> <!-- 後置執行 --> <aop:after-returning method="方法名" pointcut-ref="pc1"/> <!-- 環繞執行 在環繞方法中用 ProceedingJoinPoint.proceed() 來執行被加強的方法--> <aop:around method="環繞方法名" pointcut-ref="pc1"> </aop:aspect> </aop:config>
基於aspectj的註解aop操做:
使用註解方式實現aop操做:先建立對象,而後開啓AOP操做。在加強類上使用註解完成aop操做;並在加強的方法上使用註解完成加強配置。
<!-- 配置對象 --> <bean id="test" class="Test全路徑"></bean> <bean id="zqtest" class="ZQTest全路徑"></bean> <!-- 開啓aop操做 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@Aspect public class ZQTest{ //在方法上使用註解完成加強配置 @Before(value="execution(* Test類全路徑.*(..))") public void fun(){ } }