课上老师带着我们完成了骑士类的相关操作。
一、增加救美任务类与救美骑士类
1、在lesson05.aop_xml子包里创建救美骑士类 - DamselRescuingKnight
package net.tjl.spring.lesson05.aop_xml;
import net.tjl.spring.lesson4.RescueDamselQuest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 功能:救美骑士类
* 作者:谭金兰
* 日期:2021年03月24日
*/
@Component
public class DamselRescuingKnight {
@Autowired
private RescueDamselQuest rescueDamselQuest;
public void embarkOnQuest() {
rescueDamselQuest.embark();
}
}
2、在lesson05.aop_xml子包里创建救美骑士类 - RescueDamselQuest
package net.tjl.spring.lesson05.aop_xml;
import org.springframework.stereotype.Component;
/**
* 功能:救美任务类
* 作者:谭金兰
* 日期:2021年03月24日
*/
@Component
public class RescueDamselQuest {
public void embark() {
System.out.println("执行救美任务。");
}
}
3、在测试类里增加测试方法 - testDamselRescuingKnight()
3、运行testDamselRescuingKnight()方法,查看结果
三、采用注解方式使用AOP
1、在net.tjl.spring包里创建lesson05.aop_annotation子包
2、在aop_annotation子包里创建杀龙任务类 - SlayDragonQuest
package net.tjl.spring.lesson05.aop_annotation;
import org.springframework.stereotype.Component;
/**
* 功能:杀龙任务类
* 作者:谭金兰
* 日期:2021年03月24日
*/
@Component
public class SlayDragonQuest {
public void embark() {
System.out.println("执行杀龙任务。");
}
}
3、在aop_annotation子包里创建勇敢骑士类 - BraveKnight
package net.tjl.spring.lesson05.aop_annotation;
import net.tjl.spring.lesson05.aop_xml.SlayDragonQuest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 功能:勇敢骑士类
* 作者:谭金兰
* 日期:2021年03月24日
*/
@Component("Mike")
public class BraveKnight {
@Autowired
private SlayDragonQuest slayDragonQuest;
public void embarkOnQuest() {
slayDragonQuest.embark();
}
}
4、在aop_annotation子包里创建注解接口 - Action
package net.tjl.spring.lesson05.aop_annotation;
import java.lang.annotation.*;
/**
* 功能:动作注解接口
* 作者:谭金兰
* 日期:2021年03月24日
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Action {
String name();
}
5、在aop_annotation子包里创建游吟诗人切面 - MinstrelAspect
package net.tjl.spring.lesson05.aop_annotation;
/**
* 功能:游吟诗人类
* 作者:谭金兰
* 日期:2021年03月24日
*/
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect//声明切面
@Component
public class MinstrelAspect {
@Pointcut("execution(* *.embarkOnQuest(..))")
public void embark(){
}
@Before("embark()")
public void singBeforeQuest(JoinPoint joinPoint) {
System.out.println("啦啦啦,骑士出发了!");
}
@After("embark()")
public void singAfterQuest(JoinPoint joinPoint) {
System.out.println("真棒啊!骑士完成了任务!");
}
}
6、在aop_annotation子包里创建Spring配置类 - AopConfig
package net.tjl.spring.lesson05.aop_annotation;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
/**
* 功能:AOP配置类
* 作者:谭金兰
* 日期:2021年03月24日
*/
@Configuration // 标明是Spring配置类
@ComponentScan("net.tjl.spring.lesson05.aop_annotation") // 组件扫描
@EnableAspectJAutoProxy // 开启Spring对ApectJ的支持
public class AopConfig {
}
7、在aop_annotation子包里创建测试类 - TestKnight
package net.tjl.spring.lesson05.aop_annotation;
import net.tjl.spring.lesson05.aop_xml.BraveKnight;
import net.tjl.spring.lesson05.aop_xml.DamselRescuingKnight;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 功能:测试骑士类
* 作者:谭金兰
* 日期:2021年03月24日
*/
public class TestKnight {
private ClassPathXmlApplicationContext context;
@Before
public void init() {
// 基于Spring配置文件创建应用容器
context = new ClassPathXmlApplicationContext("aop_xml/spring-config.xml");
}
@Test
public void testBraveKnight() {
// 根据名称从应用容器里获取勇敢骑士对象
net.tjl.spring.lesson05.aop_xml.BraveKnight braveKnight = (BraveKnight) context.getBean("Mike");
// 勇敢骑士执行任务
braveKnight.embarkOnQuest();
}
@After
public void destroy() {
// 关闭应用容器
context.close();
}
}
8、运行测试方法testBraveKnight(),查看效果
9、增加救美任务类与救美骑士类
package net.tjl.spring.lesson05.aop_annotation;
import org.springframework.stereotype.Component;
/**
* 功能:救美任务类
* 作者:谭金兰
* 日期:2021年03月24日
*/
@Component
public class RescueDamselQuest {
public void embark() {
System.out.println("执行救美任务。");
}
}
package net.tjl.spring.lesson05.aop_annotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 功能:救美骑士类
* 作者:谭金兰
* 日期:2021年03月24日
*/
@Component
public class DamselRescuingKnight {
@Autowired
private RescueDamselQuest rescueDamselQuest;
public void embarkOnQuest() {
rescueDamselQuest.embark();
}
}
(2)在测试程序里增加对救美骑士的测试方法 - testDamselRescuingKnight()
(3) 运行测试方法testDamselRescuingKnight(),查看效果
10、实现注解式拦截
(1)修改勇敢骑士类,给embarkOnQuest()添加自定义注解Action
(2)修改游吟诗人切面类 - MinstrelAspect
(3)运行测试方法testBraveKnight(),查看效果
(3)运行测试方法testDamselRescuingKnight()(),查看效果