Spring枚举变量的注入&构造函数
2018-07-18 23:06
295 查看
public enum EventType { IP_CHANGE,REGISTER_SERVER } @Data static public class Entry{ private EventType eventType; private CopyOnWriteArrayList<EventListener> listeners; public Entry(EventType eventType){ this.eventType = eventType; this.listeners = new CopyOnWriteArrayList<>(); } //public Entry(){ //} }
想使用Spring 构建一个bean id="IP_CHANGE_ENTRY"的Entry对象,但是EventType是枚举类型,所以必须使用
org.springframework.beans.factory.config.FieldRetrievingFactoryBean实现枚举类型的注入,将EventType.IP_CHANGE放入静态字段即可。
为什么是静态字段呢,因为Java枚举型是静态常量,隐式地用static final修饰过,使用CRF(java -jar cfr_0_124.jar EventType.class --sugarenums false)反编译结果如下:
当静态字段注册完成后,运行会报错
从错误里看是因为存在两个EventType,在Entry构造函数中注入EventType时,Spring不知道注入谁。解决方法有二种,第一种:
为什么要必须要添加默认无参构造函数呢,源码关键在
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#determineCandidateConstructors
这里是返回candidateConstructors 还是null会影响到下面的走势,如果是null,直接进入instantiateBean,反之,进入autowireConstructor,一旦进入这个,会存在缺少primary导致的无法决策哪一个bean的问题。
第二种:使用primary=true来告诉Spring优先使用这个Bean,默认是false,解释:Indicates that a bean should be given preference when multiple candidates are qualified to autowire a single-valued dependency. If exactly one 'primary' bean exists among the candidates, it will be the autowired value.
当一个类有多个bean时,添加primary=true表示该bean优先于其他bean被注入
下面分析与primary相关的源码
org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveDependency
进入org.springframework.beans.factory.support.DefaultListableBeanFactory#determineAutowireCandidate
在选择自动注入的bean时,有2个选择依据,分别是primary & priority。如果IP_CHANGE_TYPE设置了primary,则primaryCandidate会被设置为IP_CHANGE_TYPE,并作为被注入者返回
如果bean中定义了primary,例如
<bean id = "IP_CHANGE_TYPE" primary="true" class="..."/>,则该方法会返回true,会执行到primaryName=candidateBeanName,primaryName被赋值为IP_CHANGE_TYPE
getMergedLocalBeanDefition会返回一个REGISTER_SERVER_TYPE的AbstractBeanDefition对象,该对象描述了xml中REGISTER_SERVER_TYPE bean的定义规则,该bean没有定义primary,默认为false,所以isPrimary()返回的是false
相关文章推荐
- Spring——setter方式注入和构造函数方式注入
- Spring中如何向 Bean注入系统属性或环境变量
- Spring不能直接@autowired注入Static变量
- spring中构造函数注入
- java web之路 spring 基于构造函数的依赖注入
- Spring一个类包含多个构造函数且带的参数相同所存在的注入类型问题
- Spring-依赖注入-构造函数注入方式
- Spring通过构造函数注入值和对象
- Spring2.5的设值注入可以不用定义属性变量,有set属性名 函数就可以了
- Spring_3_Spring的依赖注入_setter方法和构造函数方法
- Spring.net 使用构造函数注入时必须要有默认构造函数
- [Spring入门点滴]利用构造函数和setter注入
- Spring中如何向Bean注入系统属性或环境变量
- Spring构造函数注入,无法注入的问题
- Spring-依赖注入-多参数的构造函数注入方式
- Spring使用@PostConstruct注解完成子类注入父类私有变量
- spring3.x往map中注入enum枚举的方法
- Spring笔记之一:依赖注入的方式属性注入和构造函数注入
- Spring注入与无参构造函数自定义构造函数
- ASP.NET Spring.Net 入门2 简单入门示例--属性与构造函数注入