《Spring实战》摘录 - 6
51
Q: CGLib是什么
A:
- 是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。
- https://baike.baidu.com/item/cglib/9178356?fr=aladdin
52
Q: 原型作用域prototype的作用
A: 不管你使用哪种方式来声明原型作用域,每次注入或从Spring应用上下文中检索该bean的时候,都会创建新的实例。这样所导致的结果就是每次操作都能得到自己的Notepad实例。
53
P: 3.5.2
Q: SpEL是什么?
A:
- Spring 3引入了Spring表达式语言(Spring Expression Language,SpEL)
- 能够以一种强大和简洁的方式将值装配到bean属性和构造器参数中
- 在这个过程中所使用的表达式会在运行时计算得到值。
54
Q: 在默认情况下,Spring应用上下文中所有bean都是作为以单例(singleton)的形式创建的。
A: 也就是说,不管给定的一个bean被注入到其他bean多少次,每次所注入的都是同一个实例。
55
Q: @Qualifier注解的用法
A:
- @Qualifier注解是使用限定符的主要方式。
- 它可以与@Autowired和@Inject协同使用,在注入的时候指定想要注入进去的是哪个bean。
- 例如,我们想要确保要将IceCream注入到setDessert()之中
56
Q: 如何避免自动装配时的歧义性
A: 在声明bean的时候,通过将其中一个可选的bean设置为首选(primary)bean能够避免自动装配时的歧义性。
57
Q: 阻碍Spring自动装配的原因
A: 仅有一个bean匹配所需的结果时,自动装配才是有效的。如果不仅有一个bean能够匹配结果的话,这种歧义性会阻碍Spring自动装配属性、构造器参数或方法参数。
58
Q: 通过ConditionContext,我们可以做到如下几点:
A:
- 借助getRegistry()返回的BeanDefinitionRegistry检查bean定义;
- 借助getBeanFactory()返回的ConfigurableListableBeanFactory检查bean是否存在,甚至探查bean的属性;
- 借助getEnvironment()返回的Environment检查环境变量是否存在以及它的值是什么;
- 读取并探查getResourceLoader()返回的ResourceLoader所加载的资源;
- 借助getClassLoader()返回的ClassLoader加载并检查类是否存在。
59
Q: ConditionContext是一个接口,大致如下所示:
A:
public interface ConditionContext {
BeanDefinitionRegistry getRegistry();
ConfigurableListableBeanFactory getBeanFactory();
Environment getEnvironment();
ResourceLoader getResourceLoader();
ClassLoader getClassLoader();
}
60
Q: 条件化地配置bean
A: 假设有一个名为MagicBean的类,我们希望只有设置了magic环境属性的时候,Spring才会实例化这个类。如果环境中没有这个属性,那么MagicBean将会被忽略。在程序清单3.4所展现的配置中,使用@Conditional注解条件化地配置了MagicBean。
@Bean
@Conditional(MagicExistsCondition.class) <--- 条件化地创建bean
public MagicBean magicBean(){
return new MagicBean();
}