AOP:(Aspect-oriented-Programming,面向切面编程)
与AOP相关的名词:
- Aspect:切面
- Pointcut:切入点
- Advice:通知
使用注解定义通知类型:
- @Before:前置通知
- @AfterReturning:后置通知
- @After:最终通知
- @AfterThrowing:异常通知
- @Around:环绕通知
本次我采用打印机为例子:
有两个接口:Ink和Paper类
- Ink下有彩印 ColorInk 和黑白 BlackInk 两种打印方式
- paper下有A4Paper 和 B5Paper 两种类型
- 编写一个Printer类,里面封住了Ink 和 Paper类型以及自定义的打印机字符串String类型
- ShowPrinterInfoAspect就是用来演示切面的类
- Boss:main方法
pom.xml文件中要下载切面的jar包:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
Ink 接口:
public interface Ink {
public String getColor();
}
BlackInk:
public class BlackInk implements Ink{
@Override
public String getColor() {
return "黑白";
}
}
ColorInk:
@Component("ink")
public class ColorInk implements Ink {
@Override
public String getColor() {
return "彩色";
}
}
Paper接口:
public interface Paper {
public String getSize();
}
A4Paper:
@Component("paper")
public class A4Paper implements Paper {
@Override
public String getSize() {
return "A4";
}
}
B5Paper:
public class B5Paper implements Paper {
@Override
public String getSize() {
return "B5";
}
}
Printer:
//@Component
public class Printer {
// @Value("惠普")
private String kind;
@Autowired
// @Qualifier("paper")
private Paper paper;
@Autowired
// @Qualifier("ink")
private Ink ink;
public Printer(String kind) {
this.kind = kind;
}
public String getKind() {
return kind;
}
// public void setKind(String kind) {
// this.kind = kind;
// }
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
public Ink getInk() {
return ink;
}
public void setInk(Ink ink) {
this.ink = ink;
}
public void print(){
System.out.println("hello");
// System.out.println(kind+"打印机正在使用"+ink.getColor()+"墨盒"+paper.getSize()+"纸打印。。。");
}
}
ShowPrinterInfoAspect:
@Aspect
@Component
public class ShowPrinterInfoAspect {
@Autowired
Printer printer;
@Before("execution(* org.lanqiao.printer.Printer.print(..))")
public void ShowInfo(){
System.out.println(printer.getKind()+"打印机正在使用"+printer.getInk().getColor()+"墨盒"+printer.getPaper().getSize()+"纸打印。。。");
// System.out.println("dayin");
}
}
Boss:
public class Boss {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Printer printer = context.getBean("printer",Printer.class);
printer.print();
}
}
applicationContext.xml配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="printer" class="org.lanqiao.printer.Printer" >
<constructor-arg value="惠普"></constructor-arg>
</bean>
<context:component-scan base-package="org.lanqiao.printer"></context:component-scan>
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
</beans>