1 AOP 聯盟通知類型
AOP聯盟爲通知Advice定義了org.aopalliance.aop.Advice;Spring按照通知Advice在目標類方法的連接點位置,可以分爲5類;
- 前置通知
org.springframework.aop.MethodBeforeAdvice
,在目標方法執行前實施增強; - 後置通知
org.springframework.aop.AfterReturningAdvice
,在目標方法執行後實施增強; - 環繞通知
org.aopalliance.intercept.MethodInterceptor
,在目標方法執行前後實施增強; - 異常拋出通知
org.springframework.aop.ThrowsAdvice
,在方法拋出異常後實施增強; - 引介通知
org.springframework.aop.IntroductionInterceptor
,在目標類中添加一些新的方法和屬性
2 Spring 編寫代理半自動
spring 創建代理對象,從spring容器中手動的獲取代理對象
- 導入 jar 包
- 目標類
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("刪除用戶。。。");
}
}
- 切面類
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;
}
}
- 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();
}