Spring学习日记(一)AOP的初步实现

本文详细介绍如何在myEclipse中配置Spring框架,实现AOP(面向切面编程)。通过定义业务层接口、成员类及其实现,展示AOP在日志记录和事务处理中的应用。

工具: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..*.*(..)))":使用“..”表示匹配任意多个参数,如果使用的是“*”则表示匹配任意一个参数

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值