Spring 静态代理模式

一、静态代理模式

代理模式:客户端直接使用的都是代理对象,不知道真实对象是谁,此时代理对象可以在客户端和真实对象之间起到中介的作用。
     1、代理对象完全包含真实对象,客户端使用的都是代理对象的方法,和真实对象没有直接关系;
     2、代理模式的职责:把不是真实对象该做的事情从真实对象上撇开——职责清晰;
静态代理(proxy):
    在程序运行前就已经存在代理类的字节码文件,代理对象和真实对象的关系在程序运行前就确定了。

二、代码示例

接口及其实现类

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

@Service("target")
public class  EmployeeServiceImpl  implements IEmployeeService{
    @Autowired
     private IEmployeeDao employeeDao ;
    @Override
    public void save(Employee e) {
        employeeDao.save(e);
    }
    @Override
    public void update(Employee e) {
        employeeDao.update(e);
    }
}

事物管理器

@Component("txManager")
public class TransactionManager {
    public  void  begin(){
        System.out.println("事物开启。。。。。");
    }
    public  void  commit(){
        System.out.println("事物提交。。。。。");
    }
    public  void  rollback(){
        System.out.println("事物回滚。。。。。");
    }

}

静态代理类

**
 * EmployeeServiceImpl 的代理类
 */
@SuppressWarnings("all")
@Component("proxy")
public class EmployeeServiceImplProxy implements IEmployeeService {

    // 用接口,面向接口编程
    @Autowired
    private IEmployeeService target;
    // 事物管理器
    @Autowired
    @Qualifier("txManager")
    private TransactionManager txManager;

    @Override
    public void save(Employee e) {
        txManager.begin();
        try {
            target.save(e);
            txManager.commit();
        } catch (Exception e1) {
            txManager.rollback();
            e1.printStackTrace();
        }
    }

    @Override
    public void update(Employee e) {
        txManager.begin();
        try {
            target.update(e);
            txManager.commit();
        } catch (Exception e1) {
            txManager.rollback();
            e1.printStackTrace();
        }
    }
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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
        ">

    <!-- 解析autowired,resource,qualifier-->
    <context:annotation-config />
    <!--去哪些包下面去扫描组件-->
    <context:component-scan base-package="com.shenzhenair.day02.common" />
    <context:component-scan base-package="com.shenzhenair.day02.static_proxy" />

    <!--配置事物管理器-->
    <!--<bean name="txManager"  class="com.shenzhenair.day02.common.TransactionManager" />-->
    <!--配置dao-->
    <!--<bean name="employeeDao"  class="com.shenzhenair.day02.common.dao.impl.EmployeeDaoImpl" />-->
    <!--配置service-->
    <!--<bean name="employeeService"  class="com.shenzhenair.day02.common.service.impl.EmployeeServiceImpl" >-->
        <!--<property name="employeeDao"  ref="employeeDao" />-->
    <!--</bean>-->
    <!--配置代理-->
  <!--  <bean name="employeeServiceImplProxy"  class="com.shenzhenair.day02.static_proxy.EmployeeServiceImplProxy" >
        <property name="txManager"  ref="txManager" />
        &lt;!&ndash;配置真实的代理对象,隐藏在代理对象内部,外界无法进行访问&ndash;&gt;
        <property name="target"   >
            <bean class="com.shenzhenair.day02.common.service.impl.EmployeeServiceImpl" >
                <property name="employeeDao" ref="employeeDao" />
            </bean>
            </property>
    </bean>-->




</beans>

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:com/shenzhenair/day02/static_proxy/staticProxy.xml")
public class EmployeeProxyTest {
    @Autowired
    private IEmployeeService proxy;
    @Test
    public void testSave(){
       proxy.save(new Employee());
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值