Merge branch 'main' into 4.0.x
This commit is contained in:
@@ -821,7 +821,14 @@ include-code::MyProperties[]
|
||||
In this setup, the presence of a single parameterized constructor implies that constructor binding should be used.
|
||||
This means that the binder will find a constructor with the parameters that you wish to have bound.
|
||||
If your class has multiple constructors, the javadoc:org.springframework.boot.context.properties.bind.ConstructorBinding[format=annotation] annotation can be used to specify which constructor to use for constructor binding.
|
||||
To opt out of constructor binding for a class with a single parameterized constructor, the constructor must be annotated with javadoc:org.springframework.beans.factory.annotation.Autowired[format=annotation] or made `private`.
|
||||
|
||||
To opt-out of constructor binding for a class, the parameterized constructor must be annotated with javadoc:org.springframework.beans.factory.annotation.Autowired[format=annotation] or made `private`.
|
||||
Kotlin developers can use an empty primary constructor to opt-out of constructor binding.
|
||||
|
||||
For example:
|
||||
|
||||
include-code::primaryconstructor/MyProperties[]
|
||||
|
||||
Constructor binding can be used with records.
|
||||
Unless your record has multiple constructors, there is no need to use javadoc:org.springframework.boot.context.properties.bind.ConstructorBinding[format=annotation].
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Copyright 2012-2025 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.docs.features.externalconfig.typesafeconfigurationproperties.constructorbinding.primaryconstructor;
|
||||
|
||||
class MyBean {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright 2012-2025 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.docs.features.externalconfig.typesafeconfigurationproperties.constructorbinding.primaryconstructor;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
|
||||
@ConfigurationProperties("my")
|
||||
public class MyProperties {
|
||||
|
||||
// @fold:on // fields...
|
||||
final MyBean myBean;
|
||||
|
||||
private String name;
|
||||
|
||||
// @fold:off
|
||||
|
||||
@Autowired
|
||||
public MyProperties(MyBean myBean) {
|
||||
this.myBean = myBean;
|
||||
}
|
||||
|
||||
// @fold:on // getters / setters...
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
// @fold:off
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright 2012-2025 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.docs.features.externalconfig.typesafeconfigurationproperties.constructorbinding.primaryconstructor
|
||||
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties
|
||||
import org.springframework.boot.context.properties.bind.DefaultValue
|
||||
import java.net.InetAddress
|
||||
|
||||
@ConfigurationProperties("my")
|
||||
class MyProperties() {
|
||||
|
||||
constructor(name: String) : this() {
|
||||
this.name = name
|
||||
}
|
||||
|
||||
// @fold:on // vars...
|
||||
var name: String? = null
|
||||
// @fold:off
|
||||
|
||||
}
|
||||
@@ -61,6 +61,18 @@ class KotlinDefaultBindConstructorProviderTests {
|
||||
assertThat(bindConstructor).isNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `type with no param primary constructor and secondary params constructor should not use constructor binding`() {
|
||||
val bindConstructor = this.constructorProvider.getBindConstructor(NoParamPrimaryWithParamsSecondaryProperties::class.java, false)
|
||||
assertThat(bindConstructor).isNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `type with params primary constructor and no param secondary constructor should use constructor binding`() {
|
||||
val bindConstructor = this.constructorProvider.getBindConstructor(ParamsPrimaryWithNoParamSecondaryProperties::class.java, false)
|
||||
assertThat(bindConstructor).isNotNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `type with autowired secondary constructor should not use constructor binding`() {
|
||||
val bindConstructor = this.constructorProvider.getBindConstructor(AutowiredSecondaryProperties::class.java, false)
|
||||
@@ -127,6 +139,18 @@ class KotlinDefaultBindConstructorProviderTests {
|
||||
constructor(@Suppress("UNUSED_PARAMETER") foo: String) : this(foo, 21)
|
||||
}
|
||||
|
||||
class NoParamPrimaryWithParamsSecondaryProperties() {
|
||||
|
||||
constructor(@Suppress("UNUSED_PARAMETER") name: String) : this()
|
||||
|
||||
var name: String? = null
|
||||
}
|
||||
|
||||
class ParamsPrimaryWithNoParamSecondaryProperties(var name: String?) {
|
||||
|
||||
constructor() : this(null)
|
||||
}
|
||||
|
||||
class AutowiredSecondaryProperties {
|
||||
|
||||
@Autowired
|
||||
|
||||
Reference in New Issue
Block a user