Spring筆記(9)—— Spring 半自動代理

1 AOP 聯盟通知類型

AOP聯盟爲通知Advice定義了org.aopalliance.aop.Advice;Spring按照通知Advice在目標類方法的連接點位置,可以分爲5類;

  1. 前置通知 org.springframework.aop.MethodBeforeAdvice,在目標方法執行前實施增強;
  2. 後置通知 org.springframework.aop.AfterReturningAdvice,在目標方法執行後實施增強;
  3. 環繞通知 org.aopalliance.intercept.MethodInterceptor,在目標方法執行前後實施增強;
  4. 異常拋出通知 org.springframework.aop.ThrowsAdvice,在方法拋出異常後實施增強;
  5. 引介通知 org.springframework.aop.IntroductionInterceptor,在目標類中添加一些新的方法和屬性

2 Spring 編寫代理半自動

spring 創建代理對象,從spring容器中手動的獲取代理對象

  1. 導入 jar 包
    在這裏插入圖片描述

  1. 目標類
  • IUserService
package com.tzb.service;

public interface IUserService {

    // 切面編程
    public void addUser();
    public void updateUser();
    public void delete();
}

  • UserServiceImpl
public class UserServiceImpl implements IUserService {

    @Override
    public void addUser() {
        System.out.println("添加用戶。。。");
    }

    @Override
    public void updateUser() {
        System.out.println("更新用戶。。。");
    }

    @Override
    public void delete() {
        System.out.println("刪除用戶。。。");
    }

}


  1. 切面類
  • MyAspect
package com.tzb.service;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

/**
 * 切面類,增強代碼與切入點的集合
 */
public class MyAspect implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation mi) throws Throwable {
        // 攔截方法

        System.out.println("開啓事務...");
        // 放行
        Object retObj = mi.proceed();

        System.out.println("攔截...");

        System.out.println("提交事務...");
        return retObj;
    }
}


  1. spring 配置
  • beans.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">


    <!--配置 UserService-->
    <bean id="userService" class="com.tzb.service.UserServiceImpl"></bean>

    <!--配置切面類對象-->
    <bean id="myAspect" class="com.tzb.service.MyAspect"></bean>


    <!--配置代理對象
        默認情況下Spring 的AOP 生成的代理是JDK 的Proxy 實現的
    -->
    <!--配置代理對象-->
    <bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!--接口: 如果只是一個接口,用vaLue,多個接口用 List-->
        <property name="interfaces" value="com.tzb.service.IUserService"/>
        <!--目標對象-->
        <property name="target" ref="userService"/>
        <!--切面類-->
        <property name="interceptorNames" value="myAspect"/>

        <!--配置使用 cglib創建代理-->
        <property name="optimize" value="true"/>
    </bean>

</beans>

  • 測試
  @Test
    public void test1() {

        // 獲取 Spring 容器中代理對象
        ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml");

        IUserService userService = (IUserService) context.getBean("serviceProxy");

        userService.delete();
    }

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章