23 decembrie 2022

What’s New in Java 11 - partea 2

Ce e nou introdus

java.net.HttpURLConnection -> HttpClient, HttpRequest, HttpResponse

Exemplu #1:











Exemplu #2:















- CompletableFuture a fost introdus în Java8, pentru apeluri asincrone

- join este necesar pentru a aștepta unirea thread-ului curent (main) cu cel care face apelul Http; pentru ca programul să nu se termine înainte de primirea răspunsului


Ce e nou în librării

String:

> "he".repeat(3); // "hehehe"

> "".isBlank(); // true

> "\n\t    text     \u2005".strip();  // "text"

> "1 \n 2 \n 3 \n 4".lines().forEach(System.out::println);   // scrie pe linii noi 1 2  3  4

   

Files:

String readString (Path path);

Path writeString(Path path, CharSequence cs, OpenOptions options);


Optional:  Optional.ofNullable(null).isEmpty();  // true

Predicate::not


Unicode 10

  • update de la Unicode 8 (Java 10)
  • sunt adăugate mai mult de 16.000 caractere noi
  • caracterele aparțin la 10 sisteme de scriere noi, printre care și cel nepalez


Inferența tipului de variabilă locală cu var:

> var name = "Ana";

> (@Nonnull var a, @Nullable var b) -> a.concat(b)










Performanță și securitate

Garbage collector: G1 GC (încă din Java 9)

Noutate: Epsilon GC = rulare fără GC până când crapă aplicația = No GC paradigm

- pt aplicații predictibile în ce privește consumul de memorie, eventual cu o durată de viață mică

- util pt testarea performanței unei aplicații

- este o opțiune experimentală: -XX:+UnlockExperimentalVMOptions, -XX:+UseEpsilonGC

Noutate: Z Garbage Collector

- ia pauză sub 10 secunde

- durata pauzei e constantă (nu crește odată cu heap size)

- disponibil doar în Linux x64: -XX:+UnlockExperimentalVMOptions, -XX:+UseZGC


TLS 1.3 = transport layer security (asemănător https)

11 decembrie 2022

What’s New in Java 11 - partea 1

Java - acum este lansată o dată la 6 luni

Java 11 - marcat pentru suport pe termen lung (LTS)

LTS este doar pentru Oracle JDK (cu subscripție); pentru OpenJDK suportul este de 6 luni, până la următorul release


Java 9: module system

Java 10: local variable type inference

