我們已經知道之前的切面添加方式(動態代理),是定義了一個實現了InvocationHandler接口的Handlerservice類,然后
在這個類內部寫好切面邏輯,包括切面放置的位置,很顯然下面的這個切面邏輯是放置在原先方法之前的。
public class Handlerservice implements InvocationHandler { private UserDao o; public Handlerservice(UserDao o) { super(); this.o = o; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub System.out.println("-----我來組成頭部-----"); Object returnValue = method.invoke(o, args); return returnValue; } }
如果需求改變,又要來更改代碼,可謂相當不方便。不過還好有強大的Spring,先看看Spring是怎樣使用寥寥幾個注解解
決了這種問題的吧。
@Aspect @Component public class Aop1 { @Before("execution(* com.eco.daoimp.*.add*(..))") public void show() { System.out.println("-----Annotation添加切面Aop-----"); } }
首先@Aspect注解,自從AOP設計模式出現之后,可謂是掀起了java界的一股熱潮,當然少不了大家對其的研究,其中最
牛B的當屬Aspect,甚至一度出現了Aspect聯盟,可見大家對其的追捧程度。所以,這么好的東西Spring自然也會為止着迷,
於是在Spring也引入了Aspect!
然后@Component注解,因為這個類要被Spring容器所使用,自然要用這個注解定義其是Spring的一個組件。
最后這個@Before注解以及注解括弧內容,意思就是,在daoimp包下面的所有類的add開頭的方法調用之前先來調用我下面
的這個方法,@Before("execution(方法返回值類型 包名.類名.方法名(參數類型))"),既然有@Before,自然還有
@After等等~~~
如此一來,就實現了定義一個切面,並且聲明其放置的位置(add*方法之前)。是不是很方便。