1. 程式人生 > 其它 >Java EE學習筆記(第三章),AOP,基於代理類的AOP實現,ProxyFactoryBean

Java EE學習筆記(第三章),AOP,基於代理類的AOP實現,ProxyFactoryBean

Spring中代理物件可通過XML配置方式獲得,也可通過ProxyFactory手動程式設計方式建立物件。Spring中的代理物件其實是JDK Proxy和CGLIB Proxy 的結合。
一、建立介面

package com.itheima.jdk;

public interface UserDao {
    public void addUser();

    public void deleteUser();
}

二、建立實現類

package com.itheima.jdk;

import org.springframework.stereotype.Repository;

// 目標類 @Repository("userDao") public class UserDaoImpl implements UserDao { public void addUser() { System.out.println("新增使用者"); } public void deleteUser() { System.out.println("刪除使用者"); } }

三、建立切面類

需要實現org.aopalliance.intercept.MethodInterceptor介面,並實現介面中的invoke()方法。

package
com.itheima.factorybean; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; // 切面類 public class MyAspect implements MethodInterceptor { @Override public Object invoke(MethodInvocation mi) throws Throwable { check_Permissions();
// 執行目標方法 Object obj = mi.proceed(); log(); return obj; } public void check_Permissions(){ System.out.println("模擬檢查許可權..."); } public void log(){ System.out.println("模擬記錄日誌..."); } }

四、建立配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
    <!-- 1 目標類 -->
    <bean id="userDao" class="com.itheima.jdk.UserDaoImpl" />
    <!-- 2 切面類 -->
    <bean id="myAspect" class="com.itheima.factorybean.MyAspect" />
    <!-- 3 使用Spring代理工廠定義一個名稱為userDaoProxy的代理物件 -->
    <bean id="userDaoProxy"
        class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 3.1 指定代理實現的介面 -->
        <property name="proxyInterfaces"
            value="com.itheima.jdk.UserDao" />
        <!-- 3.2 指定目標物件 -->
        <property name="target" ref="userDao" />
        <!-- 3.3 指定切面,織入環繞通知 -->
        <property name="interceptorNames" value="myAspect" />
        <!-- 3.4 指定代理方式,true:使用cglib,false(預設):使用jdk動態代理 -->
        <property name="proxyTargetClass" value="true" />
    </bean>
</beans>

五、建立主程式

package com.itheima.factorybean;
import org.springframework.context.ApplicationContext;
import 
    org.springframework.context.support.ClassPathXmlApplicationContext;
import com.itheima.jdk.UserDao;
// 測試類
public class ProxyFactoryBeanTest {
    public static void main(String args[]) {
       String xmlPath = "com/itheima/factorybean/applicationContext.xml";
       ApplicationContext applicationContext = 
                                 new ClassPathXmlApplicationContext(xmlPath);
       // 從Spring容器獲得內容
       UserDao userDao = 
                       (UserDao) applicationContext.getBean("userDaoProxy");
       // 執行方法
       userDao.addUser();
       userDao.deleteUser();
       System.out.println(userDao.getClass().getName());
    }
}

六、執行結果

模擬檢查許可權...
新增使用者
模擬記錄日誌...
模擬檢查許可權...
刪除使用者
模擬記錄日誌...
com.itheima.jdk.UserDaoImpl$$EnhancerBySpringCGLIB$$89b6e7f3

七、如果修改配置檔案,如下:

        <!-- 3.4 指定代理方式,true:使用cglib,false(預設):使用jdk動態代理 -->
        <property name="proxyTargetClass" value="false" />

八、則執行結果變為:

模擬檢查許可權...
新增使用者
模擬記錄日誌...
模擬檢查許可權...
刪除使用者
模擬記錄日誌...
com.sun.proxy.$Proxy4