目录
一、AOP
AOP(Aspect Oriented Programming)面向切面编程,一种编程思想,指导开发者如何组织程序结构。AOP是在不改原有代码的前提下对其进行增强,追加功能的,无侵入式编程
二、简单的案例
添加BookDao和BookDaoImpl类
public interface BookDao {
public void save();
public void update();
}
@Repository
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println(System.currentTimeMillis());
System.out.println("book dao save ...");
}
@Override
public void update() {
System.out.println("book dao update ...");
}
}
创建Spring的配置类
@Configuration
@ComponentScan("com.demo.dao")
public class SpringConfig {
}
编写AppForLifeCycle运行类
public class AppForLifeCycle {
public static void main( String[] args ) {
ApplicationContext ctx = new
AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = ctx.getBean(BookDao.class);
bookDao.update();
}
}
目前打印save方法的时候,因为方法中有打印系统时间,所以运行的时候是可以看到系统时间
对于update方法来说,就没有该功能
要使用SpringAOP的方式在不改变update方法的前提下让其具有打印系统时间的功能。
在pom.xml添加依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
定义通知类和通知
public class Inform {
public void method(){
System.out.println(System.currentTimeMillis());
}
}
定义切入点 BookDaoImpl中有两个方法,分别是save和update,我们要增强的是update方法,
切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值、方法体无实际逻辑。
1.@Pointcut注解
public class Inform {
@Pointcut("execution(void com.demo.dao.BookDao.update())")
private void pt(){}
public void method(){
System.out.println(System.currentTimeMillis());
}
}
制作切面,切面是用来描述通知和切入点之间的关系
将通知类配给容器并标识其为切面类
2.@Aspect注解
3.@Before注解
@Component
@Aspect
public class Inform {
@Pointcut("execution(void com.demo.dao.BookDao.update())")
private void pt(){}
@Before("pt()")
public void method(){
System.out.println(System.currentTimeMillis());
}
}
开启注解格式AOP功能
4.@EnableAspectJAutoProxy注解
@Configuration
@ComponentScan("com.demo")
@EnableAspectJAutoProxy
public class SpringConfig {
}
运行程序
二、AOP工作流程
验证容器中是否为代理对象
@Component @Aspect public class Inform { @Pointcut("execution(void com.demo.dao.BookDao.update())") private void pt(){} @Before("pt()") public void method(){ System.out.println(System.currentTimeMillis()); } }
public class AppForLifeCycle { public static void main( String[] args ) { ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); BookDao bookDao = ctx.getBean(BookDao.class); System.out.println(bookDao); System.out.println(bookDao.getClass()); } }
将Inform类中@Pointcut注解update改成update1,重新运行,此时发现爆红,运行结果是BookDaoImp
@Pointcut("execution(void com.demo.dao.BookDao.update1())")