MTI TEK
Spring Framework | Spring Starter Project

Project Overview

Maven Setup

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>4.0.6</version>
</parent>

<properties>
  <java.version>21</java.version>
</properties>

Application Entry Point & Bean Registration

@SpringBootApplication

Capturing the ApplicationContext

ApplicationContext ctx = SpringApplication.run(MtitekSpringStarterProjectApplication.class, args);

// Dump all registered bean names
Arrays.stream(ctx.getBeanDefinitionNames())
      .sorted()
      .forEach(bdn -> LOG.info("Spring Bean Definition Name: {}", bdn));

Retrieving Beans from the Context

// Retrieve by type
MtitekSpringStarterProjectApplication app = ctx.getBean(MtitekSpringStarterProjectApplication.class);
app.setValue(2);

// Retrieve by name — same instance, value is still 2
app = ctx.getBean("mtitekSpringStarterProjectApplication",
    MtitekSpringStarterProjectApplication.class);
System.out.println(app.getValue()); // prints 2

Registering a Bean with @Bean

@Bean
String appUuid() {
    return UUID.randomUUID().toString();
}

// Retrieve the bean by name and type
String uuid = ctx.getBean("appUuid", String.class);

Note: Registering a plain String bean is valid but can cause ambiguity if multiple String beans exist. Always retrieve it by name in that case.

Configuration & Profiles

application.yml — Main

spring:
  application:
    name: mtitek-spring-starter-project
  profiles:
    active: dev

application.yml — Test

spring:
  application:
    name: mtitek-spring-starter-project
  profiles:
    active: prod

Logback Configuration

logback-spring.xml vs logback.xml

Appender Strategy

<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
  <appender-ref ref="FILE" />
</appender>

Profile-based Log Levels

<springProfile name="dev">
  <logger name="com.mtitek.spring" level="INFO" additivity="false">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="ASYNC_FILE" />
  </logger>
  <root level="INFO">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="ASYNC_FILE" />
  </root>
</springProfile>

<springProfile name="prod">
  <logger name="com.mtitek.spring" level="INFO" additivity="false">
    <appender-ref ref="ASYNC_FILE" />
  </logger>
  <root level="WARN">
    <appender-ref ref="ASYNC_FILE" />
  </root>
</springProfile>

Test Logback (src/test/resources/logback-test.xml)

Testing

@SpringBootTest
class MtitekSpringStarterProjectApplicationTests {
    @Test
    void contextLoads() { }
}

Build & Run

mvn clean package
java -jar target/mtitek-spring-starter-project-0.0.1-SNAPSHOT.jar
java -jar target/mtitek-spring-starter-project-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

The ./logs directory is created relative to the working directory at runtime — not relative to the JAR location. Adjust LOG_PATH in logback-spring.xml or pass -DLOG_PATH=/LOG_PATH as a JVM argument for deployments.