常规代理分类:
1、静态代理:
特点:就是类文件可以在项目中看到,自己创建的之类的。
主要形式:继承型 和 聚合性(推荐)
缺点: 就是有点像封装,每次要创建新的类文件,复杂了的业务变化容易形成非常多类文件。
2、动态代理:
特点:没有类文件,就是直接是 byte[] 字节 到 jvm 中 。
主要例子:JDK 动态代理, cglib 代理
举例:Mybatis 有通过JDK 动态代理把一个接口获得一个对象出来。
@Configuration
Appconfig.Class 中可以不加@Configuration,加了是为了让Config 里面的 自己写的@Bean 不是原型,是成为单例。同时 Config 里是cglib 代理。
JDK 动态代理的三个参数
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h)
1、Class Loader : 主要用来动态加载一个类。(某个类一开始被没有在项目当中,可以在磁盘上,此时需要Loader);
2、Class<?>[] : 得到一个返回对象;
3、InvocationHandler的实现类: 代理方法,做些增强的内容,都在这个InvocationHandler 中。(在InvocationHandler 实现类中,主要是第二个参数Method对象。这个参数相当于通过反射机制,获得了方法对象。通过这个Method.getReturn() 可以获得方法返回的类型)