AOP 面向切面的编程,
AOP可以实现“业务代码”与“关注点代码”分离
// 保存一个用户
public void add(User user) {
Session session = null;
Transaction trans = null;
try {
session = HibernateSessionFactoryUtils.getSession(); // 【关注点代码】
trans = session.beginTransaction(); // 【关注点代码】
session.save(user); // 核心业务代码
trans.commit(); //…【关注点代码】
} catch (Exception e) {
e.printStackTrace();
if(trans != null){
trans.rollback(); //..【关注点代码】
}
} finally{
HibernateSessionFactoryUtils.closeSession(session); ..【关注点代码】
}
}
分析总结:
关注点代码,就是指重复执行的代码。
业务代码与关注点代码分离,好处?
--à 关注点代码写一次即可;
-à开发者只需要关注核心业务;
-à运行时期,执行核心业务代码时候动态植入关注点代码; 【代理】
下面是一个简单的具体实现例子1.IUserDao
package cn.itcast.d_myaop;
//接口
public interface IUserDao {
void save();
}
2.UserDao
package cn.itcast.d_myaop;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class UserDao implements IUserDao{
// 重复执行代码形成的一个类
@Resource
private Aop aop;
@Override
public void save() {
aop.begin();
System.out.println("----核心业务:保存!!!----");
aop.commit();
}
}
3.Aop
package cn.itcast.d_myaop;
import org.springframework.stereotype.Component;
@Component
public class Aop{
// 重复执行的代码
public void begin() {
System.out.println("开始事务/异常");
}
public void commit() {
System.out.println("提交事务/关闭");
}
}
4.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="cn.itcast.d_myaop"></context:component-scan>
</beans>
5.Junit
package cn.itcast.d_myaop;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
ApplicationContext ac=new ClassPathXmlApplicationContext("cn/itcast/d_myaop/bean.xml");
@Test
public void testApp(){
IUserDao userDao=(IUserDao) ac.getBean("userDao");
userDao.save();
}
}