美文网首页
Spring(5) - (10)AOP - 静态代理

Spring(5) - (10)AOP - 静态代理

作者: 小白201808 | 来源:发表于2018-09-26 09:30 被阅读63次
代理模式:客户端直接使用的都是代理对象,不知道真实对象是谁,此时代理对象可以在客户端和真实对象之间起中介作用。
  1.代理对象完全包含真实对象,客户端使用的都是代理对象的方法,和真实对象没有直接关系
  2.代理模式的职责:把不是真实对象该做的事情从真实对象上提取出来————职责分明;
静态代理:在程序运行前就已经存在代理类的字节码文件,代理对象和真实对象的关系在运行前就确定了。

代码演示

1.domain包

//就一个超级简单的Employee类
package com.keen.proxy.domain;

public class Employee {

}

2.dao包中的类

//(1)dao接口(增删改查)
package com.keen.proxy.dao;

import com.keen.proxy.domain.Employee;

public interface EmployeeDAO {
    public void save(Employee e);
    
    public void update(Employee e);
}


//dao的实现类
package com.keen.proxy.dao;

import com.keen.proxy.domain.Employee;

public class EmployeeDAOimpl implements EmployeeDAO{

    public void save(Employee e) {
        System.out.println("保存操作");
        
    }
    public void update(Employee e) {
        System.out.println("更新操作");
        
    }

}

3.service包

// IEmployeeService 接口(代理接口:由代理和真正的主人去实现)
package com.keen.proxy.service;

import com.keen.proxy.domain.Employee;

public interface IEmployeeService {
    void save(Employee e);
    void update(Employee e);
}

//IEmployeeServiceImpl (主人真实类)
package com.keen.proxy.service;

import com.keen.proxy.dao.EmployeeDAO;
import com.keen.proxy.domain.Employee;
//真实类(委托对象)
public class IEmployeeServiceImpl  implements IEmployeeService{

    private EmployeeDAO dao;
    public void setDao(EmployeeDAO dao) {
        this.dao = dao;
    }
    public void save(Employee e) {
        dao.save(e);
        System.out.println("保存成功");
        
    }

    public void update(Employee e) {
        dao.update(e);
        //为了演示事务回滚,故意出错
        throw new RuntimeException("故意出错");
        
    }

}

4.tx包中的事务类(TransactionManager)

package com.keen.proxy.tx;
//模拟事务管理器
public class TransactionManager {
    public void begin() {
        System.out.println("开启事务");
    }
    public void commit() {
        System.out.println("提交事务");
    }
    public void rollback() {
        System.out.println("回滚事务");
    }

}

5.proxy包

package com.keen.proxy.proxy;
//静态代理类

import com.keen.proxy.domain.Employee;
import com.keen.proxy.service.IEmployeeService;

import com.keen.proxy.tx.TransactionManager;

public class IEmployeeServiceProxy implements IEmployeeService
{
    private IEmployeeService targer;//真实对象/委托对象

    private TransactionManager txManager;//事务管理器
    
     public void setTarger(IEmployeeService targer) {
        this.targer = targer;
    }
    public void setTxManager(TransactionManager txManager) {
        this.txManager = txManager;
    }
    public void save(Employee e) {
       //事务操作
        txManager.begin();
        try {
            targer.save(e);
            txManager.commit();
        } catch (Exception e1) {
            
            e1.printStackTrace();
            txManager.rollback();
        }
        
        
    }

    @Override
    public void update(Employee e) {
        //事务操作
                txManager.begin();
                try {
                    targer.update(e);
                    txManager.commit();
                } catch (Exception e1) {
                    
                    e1.printStackTrace();
                    txManager.rollback();
                }
                
    
    }

}

(6).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: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-4.3.xsd">
<!-- di注解解析器 -->
<!--  <context:annotation-config/> -->

<!--IOC注解解析器  -->
<!-- <context:component-scan base-package="com.keen.proxy"/> -->
<bean id = "employeeDAO" class = "com.keen.proxy.dao.EmployeeDAOimpl"/>

<!-- 事务管理器 -->
<bean id = "transactionManager" class = "com.keen.proxy.tx.TransactionManager"/>

<!-- 代理对象 -->
<bean id = "employeeServiceProxy" class = "com.keen.proxy.proxy.IEmployeeServiceProxy" >

  <property name="txManager" ref ="transactionManager"/>
  <property name="targer" >
    <!-- 把employeeService作为内部bean -->
        <bean class ="com.keen.proxy.service.IEmployeeServiceImpl">
           <property name = "dao" ref = "employeeDAO"/>
        </bean>
  </property>
</bean>

</beans>

(7)测试类

package com.keen.proxy;


import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

import com.keen.proxy.domain.Employee;
import com.keen.proxy.service.IEmployeeService;


@SpringJUnitConfig
public class AutoTest {
    @Autowired 
    private IEmployeeService service;
    
    
    @Test
    void testSave() throws Exception {
        service.save(new Employee());
    }
    @Test
    void testUpdate() throws Exception {
        service.update(new Employee());
    }
    
}

静态代理的优缺点

 1.优点:
  (1)让业务类只需要关注业务逻辑
   (2) 把真实对象隐藏起来了,保护了真实对象
 2.缺点:
   (1)代理对象的某个接口只能服务于某一种类型的对象,也就是说每一个真实的对象有得创建一个代理对象
   (2)如果需要代理的方法很多,则要为每一种方法都进行代理处理
   (3)如果接口增加一个方法,除了所有实现类需要实现这个方法外,代理类也需要实现此方法。   

相关文章

  • spring aop 汇总

    静态代理、动态代理和cglib代理 aop 使用 Spring AOP - 注解方式使用介绍spring aop ...

  • Spring AOP 实现原理

    Spring AOP 实现原理 静态代理 众所周知 Spring 的 AOP 是基于动态代理实现的,谈到动态代理就...

  • 带你初识Java的代理模式

    Spring AOP是基于动态代理设计模式实现的,相对的就有静态代理 动态代理和静态代理 静态代理 对于静态代理,...

  • Spring(5) - (10)AOP - 静态代理

    代理模式:客户端直接使用的都是代理对象,不知道真实对象是谁,此时代理对象可以在客户端和真实对象之间起中介作用。 静...

  • 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP

    文章目录 Java的静态代理 静态代理的优缺点 ABAP的静态代理 Spring AOP的动态代理 JDK动态代理...

  • Maven项目&Spring AOP基础(一)

    Spring AOP的底层机制就是动态代理。而代理模式又分为:静态代理、动态代理。 静态代理的角色分为:抽象角色 ...

  • 2018-03-21

    与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码...

  • Spring之AOP之底层实现

    Spring之AOP之底层实现 静态代理实现 定义IStudnetService接口 定义StudentServi...

  • 2018-10-03

    Spring aop 是通过代理实现的,代理有静态代理,jdk动态代理和cglib动态代理,代理就像我们生活中的房...

  • 代理模式的理解,以及由此引发对设计模式的理解

    在看狂神讲Spring AOP的时候,又顺便讲到了代理模式。 静态代理 静态代理模式还是比较好理解的。就是在客户和...

网友评论

      本文标题:Spring(5) - (10)AOP - 静态代理

      本文链接:https://www.haomeiwen.com/subject/vufdoftx.html