برنامه نویسی جاوا | جاواپرو
📌 موضوع Scope Beanها و تفاوت Singleton و Prototype در Spring سلام دوستان عزیز در ادامهی آشنایی با Beanها، در این پیام به بررسی Scope یا محدودهی عمر Beanها در Spring میپردازیم. درک این مفهوم به ما کمک میکند بفهمیم هر شیء چه زمانی ساخته میشود و چند بار…
📌 موضوع: Dependency Injection و روشهای تزریق وابستگی در Spring Boot
سلام دوستان عزیز
در این پیام به یکی از بنیادیترین مفاهیم Spring Boot میپردازیم؛ مفهومی که تقریباً در تمام بخشهای پروژههای حرفهای استفاده میشود و نقش کلیدی در تمیزی معماری دارد. این مفهوم چیزی نیست جز تزریق وابستگی یا Dependency Injection.
۱) مفهوم Dependency Injection
«تزریق» وابستگی به این معناست که یک کلاس، اشیای موردنیاز خود را **خودش نسازد**، بلکه آنها را از بیرون دریافت کند. در Spring Boot این کار توسط Spring Container انجام میشود.
این رویکرد باعث کاهش وابستگی مستقیم بین کلاسها و افزایش تستپذیری و انعطافپذیری برنامه میشود.
به بیان ساده، کلاسها فقط اعلام میکنند به چه چیزی نیاز دارند و Spring آن را فراهم میکند.
۲) مشکل ساخت مستقیم اشیا
«مشکل» روش سنتی این است که کلاسها به هم وابستگی شدید پیدا میکنند. مثال زیر یک روش نامناسب است:
در این حالت OrderService به پیادهسازی EmailSender قفل شده است و تغییر یا تست آن بسیار دشوار میشود.
۳) تزریق وابستگی با Constructor Injection
«تزریق» از طریق سازنده بهترین و توصیهشدهترین روش در Spring است. در این روش وابستگیها از طریق سازنده کلاس دریافت میشوند.
در این مثال، Spring به صورت خودکار Bean مربوط به EmailSender را ساخته و تزریق میکند. این روش امن، شفاف و قابل تست است.
۴) تزریق وابستگی با Field Injection
«تزریق» فیلدی با استفاده از @Autowired انجام میشود. هرچند این روش سادهتر به نظر میرسد، اما توصیه نمیشود.
این روش تستپذیری را کاهش میدهد و وابستگیها را مخفی میکند.
۵) تزریق وابستگی با Setter Injection
«تزریق» از طریق Setter برای مواقعی استفاده میشود که وابستگی اختیاری باشد.
در این حالت میتوان وابستگی را بعداً تغییر داد، اما برای وابستگیهای اصلی توصیه نمیشود.
۶) استفاده از Interface در DI
«استفاده» از Interface باعث میشود وابستگیها به پیادهسازی خاصی قفل نشوند.
در این ساختار میتوان به راحتی پیادهسازیها را تغییر داد.
۷) جمعبندی پیام
«نتیجه» این است که Dependency Injection هستهی اصلی Spring Boot محسوب میشود. استفاده از Constructor Injection به همراه Interfaceها باعث تولید کدی تمیز، قابل تست و حرفهای میشود. در پیام بعدی وارد مبحث Configuration، فایل application.properties و مدیریت تنظیمات پروژه خواهیم شد.
سلام دوستان عزیز
در این پیام به یکی از بنیادیترین مفاهیم Spring Boot میپردازیم؛ مفهومی که تقریباً در تمام بخشهای پروژههای حرفهای استفاده میشود و نقش کلیدی در تمیزی معماری دارد. این مفهوم چیزی نیست جز تزریق وابستگی یا Dependency Injection.
۱) مفهوم Dependency Injection
«تزریق» وابستگی به این معناست که یک کلاس، اشیای موردنیاز خود را **خودش نسازد**، بلکه آنها را از بیرون دریافت کند. در Spring Boot این کار توسط Spring Container انجام میشود.
این رویکرد باعث کاهش وابستگی مستقیم بین کلاسها و افزایش تستپذیری و انعطافپذیری برنامه میشود.
به بیان ساده، کلاسها فقط اعلام میکنند به چه چیزی نیاز دارند و Spring آن را فراهم میکند.
۲) مشکل ساخت مستقیم اشیا
«مشکل» روش سنتی این است که کلاسها به هم وابستگی شدید پیدا میکنند. مثال زیر یک روش نامناسب است:
public class OrderService {
private EmailSender emailSender = new EmailSender();
}
در این حالت OrderService به پیادهسازی EmailSender قفل شده است و تغییر یا تست آن بسیار دشوار میشود.
۳) تزریق وابستگی با Constructor Injection
«تزریق» از طریق سازنده بهترین و توصیهشدهترین روش در Spring است. در این روش وابستگیها از طریق سازنده کلاس دریافت میشوند.
@Service
public class OrderService {
private final EmailSender emailSender;
public OrderService(EmailSender emailSender) {
this.emailSender = emailSender;
}
}
در این مثال، Spring به صورت خودکار Bean مربوط به EmailSender را ساخته و تزریق میکند. این روش امن، شفاف و قابل تست است.
۴) تزریق وابستگی با Field Injection
«تزریق» فیلدی با استفاده از @Autowired انجام میشود. هرچند این روش سادهتر به نظر میرسد، اما توصیه نمیشود.
@Service
public class OrderService {
@Autowired
private EmailSender emailSender;
}
این روش تستپذیری را کاهش میدهد و وابستگیها را مخفی میکند.
۵) تزریق وابستگی با Setter Injection
«تزریق» از طریق Setter برای مواقعی استفاده میشود که وابستگی اختیاری باشد.
@Service
public class OrderService {
private EmailSender emailSender;
@Autowired
public void setEmailSender(EmailSender emailSender) {
this.emailSender = emailSender;
}
}
در این حالت میتوان وابستگی را بعداً تغییر داد، اما برای وابستگیهای اصلی توصیه نمیشود.
۶) استفاده از Interface در DI
«استفاده» از Interface باعث میشود وابستگیها به پیادهسازی خاصی قفل نشوند.
public interface MessageSender {
void send(String message);
}
@Component
public class EmailSender implements MessageSender {
public void send(String message) {
System.out.println(message);
}
}
@Service
public class NotificationService {
private final MessageSender messageSender;
public NotificationService(MessageSender messageSender) {
this.messageSender = messageSender;
}
}
در این ساختار میتوان به راحتی پیادهسازیها را تغییر داد.
۷) جمعبندی پیام
«نتیجه» این است که Dependency Injection هستهی اصلی Spring Boot محسوب میشود. استفاده از Constructor Injection به همراه Interfaceها باعث تولید کدی تمیز، قابل تست و حرفهای میشود. در پیام بعدی وارد مبحث Configuration، فایل application.properties و مدیریت تنظیمات پروژه خواهیم شد.
#Spring
🆔 @javapro_ir
🆔 @group_javapro
👍7❤1
اتوماسیون انتقال داده از CSV به دیتابیس با Spring Boot و Spring Batch
من اخیراً یک پروژه با Spring Batch پیادهسازی کردم که وظیفهاش پردازش دادهها از یک فایل CSV و ذخیره آنها در دیتابیس بود.
این پروژه کل جریان استاندارد Reader → Processor → Writer → Job → Listener را بهصورت کامل پوشش میدهد.
در ادامه، اجزای اصلی این پروژه را مرحلهبهمرحله بررسی میکنیم 👇
📂 ۱. Reader (FlatFileItemReader)
این بخش فایل sample-data.csv را میخواند و هر سطر را به یک شیء از نوع Person نگاشت میکند.
🛠 ۲. Processor (ItemProcessor)
در این مرحله، دادهها قبل از ذخیرهسازی تغییر داده میشوند.
در این مثال، نام و نام خانوادگی هر شخص به حروف بزرگ (UPPERCASE) تبدیل میشود.
💾 ۳. Writer (JdbcBatchItemWriter)
این بخش دادههای پردازششده را در جدول people دیتابیس درج میکند.
⚙️ ۴. Job و Step
در این قسمت، Job و Step تعریف میشوند.
اندازه chunk برابر با ۳ است؛ یعنی:
۳ رکورد خوانده میشود
پردازش انجام میگیرد
در دیتابیس ذخیره میشود
این چرخه تا پایان فایل تکرار میشود
📊 ۵. Listener (JobExecutionListener)
پس از اتمام Job، این Listener اجرا میشود تا صحت درج دادهها در دیتابیس بررسی شود.
✨ چرا کار روی این پروژه جذاب بود؟
✔️ مدیریت بهینه دیتاستهای حجیم با استفاده از پردازش Chunk
✔️ پیادهسازی یک خط لوله تمیز ETL (استخراج → تبدیل → بارگذاری)
✔️ تفکیک شفاف مسئولیتها بین Reader، Processor و Writer
این پروژه تجربه عملی بسیار خوبی از استفاده واقعی Spring Boot و Spring Batch برای اتوماسیون پردازش دادهها فراهم کرد.
من اخیراً یک پروژه با Spring Batch پیادهسازی کردم که وظیفهاش پردازش دادهها از یک فایل CSV و ذخیره آنها در دیتابیس بود.
این پروژه کل جریان استاندارد Reader → Processor → Writer → Job → Listener را بهصورت کامل پوشش میدهد.
در ادامه، اجزای اصلی این پروژه را مرحلهبهمرحله بررسی میکنیم 👇
📂 ۱. Reader (FlatFileItemReader)
این بخش فایل sample-data.csv را میخواند و هر سطر را به یک شیء از نوع Person نگاشت میکند.
@Bean
public FlatFileItemReader<Person> reader() {
return new FlatFileItemReaderBuilder<Person>()
.name("personItemReader")
.resource(new ClassPathResource("sample-data.csv"))
.delimited()
.names("firstName", "lastName")
.targetType(Person.class)
.build();
}
🛠 ۲. Processor (ItemProcessor)
در این مرحله، دادهها قبل از ذخیرهسازی تغییر داده میشوند.
در این مثال، نام و نام خانوادگی هر شخص به حروف بزرگ (UPPERCASE) تبدیل میشود.
public class PersonItemProcessor implements ItemProcessor<Person, Person> {
@Override
public Person process(Person person) {
return new Person(
person.firstName().toUpperCase(),
person.lastName().toUpperCase()
);
}
}💾 ۳. Writer (JdbcBatchItemWriter)
این بخش دادههای پردازششده را در جدول people دیتابیس درج میکند.
@Bean
public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Person>()
.sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
.dataSource(dataSource)
.beanMapped()
.build();
}
⚙️ ۴. Job و Step
در این قسمت، Job و Step تعریف میشوند.
اندازه chunk برابر با ۳ است؛ یعنی:
۳ رکورد خوانده میشود
پردازش انجام میگیرد
در دیتابیس ذخیره میشود
این چرخه تا پایان فایل تکرار میشود
@Bean
public Step step1(
JobRepository jobRepository,
DataSourceTransactionManager transactionManager,
FlatFileItemReader<Person> reader,
PersonItemProcessor processor,
JdbcBatchItemWriter<Person> writer) {
return new StepBuilder("step1", jobRepository)
.<Person, Person>chunk(3, transactionManager)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
📊 ۵. Listener (JobExecutionListener)
پس از اتمام Job، این Listener اجرا میشود تا صحت درج دادهها در دیتابیس بررسی شود.
@Override
public void afterJob(JobExecution jobExecution) {
if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
jdbcTemplate
.query(
"SELECT first_name, last_name FROM people",
new DataClassRowMapper<>(Person.class)
)
.forEach(person ->
log.info("Found <{}> in the database.", person)
);
}
}
✨ چرا کار روی این پروژه جذاب بود؟
✔️ مدیریت بهینه دیتاستهای حجیم با استفاده از پردازش Chunk
✔️ پیادهسازی یک خط لوله تمیز ETL (استخراج → تبدیل → بارگذاری)
✔️ تفکیک شفاف مسئولیتها بین Reader، Processor و Writer
این پروژه تجربه عملی بسیار خوبی از استفاده واقعی Spring Boot و Spring Batch برای اتوماسیون پردازش دادهها فراهم کرد.
🆔 @javapro_ir
🆔 @group_javapro
۱۳+ سال تجربه بهعنوان مهندس ارشد جاوا فولاستک — آنچه از ساخت سیستمهای سازمانی (Enterprise-Grade) آموختهام
پس از فعالیت روی پلتفرمهای مالی بزرگ در Wells Fargo، Freddie Mac، DBS Bank و Oracle، به این نتیجه رسیدهام که مهندسی سازمانی فقط نوشتن کد نیست؛ بلکه درباره مقیاسپذیری، تابآوری، امنیت و قابلیت مشاهدهپذیری (Observability) است.
آنچه من به تیم اضافه میکنم:
✅ بکاند و میکروسرویسها
Java، Spring Boot، REST APIs
تراکنشهای توزیعشده، استراتژیهای سراسری مدیریت Exception
Spring Batch برای پردازشهای مالی سنگین
✅ معماریهای رویدادمحور (Event-Driven)
Kafka، ActiveMQ، JMS
مصرفکنندههای Idempotent، Throttling، الگوهای Async
✅ تحویل Cloud-Native
Docker، Kubernetes (EKS)، PCF، AWS، Azure
GitHub Actions، Jenkins، Spinnaker (CI/CD)
AppDynamics، Splunk، Kiali برای Observability
✅ مهندسی داده
PostgreSQL، Oracle، MariaDB، Teradata
طراحی ERD، Stored Procedure، Trigger
مهاجرت دیتابیس با Flyway
✅ تجربه فرانتاند
React.js، Redux، Router
Memoization و بهینهسازی رندر
✅ امنیت
OAuth2، JWT، LDAP، SAML
رفع آسیبپذیریها (Fortify / DAST)
سیستمهایی که تحویل دادهام:
🏦 مدیریت اوراق قرضه
🏦 مخازن داده بازار سرمایه
💳 سیستمهای بازخرید و پاداش
📊 سیستمهای پیشنهاددهی و بازاریابی زمینهمحور
مهمتر از همه، به معماری تمیز، استقرارهای قابل پیشبینی، سرویسهای تابآور و همراستایی با اهداف کسبوکار اهمیت میدهم.
پس از فعالیت روی پلتفرمهای مالی بزرگ در Wells Fargo، Freddie Mac، DBS Bank و Oracle، به این نتیجه رسیدهام که مهندسی سازمانی فقط نوشتن کد نیست؛ بلکه درباره مقیاسپذیری، تابآوری، امنیت و قابلیت مشاهدهپذیری (Observability) است.
آنچه من به تیم اضافه میکنم:
✅ بکاند و میکروسرویسها
Java، Spring Boot، REST APIs
تراکنشهای توزیعشده، استراتژیهای سراسری مدیریت Exception
Spring Batch برای پردازشهای مالی سنگین
✅ معماریهای رویدادمحور (Event-Driven)
Kafka، ActiveMQ، JMS
مصرفکنندههای Idempotent، Throttling، الگوهای Async
✅ تحویل Cloud-Native
Docker، Kubernetes (EKS)، PCF، AWS، Azure
GitHub Actions، Jenkins، Spinnaker (CI/CD)
AppDynamics، Splunk، Kiali برای Observability
✅ مهندسی داده
PostgreSQL، Oracle، MariaDB، Teradata
طراحی ERD، Stored Procedure، Trigger
مهاجرت دیتابیس با Flyway
✅ تجربه فرانتاند
React.js، Redux، Router
Memoization و بهینهسازی رندر
✅ امنیت
OAuth2، JWT، LDAP، SAML
رفع آسیبپذیریها (Fortify / DAST)
سیستمهایی که تحویل دادهام:
🏦 مدیریت اوراق قرضه
🏦 مخازن داده بازار سرمایه
💳 سیستمهای بازخرید و پاداش
📊 سیستمهای پیشنهاددهی و بازاریابی زمینهمحور
مهمتر از همه، به معماری تمیز، استقرارهای قابل پیشبینی، سرویسهای تابآور و همراستایی با اهداف کسبوکار اهمیت میدهم.
🆔 @javapro_ir
🆔 @group_javapro
📚لیست دوره های رایگان برنامه نویسی جاوا
آموزش برنامه نویسی سوکت با زبان جاوا
آموزش ساخت برنامه ساده مدیریت ایمیل ها با JavaFX
آموزش ساخت برنامه آزمون تستی با JavaFX
آموزش ساخت ربات تلگرام ساده با جاوا
آموزش مباحث JavaFX
آموزش ساخت ماشین حساب با JavaFX
آموزش ساخت دفترچه تلفن با JavaFX
آموزش ساخت بازی دوبعدی در جاوا
مینی دوره نحوه ساخت صفحه Login با Spring Boot
مینی دوره آموزش Spring RestFul
مینی دوره Spring MVC CRUD
مینی دوره Spring Boot – اپلیکیشن TODO
مینی دوره Login/Register با توکن Spring Boot
آموزش برنامه نویسی سوکت با زبان جاوا
آموزش ساخت برنامه ساده مدیریت ایمیل ها با JavaFX
آموزش ساخت برنامه آزمون تستی با JavaFX
آموزش ساخت ربات تلگرام ساده با جاوا
آموزش مباحث JavaFX
آموزش ساخت ماشین حساب با JavaFX
آموزش ساخت دفترچه تلفن با JavaFX
آموزش ساخت بازی دوبعدی در جاوا
مینی دوره نحوه ساخت صفحه Login با Spring Boot
مینی دوره آموزش Spring RestFul
مینی دوره Spring MVC CRUD
مینی دوره Spring Boot – اپلیکیشن TODO
مینی دوره Login/Register با توکن Spring Boot
🆔 @javapro_ir
🆔 @group_javapro
آکادمی جاواپرو
آموزش برنامه نویسی سوکت با زبان جاوا
در این آموزش پروژه محور زبان برنامه نویسی جاوا به صورت رایگان و ساده با برنامه نویسی سوکت در جاوا آشنا می شوید.جهت دانلود این دوره کلیک کنید