思考一下一个存取应该有几个步骤
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面向切面编程的重要性,同时也解决了大量的代码冗余。