大体流程:
1. 在public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h)方法中
1.1 通过getProxyClass0()方法生成并获得.class文件,加载至内存
1.2 通过newInstance()方法生成代理对象
2. 调用需要执行的方法,途中会调用InvocationHandler的invoke()方法(这里的invoke()方法会调用UserDaoImpl的query()方法)
基本配置:
UserDao.java
public interface UserDao {
public void query();
}
UserDaoImpl.java
@Component("dao")
public class UserDaoImpl implements UserDao {
@Override
public void query() {
System.out.println("I want to ask you a question!");
}
}
InvocationHandler接口的实现类
public class MyInvocationHandler implements InvocationHandler {
private UserDao userDao;
public MyInvocationHandler(UserDao userDao) {
this.userDao = userDao;
}
public UserDao getProxy() {
return (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
userDao.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
Object invoke = method.invoke(userDao, args);
System.out.println("after");
return invoke;
}
}
main方法
@RunWith(SpringRunner.class)
@SpringBootTest
@ComponentScan("com.example.demo")
public class DemoApplicationTests {
@Test
public static void main(String[] args) {
AnnotationConfigApplicationContext annotation