aop的全称是Aspect Oriented Programming,也就是说在spring中你得使用AspectJ来完成aop操作,aop是一种面向切面的变成思想,换句话说就是为了再不改变原方法的情况下来扩展这个方法。比如下面的add方法,我们想在add方法执行后添加一个日志功能来记录一下add执行的时间。使用extends来扩展的话存在耦合,也就是说当父类中的方法名称发生变化时,你还得去找哪个extend了这个父类,去每一个子类中去修改方法名字,呵呵,如果项目很庞大的话,你懂得。所以得用aop操作来改善这个耦合的问题。
下面十几个aop的操作术语,这是其中几个比较重要的。
这几个点是不是很简单,以前没好好学习,总感觉很难。其实还好,只是以前心思不在学习上。现在上班了没办法。相信自己,加油。
使用表达式配置切入点。你想扩展哪个方法就对该方法进行一个配置,也就是说你得告诉程序你要扩展哪个方法,这个方法叫什么,在哪。第一个*表示方法修饰符是public、private无所谓都行的意思。后面的就是方法的全路径。(..)表示该方法有没有参数参数有多少个都行。第三个经常不用,无视就行。第四个也认识一下就行。
下面是第一种基于aspectj的xml配置方法来实现方法的增强,也就是实现aop操作。
第一步导入所需要的jar包,下面是我的目录,以及导入的jar包,将炸包复制到lib下然后在lib文件夹上右键refresh就好啦。
因为等会要测试方法,所以再来一步导入JUnit,Eclipse下引入junit的两种方法
方法一:
右击选中的project-》build path-》add libraries-》选中junit,next直到finish
方法二:
1、由http://sourceforge.net/projects/junit/?source=navbar
或者http://www.junit.org (重定向到Github)下载junit的jar包,保存在本地磁盘
2、在Eclipse当中右击选中的project-》build path-》add external Archieves-》找到前面下载的junit jar包引入即可
下面是每个文件里的代码
Book.java
package cn.spring.aop;
public class Book {
public void add(){
System.out.println("add...");
}
}
MyBook.java
package cn.spring.aop;
public class MyBook {
public void before1(){
System.out.println("前置增强。。。");
}
}
test.java
package cn.spring.aop;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
@Test
public void testaop(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
Book book=(Book) context.getBean("book");
book.add();
}
}
bean.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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--1 配置对象 -->
<bean id="book" class="cn.spring.aop.Book"></bean>
<bean id="myBook" class="cn.spring.aop.MyBook"></bean>
<!-- 2 配置aop操作 -->
<aop:config>
<!-- 2.1配置切入点 -->
<aop:pointcut expression="execution(* cn.spring.aop.Book.add(..))" id="pointcut1"/>
<!-- 2.2配置切面
把增强用到方法上面
-->
<aop:aspect ref="myBook">
<!-- 配置增强的类型,前置还是后置等
method,增强类中使用哪个方法作为前置增强
pointcut-ref:指定方法要用在哪个切入点上面
-->
<aop:before method="before1" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
</beans>
在testaop上右键run as>>JUnit Test。
运行结果
以上就是用配置方法来完成的aop的步骤。当然注解的方法会更方便一点需要做的就是约束要引入context,也就是在bean配置文件中加上以下约束,这个知道就行啦。
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
接着往下看吧,嘿嘿。对了如果你不想看到运行结果里的关于log4j的警告,就按照以下步骤将log4j.properties复制粘贴到他该呆的地方就不会有警告啦。
运行结果如下
下面是基于aspectj的注解aop,也就是配置方法的升级版,不用写那么多的配置内容了。
国际惯例,导入炸包,目录如下
Book.java
package cn.spring.aopAnno;
public class Book {
public void add(){
System.out.println("add...");
}
}
MyBook.java
package cn.spring.aopAnno;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class MyBook {
//在方法上面使用注解完成增强的配置,用这个注解方式来配置一下,
//这个before1方法要对哪个类的哪个方法来进行增强,用的是一种表达式的形式来告诉程序
@Before(value="execution(* cn.spring.aopAnno.Book.add(..))")
public void before1(){
System.out.println("before...");
}
}
test.java
package cn.spring.aopAnno;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
@Test
public void testaop(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
Book book=(Book)context.getBean("book");
book.add();
}
}
bean.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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!--1 配置对象 -->
<bean id="book" class="cn.spring.aopAnno.Book"></bean>
<bean id="myBook" class="cn.spring.aopAnno.MyBook"></bean>
</beans>
<!-- <aop:aspectj-autoproxy></aop:aspectj-autoproxy> -->
运行结果:
如果运行不出来,那肯定是和我输入的不一样,注意一些括号之类的输入。
比如:@Before(value="execution(* cn.spring.aopAnno.Book.add(..))")括号就挺多的。