代理模式是Java常见的设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。
代理模式就算在不修改目标类源代码的情况下,对其进行功能的增强。
代理模式可以有两种实现的方式,一种是静态代理类,另一种是各大框架都喜欢的动态代理。
静态代理:代理对象是由程序猿创建的,而且一个Proxy一般就只能代理一类目标对象(实现共同Subject接口),相当于代理类和被代理类关系提前要确定。
动态代理:可以通过jdk和cglib两种方式实现
jdk动态代理是SUN公司提供的,是官方提供的代理方式。
cglib是第三方提供的代理方式。
jdk动态代理目标类必须实现接口
接口类
public interface IUserService {
void save(Object obj);
void update(Object obj);
void delete(int id);
List findAll();
Object findById(int id);
}
实现类
public class UserServiceImpl implements IUserService {
@Override
public void save(Object obj) {
System.out.println("保存用户");
}
@Override
public void update(Object obj) {
System.out.println("修改用户");
}
@Override
public void delete(int id) {
System.out.println("删除用户");
}
@Override
public List findAll() {
System.out.println("查询列表");
return null;
}
@Override
public Object findById(int id) {
System.out.println("根据id查找");
return null;
}
}
切面类
public class TxAspect {
public void beginTransaction(){
System.out.println("开启事务");
}
public void afterAdvice(){
System.out.println("提交事务");
}
}
测试类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ljp.service.IUserService;
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
IUserService bean = (IUserService) ac.getBean("target");
bean.delete(1);
System.out.println(bean.getClass());
}
}
测试结果
用了动态代理,就可以在原来代码的基础上做操作,这就是AOP即面向切面编程