Bird
Raised Fist0
Spring Bootframework~10 mins

@Profile for environment-specific beans in Spring Boot - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - @Profile for environment-specific beans
Start Application
↓
Check Active Profiles
↓
Match Bean @Profile?
No→Skip Bean
Yes↓
Register Bean in Context
↓
Use Bean in Application
↓
Application Runs with Correct Beans
The application starts, checks which profiles are active, registers only beans matching those profiles, and uses them during runtime.
Execution Sample
Spring Boot
@Configuration
@Profile("dev")
public class DevConfig {
  @Bean
  public DataSource devDataSource() {
    return new DevDataSource();
  }
}
Defines a bean that is only created when the 'dev' profile is active.
Execution Table
StepActive ProfilesBean Class@Profile AnnotationBean Registered?Reason
1devDevConfigdevYesActive profile matches @Profile
2devProdConfigprodNoActive profile 'dev' does not match 'prod'
3prodDevConfigdevNoActive profile 'prod' does not match 'dev'
4prodProdConfigprodYesActive profile matches @Profile
5noneDevConfigdevNoNo active profiles, bean skipped
6noneProdConfigprodNoNo active profiles, bean skipped
💡 Beans are only registered if their @Profile matches an active profile; otherwise, they are skipped.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4Final
activeProfiles[]["dev"]["dev"]["prod"]["prod"][]
DevConfig Bean Registeredfalsetruetruefalsefalsefalse
ProdConfig Bean Registeredfalsefalsefalsefalsetruefalse
Key Moments - 2 Insights
Why is a bean with @Profile("dev") not created when the active profile is 'prod'?
Because the @Profile annotation tells Spring to only register the bean if the active profile matches exactly. See execution_table rows 3 and 4 where the mismatch causes skipping.
What happens if no profiles are active but beans have @Profile annotations?
Beans with @Profile annotations are not registered if no profiles are active, as shown in execution_table rows 5 and 6.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, at step 2, is the ProdConfig bean registered when 'dev' profile is active?
AYes, it is registered
BOnly partially registered
CNo, it is not registered
DIt causes an error
💡 Hint
Check the 'Bean Registered?' column at step 2 in the execution_table.
According to variable_tracker, what is the value of 'activeProfiles' after step 4?
A["dev"]
B["prod"]
C[]
D["dev", "prod"]
💡 Hint
Look at the 'activeProfiles' row and the 'After Step 4' column in variable_tracker.
If the active profile is empty, what happens to beans annotated with @Profile("dev")?
AThey are skipped
BThey are registered anyway
CThey cause a startup error
DThey are registered but inactive
💡 Hint
Refer to execution_table rows 5 and 6 where no profiles are active.
Concept Snapshot
@Profile annotation limits bean creation to specific environments.
Activate profiles via application.properties or command line.
Only beans matching active profiles load into context.
No active profile means @Profile beans are skipped.
Use for dev, test, prod environment configs.
Full Transcript
When a Spring Boot application starts, it checks which profiles are active. Beans annotated with @Profile are only created if their profile matches one of the active profiles. For example, a bean with @Profile("dev") is created only if the 'dev' profile is active. If the active profile is 'prod', that bean is skipped. If no profiles are active, all @Profile beans are skipped. This helps run different beans in different environments like development or production. The execution table shows steps where beans are registered or skipped based on active profiles. The variable tracker shows how activeProfiles and bean registration flags change during startup.

Practice

(1/5)
1. What is the main purpose of the @Profile annotation in Spring Boot?
easy
A. To define the database connection URL
B. To schedule tasks at fixed intervals
C. To create beans only for specific environments
D. To handle HTTP requests in controllers

Solution

  1. Step 1: Understand the role of @Profile

    The @Profile annotation is used to mark beans that should only be created when a specific environment profile is active.
  2. Step 2: Compare with other options

    Options A, C, and D relate to other Spring Boot features but not to environment-specific bean creation.
  3. Final Answer:

    To create beans only for specific environments -> Option C
  4. Quick Check:

    @Profile controls bean creation per environment [OK]
Hint: Remember: @Profile controls which beans load per environment [OK]
Common Mistakes:
  • Confusing @Profile with @Component or @Service
  • Thinking @Profile sets database URLs
  • Assuming @Profile schedules tasks
2. Which of the following is the correct way to use @Profile on a Spring bean class for the "dev" environment?
easy
A. @Profile("dev") public class DevService {}
B. @Profile(dev) public class DevService {}
C. @Profile({dev}) public class DevService {}
D. @Profile(["dev"]) public class DevService {}

