Spring @Autowired for setter方法与非setter方法
根据@Autowired javadoc :
将构造函数,字段,setter方法或配置方法标记为由Spring的dependency injection工具自动assembly。 任何给定bean类只有一个构造函数(最大值)可以带有这个注释,指示构造函数在用作Spring bean时要自动assembly。 这样的构造函数不必公开。 在调用任何配置方法之前,在构造bean之后立即注入字段。 这样的配置字段不必是公共的。 配置方法可以有任意名称和任意数量的参数; 每个参数都将使用Spring容器中的匹配bean进行自动assembly。
Bean属性setter方法实际上只是这种 通用配置方法的 一个特例 。 这种配置方法不必是公开的。 在多参数方法的情况下,’required’参数适用于所有参数。 如果是Collection或Map依赖类型,容器将自动assembly与声明的值类型匹配的所有bean。 如果是Map,则必须将键声明为String类型,并将其解析为相应的bean名称。 请注意,实际注入是通过BeanPostProcessor执行的,而BeanPostProcessor又意味着您无法使用@Autowired将引用注入BeanPostProcessor或BeanFactoryPostProcessor类型。 请参考javadoc获取AutowiredAnnotationBeanPostProcessor类(默认情况下,它会检查是否存在此批注)。
我的问题是:
-
配置方法是什么意思?
-
而且,假设我有
@Autowired
的setter方法和@Autowired
一些任意方法。 我假设在bean实例化之后,spring会自动调用setter方法,而不会调用随机命名的@Autowired
方法,对不对? -
另外spring如何理解在实例化(setter)之后应该调用哪个
@Autowired
方法,而其他方法不应该? 这与javadoc的声明有何关联,并说:
Bean属性setter方法实际上只是这种通用配置方法的一个特例
最后一个问题: 我可以在哪里阅读它? 因为spring文档没有关于它的任何信息,我无法在其javadoc中找到spring使用的确切逻辑。
@Autowired
注释可以与构造函数,setter方法或任何其他方法一起使用。 每当Spring发现@Autowired
注释时,它将尝试查找与方法参数匹配的bean,并将调用该方法。 如果多个方法(setter或non-setter)具有@Autowired
注释,那么在bean实例化之后Spring将调用所有方法。
配置方法是类似工厂的方法,在这种情况下会自动连接参数:
@Autowired public SomeObject initSomeObject(Object1 o1, Object2 o2, ...) {
@Autowired仅确保Spring将(尝试)提供所需的参数。
此上下文中的Config-method指的是您在init-method
或@PostConstruct
下指定init-method
您已经知道的Setter就像setXXX
所以很明显找到哪个是没有困难的。 同时注意弹簧不能基于参数名称自动assembly。
- Java中的正则表达式反向引用
- 如果B出错,请回退A. spring boot,jdbctemplate
- 通过使用reflection在垃圾回收之前擦除内容,安全地使用String作为密码
- Java最终局部变量存储在哪里?
- libgdx- pixmap:我可以以某种方式改变线的宽度吗?
- Hibernate 5.2.7 – java.lang.NoSuchMethodError:org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava / util / Map;
- 如何解决“找不到方言类:org.hibernate.dialect.MYSQLDialect”的exception?
- Java – 通过Java套接字广播语音
- 使用jersey-spring3从JerseyTest容器中检索托管bean