要实现可开关的cglib代理,需要依赖@Import,ImportSelector,BeanPostProcessor原理就是依赖@Import注解的开关作用,动态将BeanPostProcessor的实现添加到spring容器,通过beanPostProcessor插手bean的实例化过程,我们就能控制是返回代理对象还是目标对象。
-
先定义一个我们自己的注解,依赖了@Import
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(CglibImportSelector.class) public @interface EnableCglib { }
2.创建一个ImportSelector,实现方法的返回类全名会注册到spring
public class CglibImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{CglibBeanPostProcessor.class.getName()}; } }
3.创建一个BeanPostProcessor,这里有简单的判断加了自定义注解@Cglib的类就会返回代理对象否则返回目标对象
public class CglibBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitializa