Java EE學習筆記(第三章),AOP,基於代理類的AOP實現,ProxyFactoryBean
阿新 • • 發佈:2021-07-24
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()方法。
packagecom.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