1. 程式人生 > 其它 >Spring基礎之AOP程式設計

Spring基礎之AOP程式設計

技術標籤:Spring學習筆記springaop

文章目錄


前言

AOP程式設計也叫作面向切面程式設計,底層採用的是代理機制實現的。在Spring中,目標類有介面,也有類的時候,spring底層用動態代理實現;如果目標類只有類,spring底層用cglib實現。本篇筆記主要記錄了通過工廠bean代理和AOP的簡單案例。


一、AOP聯盟通知型別

  • 前置通知 org.springframework.aop.MethodBeforeAdvice — 在目標方法執行前實施增強
  • 後置通知 org.springframework.aop.AfterReturningAdvice — 在目標方法執行後實施增強
  • 環繞通知 org.aopalliance.intercept.MethodInterceptor — 在目標方法執行前後實施增強
  • 異常丟擲通知 org.springframework.aop.ThrowsAdvice — 在方法丟擲異常後實施增強
  • 引介通知 org.springframework.aop.IntroductionInterceptor — 在目標類中新增一些新的方法和屬性

二、工廠bean代理

<需要aop聯盟的jar包 – aopalliance;spring-aop實現>

1.目標類

public class UserServiceImpl implements UserService {
    @Override
    public void addUser() {
        System.out.println("add user");
    }
}

2.切面類

確定通知,需要實現不同介面,環繞通知 — MethodInterceptor

public class MyAspect implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation methodInvocation)
throws Throwable { System.out.println("前"); //手動執行目標方法 Object object = methodInvocation.proceed(); System.out.println("後"); return object; } }

3.Spring配置

<bean id="userService" class="com.spr.factorybean.UserServiceImpl"></bean>
<bean id="myAspect" class="com.spr.factorybean.MyAspect"></bean>
<bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="interfaces" value="com.spr.factorybean.UserService"></property>
    <property name="target" ref="userService"></property>
    <property name="interceptorNames" value="myAspect"></property>
</bean>

4.測試類

public void func(){
   String xmlpath = "bean.xml";
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlpath);
    UserService userService = (UserService) applicationContext.getBean("proxyService");           //獲取的是代理bean
    userService.addUser();
}

測試類的執行結果如下:
在這裡插入圖片描述

三、aop程式設計

由spring自動生成代理,只需要目標類

1.目標類

public class UserServiceImpl implements UserService {
    @Override
    public void addUser() {
        System.out.println("aop add user");
    }
}

2.切面類

確定通知,需要實現不同介面,環繞通知 — MethodInterceptor

public class MyAspect implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        System.out.println("前");
        //手動執行目標方法
        Object object = methodInvocation.proceed();
        System.out.println("後");
        return object;
    }
}

3.Spring配置

<bean id="userService" class="com.spr.aopdemo.UserServiceImpl"></bean>
<bean id="myAspect" class="com.spr.aopdemo.MyAspect"></bean>
<aop:config >
    <aop:pointcut expression="execution(* com.spr.aopdemo.*.*(..))"  id="myPointCut"/>
    <aop:advisor advice-ref="myAspect" pointcut-ref="myPointCut"/>
</aop:config>

4.測試類

public void func(){
    String xmlpath = "bean.xml";
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlpath);
    UserService userService = (UserService) applicationContext.getBean("userService");
    userService.addUser();
}

總結

本篇主要記錄了AOP的簡單案例,AOP和工廠bean的主要區別其實也就是在Spring的配置上,工廠bean需要建立一個代理bean,並且使用的時候(在測試類中)獲取的也是代理,而AOP不需要建立這樣的一個代理bean,建立的這個過程是由Spring去完成的,所以AOP是一個全自動的,而工廠bean只能看做是半自動的。