一、对AOP的基本了解
- 我们要做的不是纵向的抽取,而是横向的抽取
- AOP是OOP的有益补充,为程序开发提供了一个崭新的思考角度,可以将重复性的横切逻辑抽取到统一的模块中
- 通过OOP的纵向抽象和AOP的横向抽取,程序才可以真正解决重复性代码性问题
- 定义:在运行时,动态地将代码切入到类的指定方法,指定位置上的编程思想就是面向切面的编程
- AOP基本是通过代理机制实现的
- 注意:AOP的使用场景是日志和事务,代理(Proxy)的对象是接口
二、实例练习
- 添加依赖
<!--spring-aop依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
- Tank的移动:
Move类:
package com.spring.aop;
public interface Move {
public void move();
}
Tank类:
package com.spring.aop;
public interface Move {
public void move();
}
TankProxy类:
package com.spring.aop;
public class TankProxy implements Move{
private Move t;
public TankProxy(Move t) {
this.t = t;
}
@Override
public void move() {
System.out.println("Start!");
t.move();
System.out.println("finsh!");
}
}
TankApp类:
package com.spring.aop;
public class TankApp {
public static void main(String[] args) {
Move t=new Tank();
Move moveproxy=new TankProxy(t);
moveproxy.move();
}
}
运行截图:
运行结果
三、Hello的前置增强练习
1.添加依赖
之前已添加可以忽略
2.创建Hello接口和其实现类
package com.spring.aop;
public interface Hello {
String getHello();
}
package com.spring.aop;
public class HelloImpl implements Hello{
@Override
public String getHello() {
return "Hello,Spring Aop";
}
}
3.MyBeforeAdvice类
package com.spring.aop;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
/**
* 用户自定义的前置增强类
*/
public class MyBeforeAdvice {
private static final Logger logger = LoggerFactory.getLogger(MyBeforeAdvice.class);
// 定义前置方法
public void beforeMethod(){
// logger.debug("This a before method by Wuyou");
System.out.println("This is a before method.");
}
}
4.配置xml文件
<!--配置一个Hello的bean-->
<bean id="hello" class="com.spring.aop.HelloImpl"></bean>
<!--配置一个MyBeforeAdviced的bean-->
<bean id="mybeforeadvice" class="com.spring.aop.MyBeforeAdvice"></bean>
<aop:config>
<aop:aspect id="mybeforeadvice" ref="mybeforeadvice" >
<aop:pointcut id="mypointcut" expression="execution(* com.spring.aop.*.*(..))"/>
<aop:before method="beforeMethod" pointcut-ref="mypointcut"/>
</aop:aspect>
</aop:config>
5.创建app类
package com.spring.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloApp {
public static void main(String[] args) {
ApplicationContext context=
new ClassPathXmlApplicationContext("/spring.xml");
Hello hello =context.getBean(Hello.class);
System.out.println(hello.getHello());
}
}
6.运行结果
运行结果
网友评论