Bu maqolada Spring Boot loyihani sozlashni o‘rganamiz: application.properties, application.yml, @Value, server.port, logging.level, auto-configuration va embedded Tomcat/Jetty.
1. Configuration nima?
Configuration - ilova qanday ishlashini belgilaydigan sozlamalar.
Masalan:
Server qaysi portda ishlaydi?
Database qayerda?
Log darajasi qanday?
JWT secret qayerda?
File upload limiti qancha?
Email SMTP sozlamalari qanday?Bularni Java kod ichiga qattiq yozib qo‘yish yomon amaliyot hisoblanadi.
Yomon:
String dbUrl = "jdbc:postgresql://localhost:5432/mydb";Yaxshi variant:
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb2. application.properties nima?
Spring Boot’da asosiy configuration fayl:
src/main/resources/application.propertiesMasalan:
server.port=8081
spring.application.name=demo-app
logging.level.root=INFO
logging.level.uz.jts.demo=DEBUGBu fayl Spring Boot ishga tushganda avtomatik o‘qiladi.
3. application.yml nima?
application.yml ham configuration fayl. Faqat yozilishi boshqacha.
application.properties:
server.port=8081
spring.application.name=demo-app
logging.level.root=INFOapplication.yml:
server:
port: 8081
spring:
application:
name: demo-app
logging:
level:
root: INFOIkkalasi ham ishlaydi.
4. properties vs yml
Fayl | Afzalligi | Kamchiligi |
|---|---|---|
| Sodda, boshlovchilar uchun qulay | Katta configda uzun bo‘lib ketadi |
| Strukturali, o‘qish oson | Bo‘sh joy/indentation xatosi ko‘p uchraydi |
Boshlangichlar uchun avval application.properties bilan boshlagan yaxshi.
5. server.port
Default holatda Spring Boot 8080 portda ishlaydi.
Agar o‘zgartirmoqchi bo‘lsak:
server.port=9090Endi app quyida ishlaydi:
http://localhost:9090Agar REST endpoint bo‘lsa:
@GetMapping("/hello")
public String hello() {
return "Hello";
}URL:
http://localhost:9090/hello6. spring.application.name
Bu ilova nomini belgilaydi:
spring.application.name=user-serviceBu ayniqsa microservice, logging, tracing va monitoringda foydali.
Masalan loglarda service nomi ko‘rinishi mumkin:
user-service started successfully7. Logging nima?
Logging - dastur ishlayotganda nima bo‘layotganini yozib borish.
Masalan:
User yaratildi
Payment bajarildi
Database connection failed
JWT token invalidJava’da oddiy System.out.println() ishlatsa bo‘ladi, lekin real loyihada logger ishlatiladi.
8. Log level turlari
Level | Ma’nosi | Qachon ishlatiladi? |
|---|---|---|
| Eng batafsil log | Juda chuqur debugging |
| Debug uchun | Development paytida |
| Oddiy ma’lumot | App normal ishlashi |
| Ogohlantirish | Xavf bor, lekin app ishlayapti |
| Xato | Muammo yuz berdi |
Odatda:
Development → DEBUG
Production → INFO yoki WARN9. logging.level
application.properties:
logging.level.root=INFO
logging.level.uz.jts.demo=DEBUGBu nimani anglatadi?
root=INFO → umumiy loglar INFO darajada chiqadi
uz.jts.demo=DEBUG → bizning package ichida DEBUG loglar ham chiqadi10. Logger ishlatish
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private static final Logger log = LoggerFactory.getLogger(UserService.class);
public String getUser(Long id) {
log.debug("User qidirilyapti. id={}", id);
log.info("getUser method called");
return "Ali";
}
}System.out.println() o‘rniga logger ishlatish kerak.
11. @Value nima?
@Value - config fayldagi qiymatni Java class ichiga olish uchun ishlatiladi.
application.properties:
app.default-name=AliJava:
@RestController
public class HelloController {
@Value("${app.default-name}")
private String defaultName;
@GetMapping("/hello")
public String hello() {
return "Salom " + defaultName;
}
}Natija:
Salom Ali12. @Value bilan port yoki custom value olish
application.properties:
app.company-name=JTS Corp
app.max-users=100Java:
@Component
public class AppInfo {
@Value("${app.company-name}")
private String companyName;
@Value("${app.max-users}")
private Integer maxUsers;
public void printInfo() {
System.out.println(companyName);
System.out.println(maxUsers);
}
}13. Default qiymat berish
Agar config topilmasa, default qiymat berish mumkin:
@Value("${app.default-language:uz}")
private String defaultLanguage;Bu degani:
Agar app.default-language bo‘lsa → o‘shani oladi
Agar bo‘lmasa → uz oladi14. @Value qachon yaxshi?
@Value kichik configlar uchun qulay:
app.name
app.version
app.default-page-size
app.upload-folderLekin config ko‘paysa, @ConfigurationProperties yaxshiroq. Bu boshlang'ich bosqichda chuqurroq o‘rganiladi.
15. Auto-configuration nima?
Auto-configuration - Spring Boot’ning eng kuchli tomoni.
Oddiy qilib:
Spring Boot dependency’larni ko‘rib, kerakli sozlamalarni avtomatik qiladi.
Masalan, spring-boot-starter-web qo‘shsak:
Spring Boot tushunadi:
Bu web application
Tomcat kerak
Spring MVC kerak
JSON converter kerak
DispatcherServlet kerakBularni qo‘lda sozlamaymiz.
16. Auto-configuration misol
Agar Maven’da shuni qo‘shsak:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>Spring Boot avtomatik sozlaydi:
Embedded Tomcat
Spring MVC
Jackson JSON
Validation support
LoggingShuning uchun bitta controller yozib API ochib ketaveramiz:
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello";
}
}17. Embedded Tomcat nima?
Oldin Java web app qilish uchun alohida Tomcat server o‘rnatilardi.
Eski usul:
Tomcat o‘rnatiladi
WAR fayl yig‘iladi
WAR Tomcat ichiga deploy qilinadi
Tomcat ishga tushiriladiSpring Boot’da esa Tomcat app ichida keladi.
Bu embedded Tomcat deyiladi.
Ya’ni:
Spring Boot app = Java app + ichida web serverShuning uchun app’ni oddiy main() method bilan ishga tushiramiz:
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}18. Embedded Tomcat, Jetty, Undertow
Spring Boot default holatda Tomcat ishlatadi.
Lekin boshqa serverlar ham bor:
Server | Izoh |
|---|---|
Tomcat | Default, eng ko‘p ishlatiladi |
Jetty | Yengil va moslashuvchan |
Undertow | Performance uchun ishlatiladi |
BOshlanishiga uchun Tomcat yetarli.
19. Configuration order
Spring Boot configni bir nechta joydan olishi mumkin:
application.properties
application.yml
environment variables
command line arguments
profile-specific configMasalan command line orqali port berish mumkin:
java -jar app.jar --server.port=9090Bu application.propertiesdagi portdan ustun bo‘lishi mumkin.
20. Environment variable nima?
Environment variable - server yoki operatsion tizimdagi tashqi sozlamadir.
Masalan production’da secretlarni faylga yozish yomon:
Yomon:
jwt.secret=my-secret-keyYaxshiroq:
jwt.secret=${JWT_SECRET}Serverda esa:
export JWT_SECRET=super-secret-valueSpring JWT_SECRET qiymatini olib ishlatadi.
21. Configda secret saqlash xatosi
Hech qachon quyidagilarni GitHub’ga commit qilmaslik kerak:
Database password
JWT secret
Telegram bot token
SMTP password
AWS key
Payment provider secretYomon:
telegram.bot.token=123456:ABC_SECRETYaxshi:
telegram.bot.token=${TELEGRAM_BOT_TOKEN}22. application.properties real misol
spring.application.name=shop-api
server.port=8080
logging.level.root=INFO
logging.level.uz.jts.shop=DEBUG
app.default-page-size=20
app.upload-dir=uploads
app.support-email=support@jtscorp.uzControllerda olish:
@RestController
@RequestMapping("/app")
public class AppController {
@Value("${spring.application.name}")
private String appName;
@Value("${app.support-email}")
private String supportEmail;
@GetMapping("/info")
public String info() {
return appName + " | " + supportEmail;
}
}Request:
GET /app/infoResponse:
shop-api | support@jtscorp.uz23. application.yml real misol
spring:
application:
name: shop-api
server:
port: 8080
logging:
level:
root: INFO
uz.jts.shop: DEBUG
app:
default-page-size: 20
upload-dir: uploads
support-email: support@jts.uzBu yuqoridagi properties bilan bir xil.
24. @Value bilan muammo
Agar config nomini noto‘g‘ri yozsak:
@Value("${app.support.mail}")
private String supportEmail;Lekin faylda bunday bo‘lsa:
app.support-email=support@jts.uzSpring xato beradi:
Could not resolve placeholder 'app.support.mail'Sababi: app.support.mail topilmadi.
To‘g‘risi:
@Value("${app.support-email}")
private String supportEmail;25. Config nomlash bo‘yicha yaxshi uslub
Yaxshi:
app.default-page-size=20
app.upload-dir=uploads
app.support-email=support@jts.uzYomonroq:
page=20
folder=uploads
email=support@jts.uzNega?
page nimaning page’i?
folder qaysi folder?
email kimniki?Config nomlari aniq bo‘lishi kerak.
26. Mini loyiha: config bilan API
application.properties
spring.application.name=config-demo
server.port=8081
app.company-name=JTS Corp
app.default-language=uz
app.max-upload-size=10AppConfigController
@RestController
@RequestMapping("/config")
public class AppConfigController {
@Value("${spring.application.name}")
private String appName;
@Value("${app.company-name}")
private String companyName;
@Value("${app.default-language:en}")
private String defaultLanguage;
@Value("${app.max-upload-size}")
private Integer maxUploadSize;
@GetMapping
public String getConfig() {
return "App: " + appName
+ ", Company: " + companyName
+ ", Language: " + defaultLanguage
+ ", Max upload: " + maxUploadSize + "MB";
}
}URL:
http://localhost:8081/configNatija:
App: config-demo, Company: JTS Corp, Language: uz, Max upload: 10MB27. Controller uchun logger misol
@RestController
@RequestMapping("/users")
public class UserController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
@GetMapping("/{id}")
public String getUser(@PathVariable Long id) {
log.info("GET /users/{} request keldi", id);
return "User ID: " + id;
}
}application.properties:
logging.level.uz.jts.demo=DEBUG28. Eng ko‘p uchraydigan xatolar
1. Fayl joylashuvi noto‘g‘ri
To‘g‘ri joy:
src/main/resources/application.propertiesNoto‘g‘ri:
src/main/java/application.properties2. yml indentation xatosi
Yomon:
server:
port: 8081To‘g‘ri:
server:
port: 8081YAML’da bo‘sh joy muhim.
3. Port band bo‘lishi
Xato:
Port 8080 was already in useYechim:
server.port=8081Yoki eski processni to‘xtatish.
4. Secretlarni GitHub’ga chiqarib yuborish
Yomon:
db.password=123456Yaxshi:
db.password=${DB_PASSWORD}29. Interview uchun savol-javoblar
Savol: application.properties nima?
application.propertiesSpring Boot ilovasining asosiy configuration fayli. Unda server porti, database sozlamalari, logging, custom app sozlamalari kabi qiymatlar saqlanadi.
Savol: application.properties va application.yml farqi?
Ikkalasi ham configuration uchun ishlatiladi.
propertieskey-value formatda yoziladi,ymlesa nested strukturada yoziladi. Katta configlar uchunymlo‘qishga qulayroq.
Savol: @Value nima?
@Valueconfiguration fayldagi qiymatlarni Java class ichiga inject qilish uchun ishlatiladi.
Savol: Auto-configuration nima?
Auto-configuration - Spring Boot dependency va classpath’ni tekshirib, kerakli bean va sozlamalarni avtomatik yaratishi. Masalan,
spring-boot-starter-webbo‘lsa, Spring Boot web server, Spring MVC va JSON converterlarni avtomatik sozlaydi.
Savol: Embedded Tomcat nima?
Embedded Tomcat - Spring Boot ilova ichida keladigan web server. Shu sababli alohida Tomcat o‘rnatmasdan, app’ni oddiy Java application sifatida ishga tushirish mumkin.
30. Boshlovchilar uchun xulosa
Bugungi mavzudan eslab qoling:
application.properties - asosiy config fayl
application.yml - strukturali config fayl
server.port - app portini o‘zgartirish
logging.level - log darajasini sozlash
@Value - config qiymatni Java classga olish
Auto-configuration - Spring Boot avtomatik sozlashi
Embedded Tomcat - app ichidagi web server
Environment variable - tashqi muhitdan keladigan qiymat31. Amaliy vazifa
Quyidagilarni yozib ko‘ring:
application.properties
spring.application.name=product-api
server.port=8082
app.owner-name=Jahon
app.default-currency=UZS
app.max-products=100Endpoint
GET /app/infoJavob:
App: product-api
Owner: Jahon
Currency: UZS
Max products: 100Class nomi:
AppInfoController