spring中使用代理模式

本文介绍了在 Spring 框架中如何使用代理模式,包括静态代理和动态代理。静态代理通过自定义代理类实现功能增强,但存在代理类多、方法多等问题。动态代理分为 JDK 动态代理和 CGLIB 动态代理,前者适用于有接口的对象,后者则可以处理无接口的对象。文中通过代码实例详细讲解了两种动态代理的实现和原理,并进行了性能分析,指出在 Spring 中如何根据对象是否实现接口选择合适的代理方式。
摘要由CSDN通过智能技术生成

1.代理模式

1.1.简介

1>.代理模式:客户端直接使用的都是代理对象,不知道真实的对象是谁,而代理对象可以在客户端和真实对象之间起到中介的作用;

2>.代理对象完全了包含真实对象,客户端使用的都是代理对象的方法,和真实对象没有直接关系(有间接关系);

3>.代理模式的职责:就是把不是真实对象该做的事情从真实对象中抽离,达到职责分离的设计思想;

4>.代理的目的:为了给目标方法做功能增强;

注意: 真实对象就是真正要处理/增强的对象(实现类/接口)!!


2.静态代理模式

2.1.简介

1>.静态代理:在程序运行前就已经存在代理类的字节码文件(/需要开发人员自己手动实现代理类),代理对象和真实对象的关系在运行前就已经确定了;业务类只需要关注业务逻辑本身,保证了业务的重用性;把真实对象隐藏起来,保护真实对象;

2>.说白了就是由程序员自己创建代理类,将真实对象中实现的方法放到代理类中再去实现一次(实现相同的接口,调用接口的方法去实现),然后在代理类中对实现的方法进行增强,客户端不能直接操作真实对象(方法),只能操作代理对象,这样一来,真实代码没有改动,但是功能却增强了;


2.2.代码实现

2.2.1.需求

模拟spring事务增强;


2.2.2.代码实现

1>.创建service接口及实现类

public interface IEmployeeService {
   

    void save(Employee employee);
    void update(Employee employee);
}
@Service
public class EmployeeServiceImpl  implements IEmployeeService {
   

    @Autowired
    private IEmployeeDao employeeDao;

    @Override
    public void save(Employee employee) {
   
        employeeDao.save(employee);
        System.out.println("保存成功");
    }

    @Override
    public void update(Employee employee) {
   
        employeeDao.update(employee);

        throw new RuntimeException("手动抛出异常");
    }
}

2>.定义事务管理器类

/**
 *模拟事务管理器
 */
@Component("txManager")
public class TransactionManager {
   

    public void begin(){
   
        System.out.println("开启事务");
    }

    public void commit(){
   
        System.out.println("提交事务");
    }

    public void rollback(){
   
        System.out.println("回滚事务");
    }
}

3>.定义静态代理类

/**
 * 静态代理类,将真实对象的方法重新实现一遍,要实现service接口
 */
@Component
public class StaticProxy implements IEmployeeService {
   

    //包含真实的对象/委托对象(接口)
    //引入接口,便于扩展,该接口的实现类对应的方法都可以实现增强
    @Autowired
    private IEmployeeService iEmployeeService;

    @Autowired
    private TransactionManager txManager;

    @Override
    public void save(Employee employee) {
   
        //开启事务
        txManager.begin();

        try {
   
            iEmployeeService.save(employee);

            txManager.commit();
        } catch (Exception e) {
   
            e.printStackTrace();

            txManager.rollback();
        }
    }

    @Override
    public void update(Employee employee) {
   
        //开启
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值