单例bean中使用多例bean
1.lookup-method方式实现
当serviceB中调用getServiceA的时候,系统自动将这个方法拦截,然后去spring容器中查找对应的serviceA对象然后返回
2.replaced-method:方法替换
我们可以对serviceB这个bean中的getServiceA方法进行拦截,把这个调用请求转发到一个替换者处理。
CGLIB和Java动态代理的区别:
1、Java动态代理只能够对接口进行代理,不能对普通的类进行代理(因为所有生成的代理类的父类为Proxy,Java类继承机制不允许多重继承);CGLIB能够代理普通类;
2、Java动态代理使用Java原生的反射API进行操作,在生成类上比较高效;CGLIB使用ASM框架直接对字节码进行操作,在类的执行过程中比较高效
注解是给编译器和虚拟机看的
1.定义注解语法
@interface来定义,如下定义一个名称为MyAnnotation的注解: public @interface MyAnnotation { }
2.注解中定义参数
注解有没有参数都可以,定义参数如下:
public @interface 注解名称{
[public] 参数类型 参数名称1() [default 参数默认值];
[public] 参数类型 参数名称2() [default 参数默认值];
[public] 参数类型 参数名称n() [default 参数默认值]; }
3.指定注解的使用范围:@Target
4.指定注解的保留策略:@Retention
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation {
}
上面指定了MyAnnotation只存在于源码阶段,后面的2个阶段都会丢失。