一、核心问题

    1. AOP如何创建动态代理类(动态字节码技术)
    2. Spring工厂如何创建加工代理对象

    通过原始对象的id值获得代理对象

    二、动态代理类的创建

    1. JDK的动态代理
      • Proxy.proxyNewInstance()方法的参数详解

    image.png
    image.png

    • 编码

      1. public static void main(String[] args) {
      2. /*
      3. * 1.借用类加载器 TestJDKProxy或UserServiceImpl
      4. * 2.JDK 8.0 以前,内部类使用的外部类变量需要加final限定符,JDK8.0以后不再需要
      5. * */
      6. // 创建原始对象
      7. UserService userService=new UserServiceImpl();
      8. //创建JDK动态代理
      9. InvocationHandler handler= new InvocationHandler(){
      10. @Override
      11. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      12. System.out.println("-------log--------");
      13. //原始方法运行
      14. Object ret=method.invoke(userService,args);
      15. return ret;
      16. }
      17. };
      18. UserServiceProxy userServiceProxy= (UserServiceProxy) Proxy.newProxyInstance(TestJDKProxy.class.getClassLoader(),
      19. userService.getClass().getInterfaces(),handler);
      20. userServiceProxy.login("zhangsan","123456");
      21. userServiceProxy.register(new User());
      22. }
      23. }
    1. CGLIB的动态代理
      • CGLIB创建代理的原理:父子继承关系创建代理对象,原始类作为父类,代理类作为子类,这样既可保证二者方法一致,同时可在代理类中提供额外功能

    image.png

    • CGLIB的编码 ```java public class TestCglib { public static void main(String[] args) { // 1.创建原始对象 UserService userService=new UserService(); /*

      • 2.通过CGLIB创建动态代理对象
      • Proxy.newProxyInstance(classloader,interface,invocationHandler);
      • Enhancer.setClassLoader();
      • Enhancer.setSuperClass();
      • Enhancer.setCallback(); —->MethodInterceptor(cglib)
      • Enhancer.create()——>代理
      • */ Enhancer enhancer=new Enhancer(); enhancer.setClassLoader(UserService.class.getClassLoader()); enhancer.setSuperclass(UserService.class);

        MethodInterceptor methodInceptor=new MethodInterceptor(){ // 等同于InvocationHandler——invoke @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        1. System.out.println("TestCglib.intercept");
        2. Object ret=method.invoke(userService,objects);
        3. return ret;

        } };

        enhancer.setCallback(methodInceptor);

        UserService userServiceProxy= (UserService) enhancer.create(); userServiceProxy.login(“libai”,”123456”); userServiceProxy.register(new User()); } }

    1. 3. 总结
    2. - JDK动态代理 Proxy.newProxyInstance() 通过接口创建代理的实现类
    3. - Cglib Enhancer 通过继承父类创建的接口类
    4. 三、Spring工厂如何加工原始对象<br />思路分析:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22270263/1627978526467-1db7f0c0-f0d8-4921-b65b-87ebcf67c19e.png#align=left&display=inline&height=450&margin=%5Bobject%20Object%5D&name=image.png&originHeight=450&originWidth=965&size=223159&status=done&style=none&width=965)<br />编码:
    5. ```java
    6. public class BeanPostProcessorProxy implements BeanPostProcessor {
    7. @Override
    8. /*
    9. * Proxy.newProxyInstance();
    10. * */
    11. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    12. InvocationHandler handler=new InvocationHandler() {
    13. @Override
    14. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    15. System.out.println("-----postProcessAfterInitialization----log-----");
    16. return method.invoke(bean,args);
    17. }
    18. };
    19. return Proxy.newProxyInstance(BeanPostProcessorProxy.class.getClassLoader(),bean.getClass().getInterfaces(),handler);
    20. }
    21. @Override
    22. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    23. return bean;
    24. }
    25. }
    1. <bean id="userService" class="com.baizhi.factory.UserServiceImpl"/>
    2. <!--
    3. 1.实现BeanPostProcessor进行加工
    4. 2.配置文件中对BeanPostProcessor进行配置
    5. -->
    6. <bean id="beanPostProcessorProxy" class="com.baizhi.factory.BeanPostProcessorProxy"/>