Spring署理对象的原理

Spring代理对象的原理

package com.dao;

import org.springframework.stereotype.Component;

import com.model.User;
@Component("userDao")
public class UserDaoImpl implements UserDao {

 public void save(User user) {
  //Hibernate
  //JDBC
  //XML
  //NetWork
  System.out.println(" user save !");
 }

 public void delete(User user) {
  System.out.println(" delete save !");
 }

}

日志拦截类:

package com.spring;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//需要实现InvocationHandler接口
public class LogInterceptor implements InvocationHandler {
    //被代理对象
 private Object target;
   
    public void beforeMethod(Method m) {
     System.out.println(m.getName()+" start logger!!!!!");
    }
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  this.beforeMethod(method);
  method.invoke(target, args);
  return null;
 }
 public Object getTarget() {
  return target;
 }
 public void setTarget(Object target) {
  this.target = target;
 }

}

测试类:

package com.test;

import java.lang.reflect.Proxy;

import com.dao.UserDao;
import com.dao.UserDaoImpl;
import com.model.User;
import com.spring.LogInterceptor;

public class InterceptorTest {

 public static void main(String[] args) {
     UserDao userDao = new UserDaoImpl();
     LogInterceptor log = new LogInterceptor();
     log.setTarget(userDao);
    UserDao userDaoProxy = (UserDao)Proxy.newProxyInstance(UserDao.class.getClassLoader(), new Class[]{UserDao.class}, log);
   System.out.println(userDaoProxy.getClass());
    userDaoProxy.save(new User());
    userDaoProxy.delete(new User());
 }

}