Spring AOP本質是用了代理模式和反射機制實現的。
來看下常用的幾個接口:
Advice:這是一個空接口,裏面沒有任何方法,來標識一個通知。所有通知都實現此接口,如BeforeAdvice和AfterAdvice.
PointCut:決定Aop通知作哪個連接點。
Advisor:通知器或者通知者,我們從現實角度來說,通知者當然需要知道要通知什麼。所以Advisor依賴於Advice,而Advisor旗下的子接口PointAdvisor還依賴於Pointcut,也就是說這個接口更確切的定位應該是包含了要通知誰和要通知什麼,也就是說要能獲得Advice和Pointcut。
JoinPoint:代表了一個運行時的連接點。
Invocation:代表了程序的一個調用,可以被攔截器interceptor攔截。
@SuppressWarnings("serial")
public class ProxyFactoryBean extends ProxyCreatorSupport
implements FactoryBean<Object>, BeanClassLoaderAware, BeanFactoryAware {
/**
* This suffix in a value in an interceptor list indicates to expand globals.
*/
public static final String GLOBAL_SUFFIX = "*";
protected final Log logger = LogFactory.getLog(getClass());
private String[] interceptorNames;
private String targetName;
private boolean autodetectInterfaces = true;
private boolean singleton = true;
private AdvisorAdapterRegistry advisorAdapterRegistry = GlobalAdvisorAdapterRegistry.getInstance();
private boolean freezeProxy = false;
private transient ClassLoader proxyClassLoader = ClassUtils.getDefaultClassLoader();
private transient boolean classLoaderConfigured = false;
private transient BeanFactory beanFactory;
這裏沒有貼出全部代碼:可以看到2個重要的屬性,interceptorname和targetname.前者代表的是需要加強哪些東西以及需要怎樣加強,也就是advice和pointcut。而後者代表的則是我們針對誰來做這些加強,即我們的目標對象。