工具:myEclipse
一、准备工作
1、新建一个web project
2、导入spring开发包:项目文件——(右键)configure Facets——install spring facets
3、配置annotaion
(1)增加新的命名空间:applicationContext.xml——(右键)open with——myEclipse spring config editor
(2)设置Annotation的支持包:在applicationContext.xml中写:
<context:annotation-config/>
<context:component-scan base-package="cn.mldn"/>
4、配置aop:开启AOP命名空间
二、原始操作
1、定义业务层操作接口
//定义业务层接口
public interface IMemberService {
public boolean insert(Member vo);
}
2、定义成员
public class Member {
private String mid;
private String name;
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Member [mid=" + mid + ", name=" + name + "]";
}
}
3、业务层接口的子类
package cn.mldn.service.impl;
import org.springframework.stereotype.Service;
import cn.mldn.service.IMemberService;
import cn.mldn.vo.Member;
@Service
public class MemberServiceImpl implements IMemberService {
@Override
public boolean insert(Member vo) {
System.out.println("【数据层调用】member="+vo );
return false;
}
}
4、写测试程序
package cn.mldn.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.mldn.service.IMemberService;
import cn.mldn.vo.Member;
public class TestMemberTest {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
IMemberService service=ctx.getBean("memberServiceImpl",IMemberService.class);
Member vo=new Member();
vo.setMid("mldn");
vo.setName("你好");
System.out.println(service.insert(vo));
}
}
5、运行结果:
【数据层调用】member=Member [mid=mldn, name=你好]
false
三、运用AOP的智慧
1、定义切面处理类
package cn.mldn.aop;
@Component
public class ServiceAspect {
public void serviceBefore(){
System.out.println("【AOP切面】执行日志记录操作");
}
public void serviceAfter(){
System.out.println("【AOP切面】执行事务处理操作");
}
}
2、修改applicationContext.xml文件
定义切面引用
<aop:config>
<!-- 定义切入点 -->
<aop:pointcut expression="execution(* cn.mldn..*.*(..)))" id="pointcut"/>
<!-- 定义面向方面的处理类 -->
<aop:aspect ref="serviceAspect">
<aop:before method="serviceBefore" pointcut-ref="pointcut"/>
<aop:after method="serviceAfter" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
3、运行结果:
从结果可以看出,在业务层操作的前后,分别调用了业务层调用前和调用结束的辅助操作
【AOP切面】执行日志记录操作
【数据层调用】member=Member [mid=mldn, name=你好]
【AOP切面】执行事务处理操作
false
4、pointcut的表达式语法:
expression="execution(* cn.mldn..*.*(..)))"
execution(修饰符匹配?返回值类型 操作类型的匹配?名称匹配(参数匹配) 抛出异常匹配)
-
修饰符:public(默认)、private、智能出现0/1次
-
返回值:*表示返回任意类型 "execution(* cn.mldn..*.*(..)))"
-
名称匹配:表示是使用这个切面的具体类。"execution(* cn.mldn..*.*(..)))"
而如果出现了“..”,则表示在任意子包。“*.*”:任意类的任意方法
- 方法参数:"execution(* cn.mldn..*.*(..)))":使用“..”表示匹配任意多个参数,如果使用的是“*”则表示匹配任意一个参数