Java 11

  • convergența Oracle JDK cu OpenJDK (singura diferență rămâne LTS)
  • lansat în 2018, în același an cu Java 10; noul plan este de 2 release-uri pe an, cu un LTS o dată la 3 ani („garanția” este minim 3 ani pt produs)
  • poți compila direct java Hello.java (în loc să treci prin pasul intermediar de creare class file) - este limitat la un singur fișier sursă; nu se creează un fișier .class
  • fișier care poate fi rulat ca script (dacă este prefixat cu #! ./bin/java --source 11) - fișierul poate să aibă orice extensie (dacă nu era script se primea eroare)


Deprecări

API-uri scoase din JDK: 

  • java.xml.bind (JAXB) -> jaxb-api & jaxb-impl din javax.xml.bind respectiv com.sun.xml.bind
  • java.xml.ws, java.xml.ws.annotation
  • java.corba
  • java.transaction 
  • java.activation

Metode scoase:

  • destroy & stop(Throwable) din Thread
  • runFinalizersOnExit din java.lang.System & java.lang.Runtime
  • 4 metode din SecurityManager (la functionalitati awt care nu mai sunt suportate)

JavaFX

  • a făcut parte din Oracle JDK 8, 9, 10
  • nu mai face parte din Oracle JDK 11 -> mutat în OpenJFX
  • Javapackager scos -> este propus jpackager

Tehnologii scoase:

  • applet 
  • Java Web Start -> jlink, jpackager?
  • Nashorn (marcat ca deprecated)

28 noiembrie 2022

Spring 5 Fundamentals - ziua 3

Configurări XML

Încă există = se pot folosi. Unele lucruri sunt mai simple cu XML. Se poate separa mai bine de restul codului.

----  application-context.xml  ----

<beans xmlns="" xmlns:xi="" xsi:schemaLocation="">

  <bean name="" class="cale_completă_către_implementare" >
    <property name="speakerRep" ref="speakerRep"> </property>   <!-- setter injection: name definește care setter, iar ref valoarea parametrului (definit mai sus, ca alt bean)  -->
  </bean>

  <bean name="" class="cale_completă_către_implementare" >
    <constructor-arg index="0" ref="speakerRep"> </constructor-arg>   <!-- constructor injection -->
  </bean>

</beans>


 Beans 
  • în esență sunt clase
  • înlocuiesc ce urmează după new 
  • se obțin tot cu appContext.getBean(...)

 Autowiring 
  • byType - face wire cu o instanță de tipul cerut (trebuie să fie unică)
  • byName - face wire după numele bean-ului
  • constructor
  • no (nu dă voie să se facă autowiring)

  <bean name="" class="cale_completă_către_implementare"  autowire="constructor">
  </bean>


Factory Bean


 SpEL  = Spring Expression Language - folosit mai mult în librării 

@Value ("#{ T(java.lang.Math.random() * 100) }")  // se determină la runtime, util în chestiuni de securitate
private double seedNum;


Spring AOP Proxies


 Bean Profiles  

@Repository("speakerRepository")
@Profile("dev")
public class HibernateSpeakerRepositoryImpl implements SpeakerRepository {
  . . .
}


VM option: -Dspring.profiles.active=dev
Altfel, bean-ul nu este disponibil. 

23 noiembrie 2022

Spring 5 Fundamentals - ziua 2

5 scopes

  • Singleton: un singur bean (o singură instanță per container Spring), este scopul prestabilit
  • Prototype: un bean nou (instanță) la fiecare request = opusul lui Singleton
  • Request: un bean la fiecare request http
  • Session: un bean la fiecare sesiune 
  • Global: un bean per aplicație (racordat la durata aplicației, și nu a vizitei mele în aplicație)

Singleton, prototype --> în orice configurație

Request, session, global --> doar în proiecte web


@Service("customerService")

@Scope("singleton")

public class CustomerServiceImpl ...


sau

@Bean(name = "customerRepository")

@Scope(value = BeanDefinition.SCOPE_SINGLETON) // BeanDefinition.SCOPE_PROTOTYPE

public CustomerRepository getCustomerRepository() { ... }


@Autowired

Adnotarea poate fi deasupra setter-ului = injectează bean-ul. Poate fi și în constructor.

Fully autowired - cu stereotipuri: 
  • @Component - echivalentul unui bean la nivel de clasă
  • @Repository
  • @Service (cu sensul că găzduiește business logic)
  • @Controller (pentru creare de servicii web sau microservicii)

@Repository("speakerRepository")
public class HibernateSpeakerRepositoryImpl implements SpeakerRepository {
  . . .
}


@Service("speakerService")
public class SpeakerServiceImpl implements SpeakerService {
  . . .
}


@Configuration
@ComponentScan( {"com.application.path"} )
public class AppConfig {
  // nu mai este nevoie de declarare beans
}

22 noiembrie 2022

Spring 5 Fundamentals - notițe ziua 1

Spring = JEE, POJO based (plain old java object), construit în jurul conceptelor considerate best practice

WORA = write once run anywhere

Spring este folosit pentru a nu mai scrie cod de configurare în aplicație => mai citeț, mai ușor de testat.


Diferențe Spring 5 față de versiuni anterioare:

  • lipsește applicationContext.xml
  • configurări din Java direct în loc de xml-uri


Transformare în proiect Spring:

@Configuration  // înlocuitorul pt applicationContext.xml

public class AppConfig {


  // un bean rămâne „înregistrat” în Spring => este un singleton

  // name e opțional 

  // aplicabil doar la nivel de metodă, nu și de clasă


  @Bean(name = "customerRepository")   

  public CustomerRepository getCustomerRepository() {

    CustomerRepository cust  = new CustomerRepositoryImpl();

    cust.setCustomerAttr(getCustomerAttr());   // setter injection

    return cust;

  }


  @Bean(name = "customerAttr")

  public CustomerAttr getCustomerAttr() {

    return new ... ();

  }

}


public class Application {

  public static void main(String args[]) {

    ApplicationContext appContext = new AnnotationConfigApplicationContext(AppConfig.class);

    CustomerRepository custRepo = appContext.getBean("customerRepository", CustomerRepository.class);

    // do something with custRepo

  }

}


Alternativă la setter injection ----> constructor injection