利用spring框架实现了一个简单的静态代理,在这里做一些记录,把学习的过程记录下来。先讲一讲代理,代理类和被代理的类有共同的父类或父接口,这样在任何使用被代理类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理,使被代理类只关注本身的逻辑,提高了代码的重用性。静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
实体类:
package com.spriProxy.entity;
public class User {
private int id;
private String userName;
private String passWord;
public User(String userName){
this.userName = userName;
}
……//set,get方法
}
接口:
package com.spriProxy.dao;
import com.spriProxy.entity.User;
public interface UserDao {
//添加用户
public void addUser(User user);
//删除用户
public void deleteUser(User user);
//更新用户
public boolean updateUser(User user);
}
被代理类:
package com.spriProxy.dao.impl;
import org.springframework.stereotype.Repository;
import com.spriProxy.dao.UserDao;
import com.spriProxy.entity.User;
public class UserDaoImpl implements UserDao {
@Override
public void addUser(User user) {
System.out.println("增加用户……"+user.getUserName());
}
@Override
public void deleteUser(User user) {
System.out.println("删除用户……");
}
@Override
public boolean updateUser(User user) {
System.out.println("更新用户……");
return true;
}
}
代理类:
package com.spriProxy.util.impl;
import org.springframework.stereotype.Repository;
import com.spriProxy.dao.UserDao;
import com.spriProxy.entity.User;
import com.spriProxy.util.Level;
import com.spriProxy.util.Logger;
public class UserProxy implements UserDao {
private UserDao userDao;
//此处注入的Dao是userDaoImpl
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
//调用UserDaoImpl的方法
@Override
public void addUser(User user) {
Logger.info(Level.DEBUGE, "DEBUGE,增加用户前");
userDao.addUser(user);
Logger.info(Level.INFO, "INFO,增加用户后");
}
@Override
public void deleteUser(User user) {
}
@Override
public boolean updateUser(User user) {
return false;
}
}
代理类和被代理类都实现了UserDao这个接口,在spring.xml配置文件中将实现了UserDao的UserProxy注入到UserSeriveImpl中,利用
接口回调调用addUser方法。
spring.xml文件:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:p="http://www.springframework.org/schema/p"
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-3.0.xsd">
<bean id="userServiceImpl" class="com.spriProxy.service.impl.UserServiceImpl">
<property name="userDao" ref="userProxy"></property>
</bean>
<bean id="userDaoImpl" class="com.spriProxy.dao.impl.UserDaoImpl"/>
<bean id="userProxy" class="com.spriProxy.util.impl.UserProxy">
<property name="userDao" ref="userDaoImpl"></property>
</bean>
</beans>
测试类:
package com.spriProxy.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spriProxy.entity.User;
import com.spriProxy.service.impl.UserServiceImpl;
public class Test {
public static void main(String[] args) {
User user = new User("StaticProxy");
ApplicationContext context = new ClassPathXmlApplicationContext("com/spriProxy/config/spring.xml");
UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("userServiceImpl");
userServiceImpl.addUser(user);
}
}
运行结果: