1. 情景一
-
bean 对应的类没有实现任何接口
-
根据 bean 本身的类型获取 bean
-
测试:IOC容器中同类型的 bean 只有一个
正常获取到 IOC 容器中的那个 bean 对象
-
测试:IOC 容器中同类型的 bean 有多个
会抛出 NoUniqueBeanDefinitionException 异常,表示 IOC 容器中这个类型的 bean 有多个
-
2. 情景二
- bean 对应的类实现了接口,这个接口也只有这一个实现类
- 测试:根据接口类型获取 bean
- 测试:根据类获取 bean
- 结论:上面两种情况其实都能够正常获取到 bean,而且是同一个对象
3. 情景三
-
声明一个接口
-
接口有多个实现类
-
接口所有实现类都放入 IOC 容器
-
测试:根据接口类型获取 bean
会抛出 NoUniqueBeanDefinitionException 异常,表示 IOC 容器中这个类型的 bean 有多个
-
测试:根据类获取bean
正常
-
4. 情景四
-
声明一个接口
-
接口有一个实现类
-
创建一个切面类,对上面接口的实现类应用通知
-
测试:根据接口类型获取bean
正常
-
测试:根据类获取bean
无法获取
-
-
应用了切面后,真正放在IOC容器中的是代理类的对象
-
当实现类有接口时,spring aop 会创建一个实现该接口的代理类。因此可以根据接口类型获取到bean。
-
目标类并没有被放到IOC容器中,所以根据目标类的类型从IOC容器中是找不到的
5. 情景五
- 声明一个类
- 创建一个切面类,对上面的类应用通知
- 测试:根据类获取 bean,能获取到
- 测试:根据类获取 bean,能获取到
- 当实现类没有接口时,spring aop回使用cglib动态代理,创建的代理类会继承该实现类。因此,根据该实现类的类型可以获取到bean。