以银行列子诱导出面向切面编程的作用

思考一下一个存取应该有几个步骤
1.验证账号
2.开始事务
3.正在取钱
4.事务日志
5.结束事务	
先建一个接口
	public interface Bankdao {
   
	
	public void  saveMoney();
	public void  withDrawMoney();
	public void  transferMoney();
}

在实现这个接口的参数

package org.zzy.dao.impl;

import org.zzy.dao.Bankdao;

public class Bankdaoimpl implements Bankdao {
	
	private Admin admin;
	private Reman reman;
	private Logindao logindao;
	public Admin getAdmin() {
		return admin;
	}

	public void setAdmin(Admin admin) {
		this.admin = admin;
	}

	public Reman getReman() {
		return reman;
	}

	public void setReman(Reman reman) {
		this.reman = reman;
	}

	public Logindao getLogindao() {
		return logindao;
	}

	public void setLogindao(Logindao logindao) {
		this.logindao = logindao;
	}

	@Override
	public void saveMoney() {
		// TODO Auto-generated method stub
		admin.Admint();
		reman.beginReman();
		System.out.println("正在存钱");	
		reman.endReman();
		logindao.login();
	}

	@Override
	public void withDrawMoney() {
		admin.Admint();
		reman.beginReman();
		// TODO Auto-generated method stub
		System.out.println("正在取钱");
		reman.endReman();
		logindao.login();
	}
	
}





然后在根据业务逻辑思考 因该判断用户

public void Admint(){
	//验证账号
	System.out.println("验证账号");
}

然后是事务日志

package org.zzy.dao.impl;

public class Logindao {

	// 事务日志事务的运行过程
	public void login() {
		System.out.println("事务日志");
	}
}

最后是开始与结束

package org.zzy.dao.impl;

import org.aspectj.lang.ProceedingJoinPoint;

public class Reman {

	public void beginReman(){
		System.out.println("开始事务");
	}
	public void endReman(){
		System.out.println("结束事务");
	}
	public void reamdadk(ProceedingJoinPoint point){
		
		try {
			beginReman();
			point.proceed();
			endReman();
		} catch (Throwable e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

然后该配置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-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
	<bean id="admin" class="org.zzy.dao.impl.Admin"></bean>
	<bean id="reman" class="org.zzy.dao.impl.Reman"></bean>
	<bean id="logindao" class="org.zzy.dao.impl.Logindao"></bean>
	<bean id="bankdao" class="org.zzy.dao.impl.Bankdaoimpl">
		<property name="admin" ref="admin"></property>
		<property name="reman" ref="reman"></property>
		<property name="logindao" ref="logindao"></property>

	</bean>
</beans>

最后做一个测试类

package org.zzy.text;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.zzy.dao.Bankdao;

public class Text1 {

	public static void main(String[] args) {
		text1();
	}

	private static void text1() {
		// TODO Auto-generated method stub
		ApplicationContext ad=new ClassPathXmlApplicationContext("spring.xml");
		Bankdao bc=ad.getBean("bankdao",Bankdao.class);
		bc.saveMoney();
		
	}

}

得出结果
在这里插入图片描述
在思考一下 没一次新的功能都要在添加复制

		admin.Admint();
		reman.beginReman();
		reman.endReman();
		logindao.login();

这样一个还好,如果是一百个,一千个,会造成大量的代码冗余,所以就可以用面向切面编程aop

在xml文件里面加了aop 然后注释了一些属性

<?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-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
	<bean id="admin" class="org.zzy.dao.impl.Admin"></bean>
	<bean id="reman" class="org.zzy.dao.impl.Reman"></bean>
	<bean id="logindao" class="org.zzy.dao.impl.Logindao"></bean>
	<bean id="bankdao" class="org.zzy.dao.impl.Bankdaoimpl">
		<!--  <property name="admin" ref="admin"></property>
		<property name="reman" ref="reman"></property>
		<property name="logindao" ref="logindao"></property>-->

	</bean>

	<aop:config>
		<!-- 切入点 ,什么时候,执行什么切入进来 -->
		<aop:pointcut expression="execution(* org.zzy.dao.impl.*.*(..))"
			id="ok" />
		<!--切面 ,用来做事情-执行业务逻辑前-你要做什么或执行什么事情 -->
		<aop:aspect ref="admin">
			<aop:before method="Admint" pointcut-ref="ok" />
		</aop:aspect>

		<aop:aspect ref="reman">
			<aop:around method="reamdadk" pointcut-ref="ok" />
		</aop:aspect>

		<aop:aspect ref="logindao">
			<aop:after method="login" pointcut-ref="ok" />
		</aop:aspect>
	</aop:config>
</beans>

然后在bankdao里面的内容和调参数注释掉

admin.Admint();
reman.beginReman();
reman.endReman();
logindao.login();
package org.zzy.dao.impl;

import org.zzy.dao.Bankdao;

public class Bankdaoimpl implements Bankdao {
//	思考一下一个存取应该有几个步骤
//	1.验证账号
//	2.开始事务
//	3.正在取钱
//	4.事务日志
//	5.结束事务
	
//	private Admin admin;
//	private Reman reman;
//	private Logindao logindao;
//	public Admin getAdmin() {
//		return admin;
//	}
//
//	public void setAdmin(Admin admin) {
//		this.admin = admin;
//	}
//
//	public Reman getReman() {
//		return reman;
//	}
//
//	public void setReman(Reman reman) {
//		this.reman = reman;
//	}
//
//	public Logindao getLogindao() {
//		return logindao;
//	}
//
//	public void setLogindao(Logindao logindao) {
//		this.logindao = logindao;
//	}

	@Override
	public void saveMoney() {
		// TODO Auto-generated method stub
//		admin.Admint();
//		reman.beginReman();
		System.out.println("正在存钱");	
//		reman.endReman();
//		logindao.login();
	}

	@Override
	public void withDrawMoney() {
//		admin.Admint();
//		reman.beginReman();
		// TODO Auto-generated method stub
		System.out.println("正在取钱");
//		reman.endReman();
//		logindao.login();
	}
	
}

由此可见aop面向切面编程的重要性,同时也解决了大量的代码冗余。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值