目录
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.aspectjgroupId>
- <artifactId>aspectjweaverartifactId>
- <version>1.9.4version>
- dependency>
定义通知类和通知
- public class Inform {
- public void method(){
- System.out.println(System.currentTimeMillis());
- }
- }
定义切入点 BookDaoImpl中有两个方法,分别是save和update,我们要增强的是update方法,
切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值、方法体无实际逻辑。
- public class Inform {
- @Pointcut("execution(void com.demo.dao.BookDao.update())")
-
- private void pt(){}
-
- public void method(){
- System.out.println(System.currentTimeMillis());
- }
- }
制作切面,切面是用来描述通知和切入点之间的关系
将通知类配给容器并标识其为切面类
- @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功能
- @Configuration
- @ComponentScan("com.demo")
- @EnableAspectJAutoProxy
- public class SpringConfig {
- }
运行程序
验证容器中是否为代理对象
@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())")