10.AOP学习
2019-03-09 本文已影响0人
王杰磊
AOP的概念
- AOP(Aspect Oriented Programming,面向切面编程,在AOP中,模块化的单元是切面。切面可以实现跨多个类型和对象之间的事务管理、日志等方面的模块化,基本上通过代理机制实现与面向对象编程相比AOP是豪放派的选择,大手一挥,凡某某包某类某命名方法,一并同样处理(正则表达式)。
AOP的优势
- 提供声明式企业服务
- 允许用户自定义切面
- 可以对业务逻辑的各个部分进行隔离
AOP核心概念
- Aspect(切面)
- Join Point(连接点)
- Advice(通知)
- Pointcut(切入点)
- Introduce(引入)
- Target Project(目标对象)
- AOP Proxy(AOP代理)
- Weaving(织入)
AOP示例
- 新建一个接口Move
package com.spring.aop;
public interface Move {
public void move();
}
- 新建一个Tank类,继承Move接口的move方法
package com.spring.aop;
public class Tank implements Move {
@Override
public void move() {
System.out.println("Tank is moving");
}
}
- 新建一个TankProxy代理Move接口
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("stop");
}
}
- Moveapp
package com.spring.aop;
public class MoveApp {
public static void main(String[] args) {
Move t=new Tank();
Move t1=new Car();
Move moveproxy=new TankProxy(t);
Move moveproxy1=new TankProxy(t1);
moveproxy.move();
moveproxy1.move();
}
}
结果
image.png
AOP前置方法示例
- 新建一个Hello接口,定义一个getHello方法
package com.spring.aop;
public interface Hello {
String getHello();
}
- 定义一个HelloImpl类继承getHello方法
package com.spring.aop;
public class HelloImpl implements Hello {
@Override
public String getHello() {
return "Hello,Spring AOP";
}
}
- 自定义一个前置增强类MyBeforeAdvice
package com.spring.aop;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 用户自定义的前置增强类
*/
public class MyBeforeAdvice {
private static final Logger logger= LoggerFactory.getLogger("Hello.class");
// 定义前置方法
public void beforeMethod(){
logger.info("错误");
System.out.println("this is a before method");
}
}
- 配置Bean和AOP
<!--配置一个Hello的bean,等同于Hello hello=new HelloImpl-->
<bean id="hello" class="com.spring.aop.HelloImpl"/>
<!--配置一个MyBeforeAdvice前置增强的bean-->
<bean id="mybeforeadvice" class="com.spring.aop.MyBeforeAdvice"/>
<!--进行AOP的配置-->
<aop:config>
<aop:aspect id="before" ref="mybeforeadvice">
<aop:pointcut id="myPointCut" expression="execution(* com.spring.aop.*.*(..))"/>
<aop:before method="beforeMethod" pointcut-ref="myPointCut"/>
</aop:aspect>
</aop:config>
- 新建一个HelloApp实现
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());
}
}
结果
image.png