Spring静态代理的简单实现

基本要素

  • 原始对象:需要被代理的对象,核心功能;
  • 附加对象:用于修饰原始对象的附加功能;
  • 代理对象:融合原始对象与附加对象

相关类

UserDao

package com.yusian.dao;
import com.yusian.domain.User;
public interface UserDao {

    void register(User user);

    boolean login(String username, String password);
}

UserDaoImpl

package com.yusian.dao;

import com.yusian.domain.User;

public class UserDaoImpl implements UserDao{
    @Override
    public void register(User user) {
        System.out.println("UserDaoImpl.register-----核心功能实现");
    }

    @Override
    public boolean login(String username, String password) {
        System.out.println("UserDaoImpl.login-----核心功能实现");
        return false;
    }
}

UserDaoProxy

package com.yusian.dao;

import com.yusian.domain.User;

public class UserDaoProxy implements UserDao{

    private UserDao userDao = new UserDaoImpl();

    @Override
    public void register(User user) {
        System.out.println("UserDaoProxy.register---附加功能,比如打印日志");
        userDao.register(user);
    }

    @Override
    public boolean login(String username, String password) {
        System.out.println("UserDaoProxy.login---附加功能,比如打印日志");
        return userDao.login(username, password);
    }
}

调用及结果

applicationContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userDao" class="com.yusian.dao.UserDaoProxy"/>
</beans>

测试代码

public class ProxyTest {

    @Test
    public void staticProxyTest() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDaoProxy userDao = (UserDaoProxy) ctx.getBean("userDao");
        userDao.register(new User());
    }
}

输出结果

UserDaoProxy.register---附加功能,比如打印日志
UserDaoImpl.register-----核心功能实现

Process finished with exit code 0

总结

  1. 简单的静态代理类似组合,代理对象实现与原始对象相同的接口;
  2. 将原始对象做为代理对象的成员,核心功能的实现是直接调用原始对象的方法;
  3. 在调用原始对象方法之前,调用附加功能,实现功能的追加;
  4. 优点是不需要修改原有的类,实现了功能的扩展;
  5. 缺点是原始对象与代理对象一一对应,不够灵活,因此有一定的局限性;

One thought on “Spring静态代理的简单实现

  1. Pingback: Proxy与CGLib实现动态代理 | 年年有"余"

Leave a Reply