AOP实例demo

in Spring bucket with 0 comment

AOP实例:猫捉老鼠

//首先定义一个老鼠(Mouse)类,老鼠类只有一个walk()方法,只要老鼠出来就会触发这个方法

class Mouse{
    public void walk(){
        System.out.println("mouse is walking.....");
    }
}

//再定义一个猫(Cat)类,定义切面和配置,主要关注于老鼠的动向,等待老鼠出来,所以在Cat类中定义了一个@Pointcut切点,切点指向老鼠(Mouse)的walk(),同时这个切点前后还定义了相关的方法foundBefore()和foundAfter()

@Aspect 
class Cat{
    @Pointcut("execution(* xd.app.controller.Mouse.walk())")
    public void foundMouse(){
}
@Before(value = "foundMouse()")
public void foundBefore(){
    System.out.println("Cat wait for Mouse.....");
}
@AfterReturning("foundMouse()")
public void fountAfter(){
    System.out.println("Cat caught Mouse....");
}

}

开启@AspectJ AOP代理

<aop:aspectj-autoproxy proxy-target-class="true"/>
定义bean
<bean id="mouse" class="类路径.Mouse"/>
<bean id="mouse" class="类路径.Cat"/>

定义主应用
//ApplicationContext默认导入的是:import org.apache.catalina.core.ApplicationContext;会出现报错,请注意

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AopTest {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Mouse mouse = app.getBean(Mouse.class);
mouse.walk();
}
}

运行结果:

Cat wait for Mouse.....
mouse is walking.....
Cat caught Mouse....

需要注意:ClassPathXmlApplicationContext的加载路径,applicationContext.xml存放位置不对会报错,也有多种解决办法;
一、简单的用 ApplicationContext 做测试的话 , 获得 Spring 中定义的 Bean 实例(对象) 可以用:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

如果是两个以上 , 可以使用字符串数组 :

ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml","SpringTest.xml"});

或者可以使用通配符:

ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/*.xml");

对于 ClassPathXmlApplicationContext 的使用:
1、classpath: 前缀是可加可不加的 , 默认就是指项目的 classpath 路径下面。
2、如果要使用绝对路径 , 需要加上 file: , 前缀表示这是绝对路径。

对于 FileSystemXmlApplicationContext 的使用:
1、没有盘符的是项目工作路径 , 即项目的根目录。
2、有盘符表示的是文件绝对路径 ,file: 可加可不加。
3、如果要使用 classpath 路径 , 需要前缀 classpath:。

public class SpringTest {
  public static void main(String[] args) {
    // 用classpath路径
    // ApplicationContext context = new ClassPathXmlApplicationContext("classpath:appcontext.xml");
    // ApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml");
// ClassPathXmlApplicationContext使用了file前缀是可以使用绝对路径的
// ApplicationContext context = new ClassPathXmlApplicationContext(&quot;file:F:/workspace/example/src/appcontext.xml&quot;);

// 用文件系统的路径,默认指项目的根路径
// ApplicationContext context = new FileSystemXmlApplicationContext(&quot;src/appcontext.xml&quot;);
// ApplicationContext context = new FileSystemXmlApplicationContext(&quot;webRoot/WEB-INF/appcontext.xml&quot;);


// 使用了classpath:前缀,这样,FileSystemXmlApplicationContext也能够读取classpath下的相对路径
// ApplicationContext context = new FileSystemXmlApplicationContext(&quot;classpath:appcontext.xml&quot;);
// ApplicationContext context = new FileSystemXmlApplicationContext(&quot;file:F:/workspace/example/src/appcontext.xml&quot;);

// 不加file前缀
ApplicationContext context = new FileSystemXmlApplicationContext(&quot;F:/workspace/example/src/appcontext.xml&quot;);

}
}