1
Pemrograman Web Lanjutan
tingkat 2 (Bagian 1):
Musim Semi
2
Presentasi kursus
•Tujuan: mengetahui cara membuat aplikasi Spring dari
dari ujung ke ujung
▫Dengan memahami dengan benar cara kerja
kerangka kerja
▫Dengan cepat memahami bagian-bagian dari Spring
•Mengenal alat yang digunakan dalam
industri
•Kursus ini didasarkan pada versi berikut
▫Spring Framework 4.3
▫JPA 2.1
3
Bibliographie
•Spring par la pratique par Julien Dubois, Jean-
Philippe Retaillé, Thierry Templier, Eyrolles, 2006
517 hlm., (ISBN2212117108)
•Spring sebagai contoh oleh Gary Mak, PEARSSON,
2008, 492 hlmn., (ISBN2744023396)
•Kursus Musim Semi, Mohamed Youssefi.
•Framework Spring, Claude Duvallet.
4
•Pengantar ke Spring
•Arsitektur Spring
•Praktik terbaik dalam Spring
5
Pengenalan ke Spring (1/4)
Masalah
Pengembangan Java/JEE, terutama yang
yang menggunakan EJB, terkenal kompleks, baik
en terme de développement que de tests et de
pemeliharaan.
▫JEE memberlakukan platform eksekusi yang berat,
yang menimbulkan masalah interoperabilitas antara
berbagai implementasi.
Pengembangan JEE dicirikan oleh mereka
ketergantungan yang kuat dan seringkali sulit untuk
penguji
6
Pengenalan ke Spring (2/4)
Motivasi
•Menyederhanakan dan menyusun pengembangan JEE
cara untuk menghormati praktik terbaik
arsitektur perangkat lunak.
Menggunakan kerangka kerja Spring untuk merancang
aplikasi yang berkinerja tinggi, rendah
dijodohkan, mudah diuji dan yang
kode yang dapat digunakan kembali
7
Pendahuluan ke Spring (3/4)
Apa itu Spring?
•Kerangka kerja yang menawarkan kerangka pengembangan di
berdasarkan "praktik baik"
•Pada awalnya berorientasi Java dan Java EE
▫Hari ini implementasi lain ada: .NET
et Python
•Kontainer "ringan"
▫Memfasilitasi pengembangan dengan POJO (Plain Old)
Java Object) yang tidak perlu dijalankan dalam
sebuah kontainer/server aplikasi spesifik
▫Memungkinkan untuk memiliki komponen yang "terhubung lemah"
▫Meningkatkan kualitas kode dan memudahkan pengujian
8
Pengenalan ke Spring (4/4)
Evolusi dan sejarah
9
Arsitektur Musim Semi (1/5)
•Springse terdiri dari sebuah inti (Core Container) dan
beberapa modul
10
Arsitektur Musim Semi (2/5)
•Kontainer Inti Spring: mengelompokkan modul-modul
dasar untuk menerapkan kontainer
▫Spring Core dan Spring Beans: berisi
fungsi dasar terutama kontainer dan
alat-alat
▫Konteks Musim Semi: menawarkan dukungan untuk definisi
konteks Spring (konfigurasinya) tetapi juga dari
fungsi dasar seperti email,
internasionalisasi, JNDI, ...
▫Spring Expression Language (SpEL) : menawarkan sebuah
bahasa ekspresi untuk menanyakan dan memanipulasi
objek yang dikelola oleh kontainer
11
Arsitektur Musim Semi (3/5)
•AOP dan Instrumentasi: memungkinkan untuk memasang
mengimplementasikan pemrograman berorientasi aspek secara internal melalui
Spring atau oleh pengguna Spring
•Akses/Integrasi Data: mengelompokkan modul
akses ke data
▫Spring JDBC: menawarkan abstraksi penggunaan
dari JDBC dengan khususnya hierarki pengecualian
didedikasikan
▫Spring ORM: menawarkan dukungan untuk alat-alat
tipe ORM (JPA, JDO, Hibernate, iBatis)
▫Transaksi Musim Semi: mengusulkan dukungan deklaratif dan
melalui pemrograman pengelolaan transaksi
▫Spring OXM: mengusulkan abstraksi untuk pemetaan
objek/XML
Spring JMS: menawarkan fungsi untuk mempermudah
pelaksanaan JMS dengan Spring
12
Arsitektur Musim Semi (4/5)
•Web: mengelompokkan modul untuk pengembangan
aplikasi web
▫Ini terutama mengandung Spring Web MVC, yang
solusi Spring untuk aplikasi Web, dan
mengusulkan integrasi dengan banyak
kerangka kerja Web dan teknologi tampilan.
•Uji: mengusulkan fitur untuk pengujian
diotomatisasi dengan Spring dengan dukungan JUnit
et TestNG
13
Arsitektur Musim Semi (5/5)
•Ekstensi Spring lainnya:
Spring Security
▫Musim Semi Android
▫Musim Semi .Net
Dsb.
14
Penggunaan Kerangka Kerja Spring
15
Praktik baik dalam Spring
Dekomposisi Pemrograman Inversi dari
di sofa sesuai kontrak kontrol
Pemrograman
Singleton
par Aspek
16
Praktik baik dalam Spring:
Dekomposisi dalam lapisan (1/2)
•Prinsip: pembagian dalam lapisan adalah sebuah teknik
umum untuk membongkar secara logis sebuah
sistem kompleks
Menguraikan sistem menjadi lapisan-lapisan memiliki
berbagai keuntungan, terutama yang berikut ini :
kemungkinan untuk mengisolasi suatu lapisan, agar memudahkan
pemahaman dan perkembangannya;
pengelolaan ketergantungan yang sangat baik;
▫kemungkinan untuk mengganti implementasi dari
sofa
▫penggunaan kembali yang dipermudah;
▫testabilitas diutamakan (berkat isolasi dan pada
kemungkinan untuk menggantikan implementasi).
17
Praktik baik dalam Spring
Dekomposisi dalam lapisan (2/2)
Presentasi (misalnya, JSP, JSF,) Vue
Koordinasi (misalnya, Spring MVC, Struts) Pengendali
Métier (POJO) Layanan
Akses ke data (misalnya, JDBC, Hibernate,
JPA) DAO
Gudang
Ketekunan (misalnya, basis data)
data
18
Praktik baik dalam Spring:
Pemrograman berdasarkan kontrak (1/9)
•Principe:consiste à séparer la spécification d'une
lapisan perangkat lunak dari realisasinya.
Spesifikasi menghasilkan penciptaan
d'uneinterfaceet la réalisation fournit uneclasse
siapa yang mengimplementasikan antarmuka ini.
▫Kita dapat memproduksi beberapa penerapan yang berbeda
dari antarmuka yang sama.
19
Praktik baik dalam Spring:
Pemrograman dengan kontrak(2/9)
•Keuntungan:
▫Mengurangi ketergantungan: Kelas implantasi
ne se connaissent pas. Elles dialoguent au moyen des
antarmuka. Oleh karena itu, kita dapat dengan mudah mengubah sebuah
perimplantasi melawan yang lain tanpa harus memperbarui
totalitas perangkat lunak.
▫Mempermudah pengujian:Setiap lapisan perangkat lunak memiliki
spesifikasi yang jelas, mudah untuk mengaitkannya dengan sebuah permainan
tes yang dapat digunakan terlepas dari jenis penempatan.
▫Sederhanakan kode: Dalam beberapa kasus, kode
sebuah metode adalah deretan pertimbangan yang tidak terhubung
langsung antara mereka. Pemrograman berdasarkan kontrak akan
mempermudah pembangunan penempatan fasad yang
memikul masing-masing bagian dari pekerjaan.
▫Organisasi pengembangan.
20
Praktik baik dalam Spring:
Pemrograman berdasarkan kontrak(3/9)
•Contoh:
interfaceIUserDAO{
publik void tambahPengguna (Pengguna pengguna);
public User getUserById(Long Id);
}
kelas UserImplJDBC mengimplementasikan IUserDAO{}
//tambah metode yang belum diimplementasikan
} kelas UserImplJPAimplementsIUserDAO{
//tambah metode yang belum diimplementasikan
}
21
Praktik baik dalam Spring:
Pemrograman berdasarkan kontrak(4/9)
•Keuntungan utama: membangun aplikasi
terkait lemah
Couplage faible
Pengikatan kuat
22
Praktik baik dalam Spring
Pemrograman berdasarkan kontrak (5/9)
Couplage fort vs couplage faible
•Couplage fort: Ketika kelas A terhubung dengan kelas B,
dikatakan bahwa kelas A sangat terikat pada
kelas B.
Kelas A hanya dapat berfungsi di hadapan kelas
B.
Jika versi baru dari kelas B (yaitu B2) dibuat, kita
harus mengubah di kelas A.
▫Mengubah sebuah kelas melibatkan:
Harus memiliki kode sumber.
Anda harus mengompilasi ulang, menerapkan, dan mendistribusikan yang baru.
aplikasi untuk pelanggan.
Apa yang menimbulkan mimpi buruk dalam hal pemeliharaan
dari aplikasi
23
Praktik terbaik dalam Spring
Pemrograman berdasarkan kontrak (6/9)
Keterkaitan kuat vs keterkaitan lemah
•Contoh pengikatan kuat: Setiap layanan bisnis
mengandung referensi ke objek akses ke
data.
LayananPengguna UserDAOImplJPA
Ketergantungan antara layanan bisnis dan DAO
(pasangan kuat)
24
Praktik baik dalam Spring
Pemrograman berdasarkan kontrak (7/9)
Couplage fort vs couplage faible
•Kopling lemah: terdiri dari menggunakan antarmuka
untuk mengurangi ketergantungan antara kelas-kelas.
•Contoh pengikatan lemah:
▫Pengenalan antarmuka untuk DAO memungkinkan
memisahkan layanan dari implementasi DAO.
▫Antarmuka mendefinisikan kontrak komunikasi,
sementara implementasi DAO mengisinya:
layanan akan dapat menggunakannya, bahwa teknologi dari
persistance sousjacente soit JPA ou JDBC.
25
Praktik terbaik dalam Spring:
Pemrograman dengan kontrak(8/9)
Couplage fort vs couplage faible
•Contoh penggabungan lemah
LayananPengguna IUserDAO
UserDAOImplJDBC UserDAOImplJPA
Ketergantungan antara layanan bisnis dan DAO
(couplage faible)
26
Les bonnes pratiques dans Spring:
Pemrograman berdasarkan kontrak(9/9)
Dalam sebuah aplikasi
Musim semi, seluruhnya dari
komponen (pengontrol,
layanan dan DAO) adalah
dikelola oleh kontainer
ringan.
Komunikasi antar lapisan melalui antarmuka
27
Praktik baik dalam Spring:
Le singleton (1/2)
Singleton
Ini pasti adalah pola desain yang paling
terkenal.
•Sebenarnya, itu (sangat) digunakan di banyak bidang.
Model ini memastikan bahwa akan selalu ada
sebuah instance dari kelas tertentu yang akan diinstansiasi
dalam mesin virtual.
•Tujuannya sederhana:
▫Hindari waktu instansiasi kelas.
Hindari konsumsi memori yang tidak perlu.
•Model ini, bagaimanapun, memberlakukan suatu kendala
penting, kelas yang menyediakan layanan tidak boleh
memiliki pemahaman tentang sesi.
28
Praktik baik dalam Spring:
Le singleton (2/2)
Tujuannya adalah untuk menjamin keunikan instance, untuk itu ia
harus melarang penciptaan segala instance di luar
pengawasan kelas.
•Dengan tujuan ini, konstruktor dibuat privat dan sebuah metode
yang mengembalikan instance dari kelas disediakan.
public class Singleton {
private static Singleton instance= new Singleton();
privateSingleton() {}
public static Singleton getInstance() {
kembali instans;
}
}
29
Praktik baik dalam Spring:
Inversi kontrol (1/4)
•Ini adalah konsep sentral musim semi
•Disebut « prinsip Hollywood » sebagai referensi kepada
frasa mitos «jangan panggil kami, kami akan
appellerons ».
Ini adalah sebuah "pola desain" yang bertujuan untuk
memfasilitasi integrasi komponen satu sama lain.
•Konsep ini didasarkan pada pembalikan cara
tidak ada objek yang dibuat.
30
Praktik baik dalam Spring:
Inversi kontrol (2/4)
•Tujuan tidak lagi untuk menyediakan satu objek kepada yang lain
objek tetapi sebaliknya untuk memastikan bahwa, objek
jangan pada perlu, tahu sendiri apa yang dia punya
kebutuhan.
•Dan jika perlu jika salah satu objek yang diperlukan telah dia-
bahkan ketergantungan yang dia atasi untuk mereka
mendapatkan.
•Bentuk utama dari IoC:
"injeksi ketergantungan" (atau DI)
31
Praktik terbaik dalam Spring:
Inversi kendali (3/4)
Konsep injeksi ketergantungan
•Prinsip: bergantung pada objek pengumpul — yang
kontainer ringan—, mampu mengelola siklus
kehidupan komponen aplikasi, serta
ketergantungan mereka, dengan menyuntikkannya dengan cara
tepat.
•Avantages:
▫Komponen lebih independen dari mereka
lingkungan eksekusi.
▫Mereka tidak perlu khawatir tentang instansiasi mereka
ketergantungan dan dapat fokus pada tugas mereka
utama.
32
Praktik baik dalam Spring:
Pembalikan kontrol (4/4)
Konsep injeksi ketergantungan
Ada empat jenis injeksi:
▫Injeksi melalui konstruktor: sebuah objek diinjeksikan dengan
ketergantungan pada saat ia dibuat, yaitu melalui
argumen dari konstruktornya.
▫Injeksi melalui mutator (setter): sebuah objek dibuat, kemudian
ketergantungannya disuntikkan melalui setter.
▫Injeksi antarmuka: sebuah objek dibuat kemudian ...
ketergantungan disuntikkan kepadanya melalui metode lain
=> Menggunakan antarmuka untuk mendefinisikan metode injeksi ini
▫Injeksi oleh medan: metode ajaib yang semakin meningkat
populer
33
Praktik baik dalam Spring:
Pemrograman berbasis aspek (1/4)
•Sebuah modul atau komponen bisnis secara teratur
tercemar oleh banyak panggilan ke komponen
alat bantu eksternal.
34
Praktik baik dalam Spring:
Pemrograman berdasarkan aspek (2/4)
•Ini berarti:
▫Keterikatan kode.
▫Reusabilitas yang rendah.
▫Kualitas lebih rendah akibat kompleksitas kode.
Kesulitan untuk berkembang.
•Solution: externaliser tous les traitements non
terkait dengan logika bisnis di luar komponen.
Untuk melakukan ini, perlu dapat mendefinisikan pengobatan.
secara deklaratif atau pemrograman pada
poin kunci dari algoritma.
▫Biasanya sebelum atau setelah metode.
35
Praktik baik dalam Spring:
Pemrograman berdasarkan aspek (3/4)
•Penggunaan POA
▫Les classes pour la logique métier
▫Aspek untuk aspek teknis
36
Praktik baik dalam Spring:
Pemrograman berdasarkan aspek (4/4)
•Butuh seorang penenun aspek
▫misalnya AspectJ untuk bahasa JAVA
•Peran: menyatukan semua aspek di seluruhnya
kelas program.
▫Pada saat kompilasi
Pada saat pelaksanaan
37
38
Apa itu Spring Boot?
Ini adalah Kerangka kerja yang dirancang terutama
untuk mengembangkan arsitektur berbasis mikro-
layanan
▫Idenya adalah membagi sebuah aplikasi menjadi kecil
unit yang diterapkan dalam bentuk mikro-layanan
▫Setiap mikro-layanan bertanggung jawab atas
fitur dasar, dikembangkan, diuji dan
dikerahkan secara independen dari yang lain
▫Setiap mikro-servis dapat dirancang menggunakan
bahasa dan teknologi apa pun
Couplage faible
39
Keuntungan Spring Boot
•Memfasilitasi pengembangan aplikasi
kompleks
•Memudahkan injeksi ketergantungan
•Memfasilitasi pengelolaan ketergantungan dengan Maven
•Mengurangi file konfigurasi dan mendukung
otomatisasi konfigurasi
•Menyediakan kontainer ringan tersemat (Tomcat)
40
Pembuatan proyek Spring Boot
41
Pembuatan proyek Spring Boot
42
Pembuatan proyek Spring Boot
43
Struktur sebuah proyek Spring Boot
44
Alat integrasi terus menerus: Maven atau
Gradle
•Alat-alat ini memainkan peran penting selama
manajemen dan otomatisasi produksi dari
perangkat lunak
▫Mengelola ketergantungan
▫Mulai kompilasi sumber
▫Lakukan pengujian unit
▪Menghasilkan paket (war, jar, ear, dll.)
▫Mengdeploy aplikasi di server
▫…
45
File [Link]
•Ini adalah cuplikan dari file:
dependencies>
<dependency>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</ketergantungan>
<ketergantungan>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<ketergantungan>
<groupId>[Link]</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<ketergantungan>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<lingkup>runtime</lingkup>
</dependency>
…</dependencies>
46
Berkas [Link]
•Peran: mengatur konfigurasi sumber dari
data, server, dll.
•Contoh:
[Link]=jdbc:mysql://localhost:3306/SpringBoot?server
Timezone=UTC
[Link]=root
[Link]=
[Link]=[Link]
# Hibernate ddl auto (buat, buat-hapus, perbarui)
[Link]-auto=update
Dialek SQL membuat Hibernate menghasilkan SQL yang lebih baik untuk
basis data yang dipilih
[Link] =
[Link].MySQL5Dialect
47
Titik masuk sebuah aplikasi
Spring Boot
•Sebuah kelas yang ditandai dengan @SpringBootApplication
@SpringBootApplication
Kelas Publik FirstSpringProjectApplication {
publik statis void utama(String[] args) {
[Link]([Link],args);
}
}
•Anotasi ini setara dengan 3 anotasi ini
ansambel
@EnableAutoConfiguration: mengaktifkan autokonfigurasi
▫@ComponentScan: mencari bean di paket dari
aplikasi Anda
▫@Configuration: mendeklarasikan sebuah kelas sebagai
kelas konfigurasi
48
Percobaan Perdana
•Membuat proyek Spring Boot
•Ubah kode seperti berikut:
@SpringBootApplication
publik kelas NonWebSpringProjectApplicationmengimplementasikan
CommandLineRunner{
publik statis void utama(String[]args) {
[Link]([Link], argumen);
}
publik void run(String... args) lempar Exception {
[Link]("Halo Musim Semi");
}
}
•Jalankan aplikasi sebagai aplikasi
JAVA
49
Percobaan Kedua
@Komponen :
•Tambahkan kelas ini berkaitan dengan
@Komponen
Nama biji anotasi dasar
HaloKacang yang menandakan sebuah
publik kelas HelloBean {
publicString getMessage(String komponen yang dikelola oleh
pesan)
{
Musim semi.
kembali"Halo Musim Semi"+msg;
} Nama biji
@Komponen("monbean") monbean
} kelas Publik HelloBean {
publicString getMessage(String
pesan)
{
return "Halo Musim Semi" + msg;
}
}
50
Percobaan Kedua
•Injeksi ketergantungan bean HelloBean dengan
Penggunaan anotasi @Autowired dan pemanggilan metode
di kelas utama
@SpringBootApplication
kelas Publik NonWebSpringProjectApplication mengimplementasikan
CommandLineRunner{
@Autowired
privat HelloBeanbean;
publik statis void utama(String[] argumen) {
[Link]([Link],args);
}
publik void run(String...args) throws Exception {
[Link]([Link](" From ENIS Engineer"));
}
}
51
Percobaan Ketiga
•Jadi contoh berikut:
publik antarmuka IMedecinDAO {
publik void tambahDokter(Medecin obj);
publik void hapusDokter(Long id);
public void updateMedecin(Medecin obj);
publicMedecin findMedecinByID(Longid);
publicList<Medecin> temukanSemua();
}
publik kelas MedecinDAO mengimplementasikan IMedecinDAO {
}
52
Percobaan Ketiga: MedecinDAO
@Repository
kelas Publik MedecinDAO menerapkan IMedecinDAO {
@ContextPersistence
privateEntityManagerem;
@Transactional
publik void tambahDokter(Medik obj) {
[Link](obj);
@Transactional
publik void hapusDokter(Long id) {
[Link]([Link]([Link],id));
@Transaksional
publik void updateMedecin(Medecin obj) {
[Link](obj);
publicMedecin findMedecinByID(Long id) {
[Link]([Link],id);
publicList<Medecin> findAll() {
Queryreq=[Link]("select m from Medecin
m");
[Link]();}}
53
Percobaan Ketiga: kelas utama
publik kelas FirstSpringProjectApplication mengimplementasikan
CommandLineRunner{
@Autowired
privateIMedecinDAOdao;
publik statis void utama(String[] args) {
[Link]([Link],
args);
}
publik void jalankan(String... argumen) melempar Pengecualian {
[Link](newMedecin("Faouzi","Njah",new
Tanggal(),"mohamed@[Link]",null,"2222"));
Dokter = [Link](3L);
[Link]("Mariam");
[Link](m);
[Link](2L);
}
}
54
Cara lain untuk mengakses data
55
Pengingat tentang arsitektur kami
Back-end
Sofa Lapisan dari Lapisan akses
Couche sécurité pameran dari
layanan profesi ke data
services
DAO
Layanan
Musim Semi
Musim Semi RESTful data
keamanan Pengendali
JPA
Entitas
Hibernate
56
Prinsip Spring Data (1/4)
Spring Data menawarkan beberapa antarmuka termasuk
interfaces des Repository peuvent hériter, afin de
dibuang secara otomatis saat mereka dihasilkan
implementasi fungsional:
▫CrudRepository<T,ID>
▫PagingAndSortingRepository<T, ID>
▫JpaRepository<T,ID>
57
Prinsip Spring Data (2/4)
•CrudRepository ditentukan oleh template
Generik, prototipe dalam tanda tangan kelasnya :
▫Definisi Tipe yang terkait dengan kelas model
(dia sendiri juga merupakan Entity JPA, sebuah kelas
mendeklarasikan @Entity).
▫Dan sebuah tipe, yang memungkinkan untuk mendefinisikan tipe kunci primer
terkait dengan entitas, baik itu unNumber (Integer, Long), atau
untuk Kunci Terkomposisi melalui kelas khusus,
dalam kedua kasus, tipe tersebut pasti Serializable
(pembatasan yang dikenakan).
CrudRepository menyediakan implementasi standar
dan secara default untuk metode umum berikut:
save, findOne, findAll, count, delete, exists, ...
Dengan demikian memungkinkan untuk memiliki metode utama
diperoleh dalam konteks layanan DAO (tidak perlu untuk mereka
ré-implémenter)
58
Prinsip Spring Data (3/4)
•PagingAndSortingRepositoryMewarisi dari
l’interfaceCrudRepository, dengan mengikuti yang sama
definisi templating Generics
•menyediakan metode tambahan untuk pengurutan
findAll(Sort), dan paginasi findAll(Pageable).
59
Prinsip Spring Data (4/4)
•JpaRepository mewarisi antarmuka
PagingAndSortingRepository, dengan menambahkannya
quelques méthodes spécifiques
•Antarmuka ini, yang paling canggih, mengelompokkan
seluruh rangkaian semua fitur yang ditawarkan
par Spring Data JPA.
60
SpringData melalui contoh (1/2)
•Untuk menggunakan Spring Data, perlu mendeklarasikan spring-
boot-starter-data-jpa sebagai ketergantungan dalam
[Link]
•Buat untuk setiap entitas yang persisten, sebuah antarmuka
Mewarisi antarmuka JpaRepository
publik antarmuka MedecinRepository memperluas JpaRepository<Medecin, Long>
{
}
61
Spring Data melalui contoh (2/2)
•Kita dapat menentukan Query JPQL kita sendiri
langsung di dalam tubuh antarmuka, di
mendefinisikan ulang implementasi standar dengan sebuah
@nnotation @Query(" select... " )
publik antarmuka MedecinRepository memperluas JpaRepository<Medecin, Long>
{
select m from Medecin m where [Link] like :x
publicList<Medecin> chercher(@Param("x")Stringmc);
}
62
Rappel de notre architecture
Back-end
Sofa
Lapisan Lapisan akses
Couche sécurité pameran
layanan profesi data
layanan
DAO
Layanan
Musim Semi
Musim Semi RESTful data
keamanan Pengendali
JPA
Entitas
Hibernate
63
Implementasi lapisan bisnis
(1/4)
•Menentukan antarmuka yang berisi spesifikasi dari
bagian bisnis dari sebuah aplikasi
•Mendefinisikan kelas yang mengimplementasikan antarmuka ini dan
menggunakan anotasi @Service
• Anotasi ini adalah bentuk khusus dari
anotasi @Component yang ditujukan untuk digunakan dalam
lapisan layanan.
•Contoh:
▫Menentukan antarmukaIPatientServiceserta
implementasi
▫Menentukan antarmuka IMedecinService serta
implementasi
▫Mendefinisikan interface IConsultationService serta
implementasi
64
Implementasi lapisan bisnis
(2/4)
publik interface IPatientService {
//Metode Crud
publikPasien tambahPasien(Pasienp);
publik void hapusPasien(Long id) ;
publicPatient updatePatient(Patientp);
publicPatient findPatient(Longid) ;
publicList<Patient> temukanSemua();
//Metode lain
publicMedecinGeneraliste findMG(LongpatientID);
publicCollection<MedecinSpecialiste> findMS(LongpatientID);
}
@Layanan
@Transaksional
publik kelasPatientServiceimplementsIPatientService {
@Autowired
PatientRepositorypatDao;
65
Implementasi lapisan bisnis
(3/4)
@Service
Transaksional
publik kelas LayananPasien mengimplementasikan IPelayananPasien {
@Autowired
PatientRepositorypatDao;
publicPatient addPatient(Patientp) {
[Link](p);
}
public voiddeletePatient(Longid) {
Optional<Patient> p = [Link](id);
jika(p!=null)
[Link]([Link]());
}
publikPembaruan pasien(Pasienp) {
[Link](p);
}
publicPatient findPatient(Longid) {
[Link](id);
}
66
Implementasi lapisan bisnis
(4/4)
publicList<Patient> findAll() {
[Link]();
}
publicMedecinGeneraliste findMG(LongpatientID) {
Optional<Patient>p=[Link](patientID);
jika(p!=null)
[Link]().getGeneraliste();
kembali null;
}
publicCollection<MedecinSpesialis> findMS(Long
patientID) {
Optional<Patient> p = [Link](patientID);
jika(p!=null)
[Link]().getSpesialis();
kembalikan null;
}
}
67
Pengingat tentang arsitektur kami
Back-end
Bantal
Lapisan Lapisan akses
Couche sécurité pameran dari
layanan profesi data
layanan
DAO
Service
Musim Semi
Musim Semi RESTful data
keamanan Pengendali
JPA
Entitas
Hibernate
68
Implementasi lapisan bisnis di
menggunakan layanan Web RESTful
•Layanan Web RESTful adalah kelas Java
dihiasi dengan anotasi @RestController
•@RestControllerest simplement la combinaison
dari dua anotasi:
▫@Controller di Spring yang memungkinkan untuk menunjuk sebuah
kelas sebagai pengendali, yang memiliki kemampuan untuk memproses
permintaan jenis GET, POST, dll.
Anotasi ini dapat digunakan untuk mengidentifikasi
pengendali untuk Spring MVC
▫@ResponseBody ditambahkan pada tingkat dari
metode yang harus menjawab langsung tanpa
passer par une vue.
69
Implementasi lapisan bisnis dalam
menggunakan layanan Web RESTful
Kami akan membuat layanan web RESTful
mempresentasikan API REST yang mengelola operasi CRUD
entitas pasien, dokter, dan konsultasi
▫[Link]
▫[Link]
▫[Link]
Setiap pengendali akan bertanggung jawab untuk menjawab kepada
permintaan CRUD dan melakukan operasi
diperlukan.
70
Implementasi lapisan bisnis dalam
menggunakan layanan Web RESTful
•Kami mencari untuk memanggil misalnya mikro-
layanan yang mengelola pasien di URL berikut:
▫Permintaan GET ke /Patients: menampilkan daftar semua
pasien;
▫Permintaan GET ke /Patients/{id}: menampilkan seorang pasien
melalui Idnya ;
▫Permintaan PUT ke /Patients/{id}: memperbarui seorang
pasien berdasarkan Id-nya ;
▫Permintaan POST ke /Patients: menambahkan seorang pasien;
▫Permintaan DELETE ke /Patients/{id}: menghapus sebuah
pasien berdasarkan Id-nya.
71
Implementasi lapisan bisnis di
menggunakan layanan Web RESTful
@RestController
kelas PublikKontrolerPasien {
@Autowired
PatientRepositorypRep;
@RequestMapping(value="/patients ", method=[Link])
publicList<Patient> findPatients ()
{
[Link]();
}
}
•@RequestMapping memungkinkan untuk menghubungkan antara URI
"/patients", invoquée via GET, et la méthodefindPatients()
•Anotasi ini digunakan pada tingkat kelas dan
metode.
•Kita bisa menggunakan sebagai pengganti @GetMapping
72
Implementasi lapisan bisnis dalam
menggunakan layanan Web RESTful
@RequestMapping(value="/pasien/{id}", method=[Link])
publicPatient findOnePatient(@PathVariableLongid)
{
[Link](id).get();
}
•@PathVariable Anotasi ini digunakan untuk menandai
argumen metode manajer permintaan.
•Metode ini hanya harus menjawab permintaan dengan
sebuah URI jenis /Patients/2 misalnya.
73
Implementasi lapisan bisnis dalam
menggunakan layanan Web RESTful
•Respons JSON yang diperoleh
74
Implementasi lapisan bisnis di
menggunakan layanan Web RESTful
@RequestMapping(value="/patients/MG/{id}", method=[Link])
publicMedecin findMG(@PathVariableLongid)
{ Mencari
Pasienp=[Link](id).get(); dokter
[Link](); umum
}
@PostMapping(value="/Pasien")
publicPatient savePatient(@RequestBodyPatientp)
{
[Link](p); Tambah
}
•@RequestBodyCette annotation demande à Spring que le
JSON yang terdapat dalam tubuh permintaan akan diubah
dalam objek
75
Implementasi lapisan bisnis dalam
menggunakan layanan Web RESTful
@RequestMapping(value="/patients/{id}", method=[Link])
publik void hapusPasien(@PathVariable Long id)
{
[Link](id);
} Hapus
@RequestMapping(value="/patients/{id}", method=[Link])
publicPatient updateContact(@PathVariable(name="id") Longid,
@RequestBodyPatientp)
{
[Link](id);
[Link](p);
} Modifier
76
77
Pengantar
Spring Security adalah Kerangka kerja keamanan
ringan yang menyediakan dukungan untuk mengamankan
aplikasi Musim Semi.
•Ia dilengkapi dengan implementasi algoritma
keamanan populer
SpringSecurity mencoba memberikan solusi untuk ini
dua permasalahan :
▫autentikasi (tahu siapa saya)
▫otorisasi (tahu apa yang saya berhak untuk
faire)
78
Keamanan dasar dengan Spring Security
•Untuk menggunakan Spring Security, sertakan ketergantungan ini
di file [Link] Anda
<ketergantungan>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Konfigurasi seperti itu memungkinkan untuk memiliki keamanan tingkat 0
▫Akses ke fitur situs harus dilakukan setelah
autentikasi
▫Untuk pengguna default "user", kata sandinya adalah
dihasilkan secara acak setiap kali dimulai:
79
Keamanan dasar dengan Spring security
{"nom": "mohamed", "prenom": "keskes",
"dateNaissance": "2018-10-16", "photo": null,
"email": "mohamed@[Link]", "tel": "2844777",
"numCnam": "15588123", "generaliste": { "id": 1,
"nom": "Faouzi", "prenom": "Njah",
localhost:8080/pasien/1 "dateNaissance": "2018-10-16", "email":
"mohamed@[Link]", "photo": null,
"codePublic": "2222" }, "id": 1}
80
Sécurité basique avec Spring security
•Kata sandi yang telah dibuat dapat diubah
melalui file [Link] seperti
suit
[Link]=user
[Link]=1111
81
Peran dan pengguna disimpan dalam memori
Peran dan pengguna yang disimpan dalam DB
82
Peran dan pengguna yang disimpan dalam memori
Autentikasi (1/6)
Langkah pertama adalah membuat sebuah kelas dari
konfigurasi
▫Menggunakan anotasi @Configuration
▫Menggunakan juga salah satu dari anotasi ini
@EnableWebSecurity, et/ou
@EnableGlobalMethodSecurity, et/ou
@EnableGlobalAuthentication.
▫Semua tergantung pada tingkat keamanan yang diaktifkan
83
Peran dan pengguna yang disimpan dalam memori
Autentikasi (2/6)
•Ini adalah contoh bean konfigurasi
@Configuration
@EnableKeamananWeb
publik kelas MySpringSecurityConfig diperluas
WebSecurityConfigurerAdapter{
@Autowired
publik void konfigurasiGlobal(AuthenticationManagerBuilder auth)
melemparPengecualian {
[Link]()
.withUser("user").password("{noop}123").roles("USER");
}
}
•Mode otentikasi dalam kode ini:
▫setiap pengguna didefinisikan secara manual dalam aplikasi. Sebagai contoh
Hanya pengguna "user" dengan peran "USER" yang dapat melakukan otentikasi.
84
Peran dan pengguna yang disimpan dalam memori
Autentikasi (3/6)
•Prefiks pada tingkat kata sandi{noop}adalah
digunakan untuk menjaga kesalahan encoder dari Spring
Keamanan 5 :NoOpPasswordEncoder
▫Ini bukan praktik yang baik untuk menyimpan kata sandi
dalam teks biasa
▫Encoder ini tidak aman, digunakan hanya untuk uji coba
Lebih baik menggunakan encoder
BCryptPasswordEncoder
85
Peran dan pengguna yang disimpan dalam memori
Autentikasi(4/6)
•Dans le cas de notre application Web:
@Konfigurasi
@EnableWebSecurity
publik kelas MySpringSecurityConfig memperluas
WebSecurityConfigurerAdapter{
@Autowired
publik void konfigurasiGlobal(AuthenticationManagerBuilder auth)
throwsException {
otentikasi
.inMemoryAuthentication()
.withUser("admin").password("{noop}1111").roles("ADMIN").and()
.denganPengguna("pasien").kataSandi("{noop}2222").peran("PASIEN").dan()
.withUser("medecin").password("{noop}3333").roles("MEDECIN");
}
}
86
Peran dan pengguna yang disimpan dalam memori
Otentikasi(5/6)
•Saat memuat bean ini, sebuah filter servlet
(springSecurityFilterChain) telah dibuat.
▫Dia yang akan mengatur seluruh keamanan
memvalidasi apakah pengguna terautentikasi atau tidak
memvalidasi apakah pengguna memiliki hak akses ke
sumber atau tidak
mengelola otentikasi dan pemutusan sambungan pengguna
mengelola kasus kesalahan dan mengarahkan pengguna ke
halaman kesalahan
87
Peran dan pengguna yang disimpan dalam memori
Authentification(6/6)
Anda harus benar-benar mendefinisikan satu dan hanya satu
AuthenticationManagerBuilder
aplikasi.
Kelas ini memungkinkan untuk menentukan apa mode yang akan digunakan
otentikasi pengguna.
▫autentikasiDalamMemori()
▫jdbcAuthentication()
88
Peran dan pengguna yang disimpan dalam memori
Otorisasi(1/5)
•Untuk menambahkan aturan keamanan dan sumber daya
yang ingin dilindungi, kita harus mendefinisikan ulang metodenya
berikutnya
@Override
protected voidconfigure(HttpSecurityhttp)throwsException {
//TODOMetode yang dihasilkan secara otomatis
[Link](http);
}
89
Peran dan pengguna yang disimpan dalam memori
Autorisasi: mengamankan URL (2/5)
• Kelas konfigurasi kami yang diberikan sebagai contoh
mengusulkan konfigurasi default yang adalah
selanjutnya:
dilindungi void konfigurasi(HttpSecurity http) melempar Pengecualian
{
http
.authorizeRequests() Aturan keamanan pertama:
Setiap permintaan harus diautentikasi
.anyRequest().authenticated()
.dan() Aturan keamanan kedua
.formLogin() Alihkan permintaan ke formulir masuk
.dan()
Aturan keamanan ketiga
.httpBasic();
}
90
Peran dan pengguna disimpan dalam memori
Otorisasi : mengamankan URL (3/5)
• Kita bisa kurang ketat atau lebih ketat.
dengan mendefinisikan ulang metode ini dan di
memersonakan sesuai kebutuhan kami
• Contoh:
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/patients/**").hasRole("ADMIN")
.dan()
.formLogin()
.defaultSuccessUrl("/patients");;
}
91
Peran dan pengguna yang disimpan dalam memori
Otorisasi: mengamankan metode (4/5)
•Kita dapat menambahkan keamanan di sisi metode
•Anda harus menggunakan anotasi berikut pada kelas
konfigurasi keamanan Spring:
@EnableGlobalMethodSecurity(securedEnabled = true)
•Anda juga perlu menggunakan anotasi @securedau
tingkat metode sebagai berikut :
@Diamankan("ROLE_ADMIN")
publicvoiduneMethodeSecurisee() {
// kode yang hanya dapat dijalankan
oleh admin
}
N.B: Spring Security secara otomatis menambahkan
préfixeROLE_àn’importequel rôle
92
Peran dan pengguna yang disimpan dalam memori
Otorisasi: amankan metode (5/5)
•Contoh: Hanya administrator yang memiliki hak untuk
daftar semua pasien
@RequestMapping(value="/patients",method=[Link])
@Dijamin({"PERAN_ADMIN", "PERAN_MEDECIN"})
publicList<Patient> findPatients ()
{
[Link]();
}
93
Peran dan pengguna yang disimpan di BD
Pengguna Peran
* *
username: String
role: String
password: String
description: String
activated:boolean
•Harus membuat entitas-entitas ini
•Membuat lapisan DAO dengan mengimplementasikan antarmuka
UserRepositoyetRoleRepository
•Mengisi tabel dengan mendefinisikan misalnya 3 pengguna:
seorang administrator, seorang pasien dan seorang dokter
Anda dapat menambahkan layanan Rest untuk mengelola
pengguna dan peran
94
Peran dan pengguna yang disimpan di BD
Création des entités USER et ROLE
@Entitas
publik kelas Pengguna mengimplementasikan Serializable {
@Id
privateStringusername;
privateStringpassword;
private boolean aktif;
@ManyToMany
privateCollection<Role>roles;
// Getter, setter, dan konstruktor
}
@Entitas
public classRoleimplementsSerializable {
@Id
privateStringperan;
privateStringdeskripsi;
//Pengambil, penetap dan konstruktor
}
95
Rôles dan pengguna disimpan di BD
Pembuatan repository
publik antarmuka UserRepository memperluas JpaRepository<User, String>
{
}
publik antarmuka RoleRepository memperluas JpaRepository<Role, String> {
}
96
Peran dan pengguna yang disimpan di BD
Definisi pengguna dan peran
@Autowired
RoleRepositoryroleRepository;
publik statis void main(String[] args) {
[Link]([Link],args);
}
publik void run(String...args) melempar Exception {
//penyisipan peran aplikasi
Roleadmin=newRole("ADMIN","administrateur");
Rolepatient=newRole("PATIENT","patient");
Rolemedecin=newRole("MEDECIN","medecin");
[Link](admin);
[Link](patient);
[Link](medik)
}
97
Peran dan pengguna disimpan di BD
Definisi pengguna dan peran
insertion 3 pengguna
UseradminUser=newUser("admin","1111",true);
Collection<Role> lst = new ArrayList<>();
[Link]([Link]("ADMIN").get());
[Link](lst);
[Link](adminUser);
UserpUser=newUser("pasien1","p2222",true);
Collection<Role>lst1=newArrayList<>();
[Link]([Link]("PATIENT").get());
[Link](lst1);
[Link](pUser);
UsermUser=newUser("medecin1","m2222",true);
Collection<Role>lst2=newArrayList<>();
[Link]([Link]("MEDECIN").get());
[Link](lst2);
[Link](mUser);
98
Peran dan pengguna disimpan di DB
Autentikasi
@Autowired
publik void konfigurasiglobal(AuthenticationManagerBuilder auth,
DataSourcedataSource)throwsException {
[Link]()
.dataSource(dataSource)
.usersByUsernameQuery("select username as principal, password as
kredensial, benar dari pengguna dimana nama_pengguna=?
pihakBerwenangDenganKueriNamaPengguna("pilih user_username sebagai prinsipal,
roles_role sebagai peran dari user_roles di mana user_username=?
.rolePrefix("ROLE_");
•Dua permintaan ini digunakan oleh Spring Security untuk
▫Mengambil pengguna dan memeriksa keberadaan dan kata sandinya
de passe
▫Mengambil peran pengguna ini
99
Peran dan pengguna yang disimpan di BD
Pengkode Kata Sandi
•Tentukan pengkode kata sandi dalam kelas
konfigurasi Spring Security
@Bean
publicPasswordEncoder passwordEncoder(){
PasswordEncoder encoder = new BCryptPasswordEncoder();
returnencoder;
}
•Ini berarti bahwa kata sandi telah dimasukkan dalam
basis data terenkripsi
Stringpassword= passwordEncoder().encode("0000");
UseradminUser=newUser("superadmin",password,true);
Collection<Role> lst = newArrayList<>();
[Link]([Link]("ADMIN").get());
[Link](lst);
[Link](adminUser);
100
Pendalaman
•Tutorial tentang keamanan Spring dan JWT (Json Web)
Token)
•[Link]
Q4dk&list=PLI4OjXANJOaFv4XCI1wwO7ZDURpN
I18Iu
101
Kekurangan keamanan
Penyalahgunaan Permintaan Situs Silang (CRSF)
•Tipe kerentanan layanan
otentikasi Web
Serangan ini memungkinkan untuk mengirimkan kepada seorang
pengguna terautentikasi
•Sebuah permintaan HTTP palsu yang mengarah ke sebuah
tindakan internal di situs
•Agar dia melakukannya tanpa menyadarinya dan dalam
menggunakan haknya sendiri
•Pengguna menjadi komplotan dari sebuah serangan
tanpa menyadarinya