Solution

  1. Step 1: Check correct syntax for @Profile

    The @Profile annotation requires a string value in quotes, e.g., @Profile("dev").
  2. Step 2: Analyze each option

    @Profile(["dev"]) public class DevService {} uses square brackets, invalid Java annotation syntax. @Profile(dev) public class DevService {} misses quotes around "dev", syntax error. @Profile({dev}) public class DevService {} uses braces but misses quotes around "dev", syntax error. @Profile("dev") public class DevService {} uses correct quoted string syntax.
  3. Final Answer:

    @Profile("dev") public class DevService {} -> Option A
  4. Quick Check:

    @Profile needs quoted string [OK]
Hint: Use quotes around profile names in @Profile [OK]
Common Mistakes:
  • Omitting quotes around profile names
  • Using square brackets instead of curly braces
  • Confusing array syntax with string
3. Given the following Spring Boot configuration and beans, what will be the output when the active profile is set to "prod"?
@Profile("dev")
@Component
public class DevBean {
    public String getMessage() { return "Development Bean"; }
}

@Profile("prod")
@Component
public class ProdBean {
    public String getMessage() { return "Production Bean"; }
}

@Component
public class BeanUser {
    private final Object bean;
    public BeanUser(@Autowired(required = false) Object bean) { this.bean = bean; }
    public String show() { return bean == null ? "No Bean" : ((ProdBean)bean).getMessage(); }
}
medium
A. Development Bean
B. Production Bean
C. ClassCastException at runtime
D. No Bean

Solution

  1. Step 1: Identify active profile and beans created

    With profile "prod" active, only ProdBean is created. DevBean is not created.
  2. Step 2: Analyze BeanUser constructor injection

    BeanUser tries to autowire an Object bean with @Autowired(required = false). Spring injects the available ProdBean instance as it matches.
  3. Step 3: Check the show() method

    In show(), bean is cast to ProdBean, which succeeds, returning "Production Bean".
  4. Final Answer:

    Production Bean -> Option B
  5. Quick Check:

    Prod profile loads ProdBean successfully [OK]
Hint: Profile determines available beans for injection [OK]
Common Mistakes:
  • Thinking Object type causes injection failure
  • Expecting ClassCastException with matching profile
  • Confusing which beans load per profile
4. You have two beans annotated with @Profile("test") and @Profile("prod") respectively. When running the app with no active profile set, you get a NoSuchBeanDefinitionException. What is the most likely cause?
medium
A. The beans are not annotated with @Component
B. The beans have syntax errors in @Profile annotation
C. Spring Boot does not support @Profile annotation
D. No profile is active, so no beans with @Profile are created

Solution

  1. Step 1: Understand @Profile behavior with no active profile

    If no profile is active, Spring does not create beans annotated with any specific profile.
  2. Step 2: Analyze exception cause

    NoSuchBeanDefinitionException means Spring could not find a bean to inject because none were created due to missing active profile.
  3. Final Answer:

    No profile is active, so no beans with @Profile are created -> Option D
  4. Quick Check:

    No active profile means no profile-specific beans [OK]
Hint: Beans with @Profile need active profile to load [OK]
Common Mistakes:
  • Assuming beans load without active profile
  • Blaming syntax errors without checking profiles
  • Ignoring need for @Component on beans
5. You want to create a bean that is active in both "dev" and "test" profiles but not in "prod". Which @Profile annotation usage correctly achieves this?
hard
A. @Profile({"dev", "test"})
B. @Profile("dev & test")
C. @Profile("dev | test")
D. @Profile({"dev & test"})

Solution

  1. Step 1: Understand @Profile multiple values usage

    Using @Profile({"dev", "test"}) means the bean is active if either "dev" OR "test" profile is active.
  2. Step 2: Analyze other options

    @Profile("dev & test") and D use string with "&" which is invalid syntax for multiple profiles. @Profile("dev | test") uses "|" inside string which is not supported syntax.
  3. Final Answer:

    @Profile({"dev", "test"}) -> Option A
  4. Quick Check:

    Use array of profiles for OR condition in @Profile [OK]
Hint: Use array syntax for multiple profiles in @Profile [OK]
Common Mistakes:
  • Using string with & or | inside @Profile
  • Confusing AND and OR logic in profiles
  • Forgetting to use curly braces for multiple profiles
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard