.Net轉Java自學之路—Spring框架篇二(IOC註解、AOP)

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(){
    }
}
相關文章
相關標籤/搜索