Se afișează postările cu eticheta spring. Afișați toate postările
Se afișează postările cu eticheta spring. Afișați toate postările

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