Skip to content

Support profile exclusivity and/or bean definition finality [SPR-7982] #12637

Closed
@spring-projects-issues

Description

@spring-projects-issues
Collaborator

Neale Upstone opened SPR-7982 and commented

There's a real opportunity to nail some corner cases with profiles, and conversely the risk of propagating some open-doors to bad practice.

Reading the example given at http://blog.springsource.com/2011/02/11/spring-framework-3-1-m1-released/, I can see a few areas I'd like to be explicit for fast failure:

  1. To be able to define valid (/invalid) profile combinations. In your example, you can specify "production,dev", which is clearly not what is intended, and all too easy to do when profiles are less obviously exclusive. This could be achieved by allowing profiles combinations to be specified in the application context.
  2. To be able to configure specific bean definition override behaviour, by 'final' bean defs and/or by an override flag. This could be done at the level of a bean or on the now nestable <beans> element. ** This would have saved a LOT of time on the project I've recently been working on, mainly due to the number of components developed by different teams with varying levels of Spring experience **

I quite like the idea of allowing some combination of final and override as it would give expressiveness to developers intent. <bean id='blah' override='true' ../> would not only clearly denote that override was intended, but also allow validation that there was already a bean to override.

Either of these suggestions would prevent the 'prod,dev' profile from being bootstrapped.

Examples would be:

<config>
  <profileOptions exclusive="production,dev,uat"/>
  <profileOptions exclusive="perf,trace"/>
</config>
<beans profile="production" final="true">
   ... jndi datasource bean defs
</beans>
<beans profile="dev" final="true">
   ... dev datasources
</beans>

Affects: 3.1 M1

Reference URL: http://blog.springsource.com/2011/02/11/spring-framework-3-1-m1-released/#comment-185086

Issue Links:

6 votes, 12 watchers

Activity

spring-projects-issues

spring-projects-issues commented on Mar 12, 2011

@spring-projects-issues
CollaboratorAuthor

Chris Beams commented

Thanks for the submission Neale. I'm slating this for 3.2, for a few reasons:

spring-projects-issues

spring-projects-issues commented on Mar 15, 2011

@spring-projects-issues
CollaboratorAuthor

Dave Syer commented

I think we can and should try and offer something here in 3.1. Surely we can
make assertions after the fact, even if we have to parse all the bean
definitions first? It wouldn't be the most perfect solution (which has
chicken and egg problems as you have pointed out), but just throwing an
exception when something inconsistent is encountered would be extremely
helpful, and probably even toolable.

spring-projects-issues

spring-projects-issues commented on Feb 28, 2012

@spring-projects-issues
CollaboratorAuthor

Frank Scheffler commented

I think providing boolean logic on profiles would also reduce the problem a bit, i.e. defining a profile dev and also providing means to apply configuration to "not" dev environments. Effectively, dev and prod are most likely to be exlusive OR. We often happen to have the same problem with secured/unsecured and the like.

spring-projects-issues

spring-projects-issues commented on Feb 29, 2012

@spring-projects-issues
CollaboratorAuthor

Chris Beams commented

Frank, I've linked this issue to #13818 for reference.

spring-projects-issues

spring-projects-issues commented on Oct 25, 2012

@spring-projects-issues
CollaboratorAuthor

Neale Upstone commented

Watching others use profiles in anger with 3.1, I'd really like to see this polished off in 3.2.

Rather than my original proposal here, the override approach mentioned in the highly voted #10181 would solve the underlying problem, which is that beans can get overridden silently. Making overridding a bean something that has to be declared (even if just for XML - it's less of a problem with JavaConfig as we can use cleaner abstract class approaches to this), would resolve numerous issues around overridding beans.

<bean id="bean1" ... />
<bean override="true" id="bean1" />

as the required approach to overriding beans, triggered by using the 3.2 XSD.

This would then cause context initialisation to fail rather than silently succeed, if two incompatible profiles are activated together.

Another thing which would be useful is if I got my finger out and did a presentation on how to split Spring projects into modules with configuration-by-contract between them (i.e. not just one single app context consuming all XML). Bad Spring XML-based library design is rather widespread in enterprise projects.

spring-projects-issues

spring-projects-issues commented on Nov 7, 2012

@spring-projects-issues
CollaboratorAuthor

Frank Scheffler commented

I am still looking forward to having this feature for selectively providing alternate configurations within XML, e.g. dummy configurations used whenever a profile is NOT active, at all.

spring-projects-issues

spring-projects-issues commented on Nov 7, 2012

@spring-projects-issues
CollaboratorAuthor

Chris Beams commented

Frank Scheffler, are you familiar with #13370? It introduced a ! (not) operator for use when declaring profiles.

spring-projects-issues

spring-projects-issues commented on Nov 8, 2012

@spring-projects-issues
CollaboratorAuthor

Frank Scheffler commented

No, I wasn't. Thanks for the hint, I will have a look at it.

spring-projects-issues

spring-projects-issues commented on Aug 10, 2016

@spring-projects-issues
CollaboratorAuthor

Juergen Hoeller commented

This has largely been superseded by the generalized condition model in 4.0 (and by various refinements to the profile mechanism in 3.2 ahead of that). If there is anything to be desired still, please raise a focused issue against 4.3 / 5.0.

added
status: declinedA suggestion or change that we don't feel we should currently apply
in: coreIssues in core modules (aop, beans, core, context, expression)
on Jan 11, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)status: declinedA suggestion or change that we don't feel we should currently applytype: enhancementA general enhancement

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

    Development

    No branches or pull requests

      Participants

      @jhoeller@spring-projects-issues

      Issue actions

        Support profile exclusivity and/or bean definition finality [SPR-7982] · Issue #12637 · spring-projects/spring-framework