问题
In my application I use several profiles to make certain beans eligible for autowiring. What I'm missing is the possibility to make a bean eligible for autowiring when a certain profile is NOT active.
The best way of doing it that I thought about is like this:
- Let's suppose we have a list of all possible profiles, e.g. {A, B, C, D}.
- Profiles active for particular execution are {A, C}.
- What I do is I create artificial profiles for all possible profiles which are not active. In the example case I would create {not_B, not_D} profiles.
- The beans I want to be active based on not active profile
X
I make active for profilenot_X
. In my case if I wanted a bean to be eligible for autowiring when profile B is not active, I would annotate them@Profile("not_B")
This solution however requires an up-front knowledge about all possible profiles.
Can you think of any better solution?
回答1:
You can use a not (!) operator... but you have to use Spring 3.2 M1.
The following syntax is now supported
<beans profile="A,!B"> @Profile("A", "!B")
indicating that the element or annotated component should be processed only if profile 'A' is active or profile 'B' is not active.
See change announced here: Spring Framework 3.2 M1 Released
The commit is at GitHub: Support not (!) operator for profile selection
Issue in JIRA: SPR-8728
If upgrading to Spring 3.2 is not possible for your project, I would recommend not using the @Profile
approach and ensuring that the bean is not created in your Spring configuration.
来源:https://stackoverflow.com/questions/13575201/including-bean-definition-when-a-profile-is-not-active