🔹به تازگی JetBrains گزارش و آمار جالبی از تغییرات مهم زبانهای برنامه نویسی در سال ۲۰۱۹ منتشر کردهاست؛ #Java محبوبترین زبان برنامه نویسی، #JavaScript پرکاربردترین.
http://bit.ly/2FONzD0
@this_java
http://bit.ly/2FONzD0
@this_java
کلمه ی کلیدی transient چیست؟
هنگامی که با عملیات Serialization داده هارا به صورت توالی از بایت ها در میاورید تمام فیلد های کلاس به صورت توالی از بایت ها در می ایند در صورت عدم تمایل به تبدیل یک متغیر به توالی بایت ها میتوانید از این کلمه ی کلیدی استفاده کنید:
public class Foo implements Serializable
{
private String saveMe;
private transient String dontSaveMe;
private transient String password;
//...
}
کاربرد transient در زمینه Serialization می باشد و به این معنی هست که فیلد مورد نظر در عمل Serialization استفاده نشود، فیلد هایی رو transient می کنند که نمی خواهند آن ها را نگهداری کنند یا در انتقال شی ها در شبکه نیازی به انتقال اطلاعات آن ها نیست. مثلا اگر شما وضعیت لحظه به لحظه ی یک فرآیند را در یک فیلدی از یک شی نگهداری کنید در موقع ثبت و Serialization ممکن است دوست نداشته باشید آن فیلد را نگهداری کنید چون همیشه در زمان اجرا محاسبه میشود.
@this_java
هنگامی که با عملیات Serialization داده هارا به صورت توالی از بایت ها در میاورید تمام فیلد های کلاس به صورت توالی از بایت ها در می ایند در صورت عدم تمایل به تبدیل یک متغیر به توالی بایت ها میتوانید از این کلمه ی کلیدی استفاده کنید:
public class Foo implements Serializable
{
private String saveMe;
private transient String dontSaveMe;
private transient String password;
//...
}
کاربرد transient در زمینه Serialization می باشد و به این معنی هست که فیلد مورد نظر در عمل Serialization استفاده نشود، فیلد هایی رو transient می کنند که نمی خواهند آن ها را نگهداری کنند یا در انتقال شی ها در شبکه نیازی به انتقال اطلاعات آن ها نیست. مثلا اگر شما وضعیت لحظه به لحظه ی یک فرآیند را در یک فیلدی از یک شی نگهداری کنید در موقع ثبت و Serialization ممکن است دوست نداشته باشید آن فیلد را نگهداری کنید چون همیشه در زمان اجرا محاسبه میشود.
@this_java
کاربرد annotation در جاوا چیست؟
در زبان برنامه نویسی جاوا، Annotation نوعی metadata (فراداده یا توضیح درباره اطلاعات) درباره برنامه است و قسمتی از برنامه حساب نمی شود و هیچ اثر مستقیمی در عملکرد کد ندارد. کاربرد های Annotation عبارتند از:
- فراهم کردن اطلاعات برای کامپایلر: توسط کامپایلر برای یافتن خطاها یا اعلام warning ها استفاده می شوند.
@Override
void mySuperMethod() { ... }
- پردازش رمان کامپایل (Compile-time) یا زمان deploy: کتابخانه ها و ابزار ها از اطلاعات Annotation ها برای ایجاد کد، فایل های XML و ... استفاده می کنند.
- پردازش زمان اجرا (runtime): بعضی از Annotation ها برای چک کردن در زمان اجرا کاربرد دارند.
Annotation یکی از مفاهیمی است که در جاوا 1.5 معرفی شد، روشی برای مستندسازی اجزای برنامه از قبیل کلاسهای، اینترفیسها، متدها، فیلدها، پارامترهای متدها، و متغیرهای محلی است. برخلاف دیگر روشهای سنتی مستندسازی، یعنی استفاده از متن های توضیحی در لابلای کدهای برنامه که فقط برای انسان قابل درک است و توسط کامپایلر صرفنظر می شود، مستندسازی با استفاده از Annotation هم برای انسان هم برای کامپایلر جاوا و هم برای اجراکنندة جاوا قابل درک است.
@this_java
در زبان برنامه نویسی جاوا، Annotation نوعی metadata (فراداده یا توضیح درباره اطلاعات) درباره برنامه است و قسمتی از برنامه حساب نمی شود و هیچ اثر مستقیمی در عملکرد کد ندارد. کاربرد های Annotation عبارتند از:
- فراهم کردن اطلاعات برای کامپایلر: توسط کامپایلر برای یافتن خطاها یا اعلام warning ها استفاده می شوند.
@Override
void mySuperMethod() { ... }
- پردازش رمان کامپایل (Compile-time) یا زمان deploy: کتابخانه ها و ابزار ها از اطلاعات Annotation ها برای ایجاد کد، فایل های XML و ... استفاده می کنند.
- پردازش زمان اجرا (runtime): بعضی از Annotation ها برای چک کردن در زمان اجرا کاربرد دارند.
Annotation یکی از مفاهیمی است که در جاوا 1.5 معرفی شد، روشی برای مستندسازی اجزای برنامه از قبیل کلاسهای، اینترفیسها، متدها، فیلدها، پارامترهای متدها، و متغیرهای محلی است. برخلاف دیگر روشهای سنتی مستندسازی، یعنی استفاده از متن های توضیحی در لابلای کدهای برنامه که فقط برای انسان قابل درک است و توسط کامپایلر صرفنظر می شود، مستندسازی با استفاده از Annotation هم برای انسان هم برای کامپایلر جاوا و هم برای اجراکنندة جاوا قابل درک است.
@this_java
spring-boot.zip
164.7 KB
سورس کد یک پروژه ی ساده ی spring boot به همراه jsp
اموزش spring :
https://t.me/this_java/655
@this_java
اموزش spring :
https://t.me/this_java/655
@this_java
Timer ,TimerTask
یکی از کلاس های مفید پکیج java.util تایمر و تایمر تسک هستند ..با استفاده از این کلاس ها میتوانید یک نخ در حال انتظار در پس زمینه بسازید. با فرا رسیدن زمان مربوطه وظیفه ی منتسب شده به نخ انجام میشود. تایمرتسک واسط Runnable را اجرا میکند بنابراین میتوان از ان برای ساخت یک نخ اجرایی استفاده کرد.
مثال :
public static void main(String[] args) {
Timer tm = new Timer();
tm.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("s");
}
}, 10000, 1000);
}
سایر متد های سودمند کلاس TimerTask :
boolean cancel()
وظیفه را به پایان میرساند.. در صورتی که مانع اجرای وظیفه شود ترو و در غیر این صورت فالس بر میگرداند
abstract void run()
کد وظیفه ی تایمر را در بر دارد
long scheduledExecutionTime()
زمان اخرین اجرای وظیفه ی برنامه ریزی شده را بر میگرداند
سازنده های کلاس Time:
Timer()
Timer(boolean DThread)
Timer(String tName)
Timer(String tName,boolean DThread)
سازنده ی اول یک نخ معمولی را اجرا میکند دومین سازنده یک نخ daemon اگر مقدار DThread ترو باشد استفاده میکند.یک نخ daemon تنها در صورتی اجرا میشود که بقیه ی برنامه در حال اجرا باشد(نخ متد main) ..سازنده ی سوم به شما اجازه میدهد یک نام برای تایمر ساخته شده انتخاب کنید
@this_java
یکی از کلاس های مفید پکیج java.util تایمر و تایمر تسک هستند ..با استفاده از این کلاس ها میتوانید یک نخ در حال انتظار در پس زمینه بسازید. با فرا رسیدن زمان مربوطه وظیفه ی منتسب شده به نخ انجام میشود. تایمرتسک واسط Runnable را اجرا میکند بنابراین میتوان از ان برای ساخت یک نخ اجرایی استفاده کرد.
مثال :
public static void main(String[] args) {
Timer tm = new Timer();
tm.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("s");
}
}, 10000, 1000);
}
سایر متد های سودمند کلاس TimerTask :
boolean cancel()
وظیفه را به پایان میرساند.. در صورتی که مانع اجرای وظیفه شود ترو و در غیر این صورت فالس بر میگرداند
abstract void run()
کد وظیفه ی تایمر را در بر دارد
long scheduledExecutionTime()
زمان اخرین اجرای وظیفه ی برنامه ریزی شده را بر میگرداند
سازنده های کلاس Time:
Timer()
Timer(boolean DThread)
Timer(String tName)
Timer(String tName,boolean DThread)
سازنده ی اول یک نخ معمولی را اجرا میکند دومین سازنده یک نخ daemon اگر مقدار DThread ترو باشد استفاده میکند.یک نخ daemon تنها در صورتی اجرا میشود که بقیه ی برنامه در حال اجرا باشد(نخ متد main) ..سازنده ی سوم به شما اجازه میدهد یک نام برای تایمر ساخته شده انتخاب کنید
@this_java
دانلود فایل در جاوا
import java.io.FileOutputStream;@this_java
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
public class Download {
public static void main(String[] args)throws Exception {
URL url = new URL("url");
ReadableByteChannel readableByteChannel = Channels.newChannel(url.openStream());
FileOutputStream fileOutputStream = new FileOutputStream("fname.format");
fileOutputStream.getChannel().transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
}
}
کپی کردن فایل با استفاده از Channel (پکیج java.nio):
package com.parsakav.nio;@this_java
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.SocketChannel;
import java.nio.channels.WritableByteChannel;
import java.util.Scanner;
import org.w3c.dom.events.Event;
public class CopyFile {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream(new File("/root/testing.txt"));
ReadableByteChannel rbc = fis.getChannel();
FileOutputStream fos = new FileOutputStream(new File("/root/pm.txt"));
WritableByteChannel wbc = fos.getChannel();
ByteBuffer bb = ByteBuffer.allocateDirect(8 * 1024);
while (rbc.read(bb) != -1) {
bb.flip();
while (bb.hasRemaining()) {
wbc.write(bb);
}
bb.clear();
}
rbc.close();
wbc.close();
}
}
خواندن فایل متنی در جاوا :
@this_java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class ReadFile {
public static void main(String[] args) throws IOException {
Path file = Paths.get("/root/pm.txt");
InputStream is = Files.newInputStream(file);
BufferedReader bf = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = bf.readLine()) != null) {
System.out.println(line);
}
bf.close();
}
}
@this_java
🔸آشنایی با #Redis
The Open-Source Data Structure Server
🔷redis.io
ردیس (Redis) یک سرور پایگاه داده است، با قابلیت کلاستربندی ، متن باز، درون حافظه اصلی و همچنین Key,value دیتابیس می باشد.
مثلا من به ردیس می گم «تا 24ساعت بعد یادت باشه که X اجازه داره توی سایت لاگین کنه» و بدونم که هر وقت بخوام می تونم از ردیس بپرسم X می تونه لاگین کنه؟» و جواب صحیح رو بگیرم.
این «اطلاعات» خود به خود بعد از ساعتی منقضی میشه.
منبع:@programming_tips
@this_java
The Open-Source Data Structure Server
🔷redis.io
ردیس (Redis) یک سرور پایگاه داده است، با قابلیت کلاستربندی ، متن باز، درون حافظه اصلی و همچنین Key,value دیتابیس می باشد.
مثلا من به ردیس می گم «تا 24ساعت بعد یادت باشه که X اجازه داره توی سایت لاگین کنه» و بدونم که هر وقت بخوام می تونم از ردیس بپرسم X می تونه لاگین کنه؟» و جواب صحیح رو بگیرم.
این «اطلاعات» خود به خود بعد از ساعتی منقضی میشه.
منبع:@programming_tips
@this_java
چک کردن وجود داشتن یک فایل یا پوشه :
import java.nio.Files.*;
public Class LearnJava{
public static void main(String[] args) {
boolean Exist=Files.exists(Paths.get("/root/Fandom2.zip"));// ادرس فایل یا پوشه
boolean Dir= Files.isDirectory(Paths.get("/root/FandomProxy")); // درصورتی که فایل وجود داشت ترو و اگر فایل نبود و پوشه بود فالس برگردانده میشود
}
}
@this_java
import java.nio.Files.*;
public Class LearnJava{
public static void main(String[] args) {
boolean Exist=Files.exists(Paths.get("/root/Fandom2.zip"));// ادرس فایل یا پوشه
boolean Dir= Files.isDirectory(Paths.get("/root/FandomProxy")); // درصورتی که فایل وجود داشت ترو و اگر فایل نبود و پوشه بود فالس برگردانده میشود
}
}
@this_java
راه اندازی Dynamic Port Forwarding با جاوا:
همانند سوییچ D در ssh عمل میکند و یک پراکسی ساکس راه می اندازد ..یک پورت روی لوکال باز میشود و به ssh فروارد میشود...
کتابخانه ی jsch در این مورد عملکرد مناسبی ندارد اما بوسیله ی apache mina میشود آن را انجام داد :
package com.parsakav.sshtunnelsocks;
import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.sshd.client.SshClient;
import org.apache.sshd.client.keyverifier.AcceptAllServerKeyVerifier;
import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.common.forward.PortForwardingEventListener;
import org.apache.sshd.common.session.Session;
import org.apache.sshd.common.util.net.SshdSocketAddress;
import org.apache.sshd.server.forward.AcceptAllForwardingFilter;
public class Main {
public static void main(String[] args) {
m();
}
public static void m() {
String remote_host = "remotehost";
String login = "user";
String password = "pass";
SshClient client = SshClient.setUpDefaultClient();
client.setServerKeyVerifier(AcceptAllServerKeyVerifier.INSTANCE);
client.setForwardingFilter(AcceptAllForwardingFilter.INSTANCE);
client.start();
ClientSession session = null;
try {
session = client.connect(login, remote_host, 22).verify(1000).getSession();
session.addPasswordIdentity(password);
session.auth().verify(10000);
session.addPortForwardingEventListener(new PortForwardingEventListener() {
@Override
public void establishedDynamicTunnel(Session session, SshdSocketAddress local,
SshdSocketAddress boundAddress, Throwable reason) throws IOException {
PortForwardingEventListener.super.establishedDynamicTunnel(session, local, boundAddress, reason);
System.out.println(
"ColpMina.main(...).new PortForwardingEventListener() {...}.establishedDynamicTunnel()");
}
});
SshdSocketAddress sshdSocketAddress = session
.startDynamicPortForwarding(new SshdSocketAddress("localhost", 9780));
System.out.println("Host: " + sshdSocketAddress.getHostName());
System.out.println("Port: " + sshdSocketAddress.getPort());
} catch (Exception e) {
System.err.println("Error : "+e.getMessage());
}
while (session.isOpen()) {
}
}
}
کد زیر:
while(session.isOpen(): از خاتمه یافتن برنامه تا زمانی که کانکشن برقرار است جلوگیری میکند
@this_java
همانند سوییچ D در ssh عمل میکند و یک پراکسی ساکس راه می اندازد ..یک پورت روی لوکال باز میشود و به ssh فروارد میشود...
کتابخانه ی jsch در این مورد عملکرد مناسبی ندارد اما بوسیله ی apache mina میشود آن را انجام داد :
package com.parsakav.sshtunnelsocks;
import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.sshd.client.SshClient;
import org.apache.sshd.client.keyverifier.AcceptAllServerKeyVerifier;
import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.common.forward.PortForwardingEventListener;
import org.apache.sshd.common.session.Session;
import org.apache.sshd.common.util.net.SshdSocketAddress;
import org.apache.sshd.server.forward.AcceptAllForwardingFilter;
public class Main {
public static void main(String[] args) {
m();
}
public static void m() {
String remote_host = "remotehost";
String login = "user";
String password = "pass";
SshClient client = SshClient.setUpDefaultClient();
client.setServerKeyVerifier(AcceptAllServerKeyVerifier.INSTANCE);
client.setForwardingFilter(AcceptAllForwardingFilter.INSTANCE);
client.start();
ClientSession session = null;
try {
session = client.connect(login, remote_host, 22).verify(1000).getSession();
session.addPasswordIdentity(password);
session.auth().verify(10000);
session.addPortForwardingEventListener(new PortForwardingEventListener() {
@Override
public void establishedDynamicTunnel(Session session, SshdSocketAddress local,
SshdSocketAddress boundAddress, Throwable reason) throws IOException {
PortForwardingEventListener.super.establishedDynamicTunnel(session, local, boundAddress, reason);
System.out.println(
"ColpMina.main(...).new PortForwardingEventListener() {...}.establishedDynamicTunnel()");
}
});
SshdSocketAddress sshdSocketAddress = session
.startDynamicPortForwarding(new SshdSocketAddress("localhost", 9780));
System.out.println("Host: " + sshdSocketAddress.getHostName());
System.out.println("Port: " + sshdSocketAddress.getPort());
} catch (Exception e) {
System.err.println("Error : "+e.getMessage());
}
while (session.isOpen()) {
}
}
}
کد زیر:
while(session.isOpen(): از خاتمه یافتن برنامه تا زمانی که کانکشن برقرار است جلوگیری میکند
@this_java
جستجوی یک فایل :
import java.io.File;
public class Search {
public static void listFilesInDirectory(File dir,String filename) {
String format=filename.substring(filename.indexOf("."));
String name=filename.substring(0, filename.indexOf("."));
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
if (f.isDirectory()) {
listFilesInDirectory(f,filename);
} else {
if((filename.contains("**")&& f.getName().contains(format))||f.getName().equals(filename)||(filename.indexOf("*")==filename.indexOf(".")-1&&f.getName().startsWith(filename.substring(0,filename.indexOf("*")))&& f.getName().contains(format))||(filename.indexOf("*")==0&&f.getName().substring(0,f.getName().indexOf(".")+1).endsWith(filename.substring(filename.indexOf("*")+1,filename.indexOf("."))+".")&& f.getName().contains(format))||(f.getName().substring(0,f.getName().indexOf(".")+1).equals(name+".")&&format.contains(".*")) )
System.out.println(f.getAbsolutePath());
}
}
}
}
}
import java.io.File;
public class Search {
public static void listFilesInDirectory(File dir,String filename) {
String format=filename.substring(filename.indexOf("."));
String name=filename.substring(0, filename.indexOf("."));
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
if (f.isDirectory()) {
listFilesInDirectory(f,filename);
} else {
if((filename.contains("**")&& f.getName().contains(format))||f.getName().equals(filename)||(filename.indexOf("*")==filename.indexOf(".")-1&&f.getName().startsWith(filename.substring(0,filename.indexOf("*")))&& f.getName().contains(format))||(filename.indexOf("*")==0&&f.getName().substring(0,f.getName().indexOf(".")+1).endsWith(filename.substring(filename.indexOf("*")+1,filename.indexOf("."))+".")&& f.getName().contains(format))||(f.getName().substring(0,f.getName().indexOf(".")+1).equals(name+".")&&format.contains(".*")) )
System.out.println(f.getAbsolutePath());
}
}
}
}
}
https://www.youtube.com/watch?v=9waW1A_s7K4&index=1&list=PLT--3zJy_gmmJPvWxif0w-KA2rEwVHGo-
دوره ی اموزش وب به زبان جاوا فارسی و رایگان
از servlet ها و معماری java ee شروع میکنند . بعد هم که میرند سراغ spring , hibernate
در اخر هم کمی spring security
دوستانی که وب جاوا میخوان شروع کنند این دوره میتونه شروع خوبی باشه
TopLearn هم یک دوره ی رایگان servlet و jsp داره که خیلی مفید هست
دوره ی اسپرینگ بوت ارکادمی هم میتونه شروع خوبی برای اسپرینگ بوت باشه ولی رایگان نیست متاسفانه
@this_java
دوره ی اموزش وب به زبان جاوا فارسی و رایگان
از servlet ها و معماری java ee شروع میکنند . بعد هم که میرند سراغ spring , hibernate
در اخر هم کمی spring security
دوستانی که وب جاوا میخوان شروع کنند این دوره میتونه شروع خوبی باشه
TopLearn هم یک دوره ی رایگان servlet و jsp داره که خیلی مفید هست
دوره ی اسپرینگ بوت ارکادمی هم میتونه شروع خوبی برای اسپرینگ بوت باشه ولی رایگان نیست متاسفانه
@this_java
YouTube
1 - JDBC نصب دیتابیس اراکل XE
این دوره آموزشی در شرکت دمیس پر شده است و به موضوع برنامه نویسی جاوا در وب می پردازد
انوتیشن های تزریق وابستگی در اسپرینگ:
(تزریق وابستگی چیست؟ https://fa.wikipedia.org/wiki/%D8%AA%D8%B2%D8%B1%DB%8C%D9%82_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C)
(شرح مفهوم تزریق وابستگی :
https://barnamenevisan.org/Articles/Article2880.html)
(قوانین استفاده از انوتیشن ها به همراه وراثت در جاوا:
http://iropensource.com/?p=164)
به محض ایجاد یک
در صورت تامین نشدن وابستگی توسط
#SPRING_DI_ANNOTATION
@this_java
(تزریق وابستگی چیست؟ https://fa.wikipedia.org/wiki/%D8%AA%D8%B2%D8%B1%DB%8C%D9%82_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C)
(شرح مفهوم تزریق وابستگی :
https://barnamenevisan.org/Articles/Article2880.html)
(قوانین استفاده از انوتیشن ها به همراه وراثت در جاوا:
http://iropensource.com/?p=164)
@Autowirted برای ستر و گتر و سازنده هست و روی داده های اولیه کار نمیکنهبه محض ایجاد یک
Bean از شی مورد نظر وابستگی تامین میشود@Requiredموقعی که بین ساخته شد وابستگی حتما باید تامین بشه
در صورت تامین نشدن وابستگی توسط
container برنامه خطای NullPointerException میدهد@Qualifierدر صورت وجود چند
Bean از یک جنس انوتیشن @Autowired قادر به تشخیص نمیباشد پس با این انوتیشن مشخص میشود منظور ما کدام Bean بوده است@Valueهمانند @
Autowired است..Autowired نمیتواند برای داده های اولیه (primitive type) کارایی داشته باشد پس با استفاده از انوتیشن @Valueمیتوان از داده های اولیه نیز استفاده کرد
#SPRING_DI_ANNOTATION
@this_java
Wikipedia
تزریق وابستگی
تزریقِ وابستگی (به انگلیسی: Dependency Injection (DI)) در برنامهنویسی شیءگرا، الگوی طراحیست با قاعدهٔ اصلیِ جداکردنِ رفتار از تحلیلِ نیازمندی (به انگلیسی: Dependency Resolution): فنی برای تجزیهکردنِ مؤلفههایِ بسیار مستقلِ نرمافزاری (به انگلیسی: Software…
تزریق وابستگی چیست؟
بدین شکل اگر روزی خواستین کد یک لایه ی دیگر رو بطور کامل تغییر بدین هیچ مشکلی برای لایه ی پایینی که داره از اون لایه استفاده میکنه بوجود نمیاد چون اون لایه هه داره روی وابستگی inject شده لایه ی بالاتر کار میکنه!!! (نه مستقیم با کلاس لایه ی بالاتر)
https://stackoverflow.com/questions/32365877/why-use-dependency-injection-when-you-can-import-a-java-class
@this_java
(Dependency Injection)
به سخن ساده تزریق وابستگی الگویی است برای تزریق وابستگی های خارجی یک کلاس به ان, به جای استفاده ی مستقیم از آن وابستگی ها در درون خود کلاسبدین شکل اگر روزی خواستین کد یک لایه ی دیگر رو بطور کامل تغییر بدین هیچ مشکلی برای لایه ی پایینی که داره از اون لایه استفاده میکنه بوجود نمیاد چون اون لایه هه داره روی وابستگی inject شده لایه ی بالاتر کار میکنه!!! (نه مستقیم با کلاس لایه ی بالاتر)
https://stackoverflow.com/questions/32365877/why-use-dependency-injection-when-you-can-import-a-java-class
@this_java
Stack Overflow
Why use Dependency injection when you can import a java class?
Could someone please explain to me why do we need to use the spring's dependency injection when you can just import a java class like:
import com.package.somejavaclass
I just wonder why?
import com.package.somejavaclass
I just wonder why?
دسته بنده کلاس ها در یک package:
یکی از اصولی که بسیاری از ابزارها و کتابخانه های مشهور در جاوا آن را رعایت می کنند Package by Feature است که در برابر روش Package By Layer قرار دارد.
در روش Package by Feature از package ها بعنوان ابزاری برای بیان قابلیت های نرم افزار استفاده می شود و در هر package فقط کلاس های مرتبط با یک قابلیت خاص قرار داده می شود، برای مثال در یک برنامه مدیریت داروخانه ممکن است package بندی بصورت زیر باشد:
com.app.doctor
com.app.drug
com.app.presription
و در هر کدام از این package ها کلاس ها و فایل های مرتبط با آن package در لایه های مختلف نرم افزار جمع شده اند (کلاس های UI, Controller و ...). مهمترین مزیت این روش ماژولاریتی بالا و وابستگی کم بین package است.
در روش Package By Layer، از لایه بندی برنامه برای دسته بندی کلاس ها استفاده می شود، برای مثال در برنامه مدیریت داروخانه packaging می تواند بصورت زیر باشد:
com.app.action
com.app.model
com.app.dao
که در این روش کلاس ها مختلف یک قابلیت در package های مختلف پراکنده می شوند و در نهایت ماژولاریتی پایین می آید و وابستگی بین package زیاد است.
از مزایای روش Package by Feature نسبت به Package By Layer می توان به موارد زیر اشاره کرد:
Modularity بالاتر
Navigation آسانتر بین کدها
مدیریت راحتتر کلاس ها و قابلیت ها در زمان بزرگ شدن پروژه
#package_best_practice
@This_java
یکی از اصولی که بسیاری از ابزارها و کتابخانه های مشهور در جاوا آن را رعایت می کنند Package by Feature است که در برابر روش Package By Layer قرار دارد.
در روش Package by Feature از package ها بعنوان ابزاری برای بیان قابلیت های نرم افزار استفاده می شود و در هر package فقط کلاس های مرتبط با یک قابلیت خاص قرار داده می شود، برای مثال در یک برنامه مدیریت داروخانه ممکن است package بندی بصورت زیر باشد:
com.app.doctor
com.app.drug
com.app.presription
و در هر کدام از این package ها کلاس ها و فایل های مرتبط با آن package در لایه های مختلف نرم افزار جمع شده اند (کلاس های UI, Controller و ...). مهمترین مزیت این روش ماژولاریتی بالا و وابستگی کم بین package است.
در روش Package By Layer، از لایه بندی برنامه برای دسته بندی کلاس ها استفاده می شود، برای مثال در برنامه مدیریت داروخانه packaging می تواند بصورت زیر باشد:
com.app.action
com.app.model
com.app.dao
که در این روش کلاس ها مختلف یک قابلیت در package های مختلف پراکنده می شوند و در نهایت ماژولاریتی پایین می آید و وابستگی بین package زیاد است.
از مزایای روش Package by Feature نسبت به Package By Layer می توان به موارد زیر اشاره کرد:
Modularity بالاتر
Navigation آسانتر بین کدها
مدیریت راحتتر کلاس ها و قابلیت ها در زمان بزرگ شدن پروژه
#package_best_practice
@This_java