2 AOP 面向切面编程
当软件系统功能需要扩展时(添加一个新的功能),不能在原始代码上进行修改,而是以横切面的方式加入到系统中,当不需要这个功能时,可以把横切面直接撤走,不会影响系统原始的功能。
就像一个多层的抽屉,抽哪个就用哪个。
AOP 采取横向抽取机制,取代了传统纵向继承体系的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。
接下来看一些概念
接下来 看个静态代理的例子 这是项目结构
其中的userDaoImpl和userDaoImplProxy都实现了UserDao这个接口。
然后我现在要给userDaoImpl加新的功能 实现处理日志
我没有直接去修改userDaoImpl的源码 而是添加了userDaoImplProxy
userDaoImplProxy就是userDaoImpl的代理类。
当我想使用具有处理日志的功能时 我就使用 userDaoImplProxy
当不想使用 处理日志时 我就使用userDaoImpl类
这是userDaoImplProxy
package com.xindian.proxy;
import java.util.List;
import com.xindian.dao.UserDao;
import com.xindian.dao.impl.userDaoImpl;
import com.xindian.pojo.User;
import com.xindian.util.CreateLog;
public class UserDaoImplProxy implements UserDao{
private userDaoImpl userDaoImpl;
public void UserDaoImplProxy(userDaoImpl userDaoImpl)
{
this.userDaoImpl=userDaoImpl;
}
@Override
public void save(User user) {
// TODO Auto-generated method stub
CreateLog.log();
try {
userDaoImpl.save(user);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
package com.xindian.dao.impl;
import com.xindian.dao.UserDao;
import com.xindian.pojo.User;
import com.xindian.util.CreateLog;
public class userDaoImpl implements UserDao {
private JdbcTemplate template;
public JdbcTemplate getTemplate() {
return template;
}
public void setTemplate(JdbcTemplate template) {
this.template = template;
}
@Override
public void save(User user) throws Exception{
// TODO Auto-generated method stub
String sql="insert into user(name,age) values(?,?)";
//插入的参数
Object []args=new Object[]{user.getName(),user.getAge()};
//插入的类型
int[]argTypes=new int[]{Types.VARCHAR,Types.VARCHAR};
template.update(sql, args, argTypes);
}
}
在UserDaoImplProxy中save()方法中调用的这个处理日志的方法CreateLog.log();就是通知
这个UserDaoImplProxy就是切面,调用通知的这个save()方法就是切入点。
以上为本人的学习记录,如有错误,欢迎指正。