domingo, 10 de enero de 2021

Spring inicial, APUNTES, MASTER CLASS, CRACKING SPRING LAST VERSION Part1

 Spring inicial, APUNTES, MASTER CLASS, CRACKING SPRING LAST VERSION Part1

Implement sorting logic in


CREO MI CLASE MAIN



DEFINO BINARYSERCHIMPL

QUE ME VA A REGRESAR E RESULTADO DE LA BUSQUEDA BINARIA, RECIBE DOS PARAMETROS UN ARRAY Y UN NUMERO INT




USO ESA NUEVA CLASE EN LA CLASE PRINCIPAL , CLASE MAIN


LE PASO UN ARRAY Y EL NUMERO DE BUSQUEDA


ACA LO EJECUTAMOS, 

VEMOS QUE TENEMOS LA CLASE MAIN, 

Y LLAMAMOS AL INT RESULT DEL REGRESO DE LA FUNCION 


Y LE PASO LOS PARAMETROS DUMMYS EN ESTE CASO DEL ARRAY Y EL NUMERO, QUE ES LO QUE ESPERA EL METODO, QUE VAMOS A INSTANCIAS



EL RESULTADO DESPUES DE LA EJECUCION ES 3 COMO SE VE EN LA CONSOLA.



THIS  LOGICAL BINARY SEARCH IS TIGHTLY COUPLE THE BUBLESORT ALGORITHM, , 

IS THAT IF I WANT TO CHANGE THE ALGORITHM THEN I NEED TO CHANGE THE CODE OF THE BINARY SEARCH, THATS NOT REALLY GOOD, 


FOR EXAMPLE IF WANT TO CHANGE TO QUICK SORT, THEN I NEED TO CHANGE THE PIECE OF CODE TO IMPLEMENT THE QUICKSORT, IN BINARY SEARCH


THIS IS NOT REALLY GOOD, I WANT TO SWITCH TO QUICKSORT,  SOMETIMES i NEED TO WORK ONE OF THESE, HOW CAN I DO IT LOOSED COUPLED.



 THE FIRST THING IS TO PUT BUBBLE SORT ALGORITHM OUTSIDE THE SEARCH, 


I START CREATING A NEW CLASS, I CALL THIS CLASS BUBBLE SORT ALGORITHM, IT TAKES AN ARRAY OF NUMBERS AND RETURN AN ARRAY OF NUMBERS SORTED,


SORTED/- ARREGLAR, ORDENAR, 

SEARCH, BUSCAR, COMO SE RECORDARA MUCHOS DE LOS ALGORITMOS DE BUSQUEDA COMO ( CHECAR QUICKSORT, BUBBLE )SOR, REQUIEREN QUE SE ORDENEN PRIMERO LOS NUMEROS

VAMOS A ASUMIR  QUE EL ORDEN ESTA IMPLEMENTADO ACA




AHORA VAMOS A USAR BUBBLESORT ALGORITHM EN BINARYSEARCHIMPL

CREO UNA INSTANCIA, 


BubbleSortAlgorithm bubbleSortAlgorithm = new BubbleSortAlgorith();

int[] sortedNumbers = bubbleSortAlgorithm.sort(numbers);


recuerda que numbers ya venia en el llamado a la variable de metodo.


Esto es bueno ya que cualquier modificacion a bubblesort algorithm will be affected in only the class bubblesort.


ahora puedo usar bubblesort, algorithm, pero nuevamente debo de cambiar la clase de implementacion




Moved out outside the ambit of binary search, only change the logic in the class.


PERO, TODAVIA NO HE RESUELTO EL PROBLEMA DE CAMBIAR EL ALGORITMO, POR EJEMPLO CAMBIARLO A QUICK SORT ALGORITHM, 


ENTONCES CREAMOS OTRA CLASE LLAMADA QUICKSORT ALGORITM


LO QUE QUIERO ES CAMBIAR DE QUICKSORT A BUBLLE SERACH DINAMICAMENTE, INTERCAMBIARLOS DINAMICAMENTE

QUIERO PASARLE EL VALOR DEL SORT ALQORITMO QUE VOY A USAR DE MANERA DINAMICA, 

COMO LO VOY A HACER, CREANDO UNA INTERFAZ, LLAMADA SORTALGORITM.


es un problema similar al patron de diseno strategyc pattern design.





making the BinarySearch Impl to use the interface instead of implementation.


PRIMERO PARA USARLO EN BINARY SEARCH, USAMOS EL CONSTRUCTOR


uso QuickSortAlgorithm como instancia





Ahora le paso el BubbleSortAlghoritm



LO QUE ESTAMOS HACIENDO ASI ES HACER BINARYSEARCHIMPL, INDEPENDIENTE DEL ALGORTMO SORT QUE SERA USADO, 


SORT ALGORITH IS A DEPENDENCY OF THE BINARYSEARCH

BINARYSEARCH DEPENDS OF SORTALGORITHM

WE ARE MAKING A SORT ALGORITHM AS A SEPARATED DEPENDENCY, PASSING IT TO THE BINARYSEARCHIMPL

HAY UNA MANERA DE EVITAR ESTA DEPENDENCIA,  Y ESTO ES LO QUE VAMOS A REVISAR CON SPRING




DEPENDENCY INJECTION AND LOOSE COPLING SON LOS PRINCIPALES CONCEPTOS DE SPRING.


AHORA ESTAMOS LISTOS A PASAR A SPRING

 

RECUERDA QUE LA INSTANCIA SE PASA COMO ARGUMENTO EN EL CONSTRUCTOR, 




HEMOS ESTADO CREANDO OBJETOS, CON LAS INSTANCIAS DE LOS ARTOGIRTOMS DE ORDENAMIENTO, 
TAMBIEN CREAMOS UN OBJETO DE BINARYSEARCH, Y LOS ESTAMOS AMARRANDO JUNTOS (WIRING THEM TOGHETER)

Y DESPUES HEMOS INVOCADO BINARYSEARCH, LO HICIMOS AL PASAR COMO ARGUMENTOS DEL CONSTRUCTOR, 


SI UN FRAMEWORK NOS AYUDA A TOMAR CONTROL DE LA CREACION DE LOS BEANS Y LAS DEPENDECNIAS SERIA MEJOR

PIENSA EN UNA APLICACION QUE TENGA
1000 BEANS 3000 DEPENDENCIAS, QUEREMOS UN FRAMEWORK QUE MANEJE LOS BEANS Y LAS DEPENDENCIAS, LOS BEANS SON LAS INTANCIAS DE LOS OBJETOS

POR EJEMPLO 


 ESTOY CREANDO UN NUEVO QUICKSORTALGORITMO (BEAN),  Y VAMOS A QUERER ATARLO A LA DEPENDENCIA, (WIRED INTO THE DEPENDENCY), 

 BinarySearchImpl binarySearch =
new BinarySearchImpl(new BubbleSortAlgorithm());

QUIERO CREAR EL ALGORITMO BUBBLESORT Y ATARLO A LA DEPENDENCIA, (WIRED IN THE EDEPENDENCY).

WIRING, CREATE BEANS, MANAGE AND POPULATE THE DEPENDENCY, 

SPRING FRAMEWORK WHAT DOES IT CAN DO:

MANAGE BEAN, WIRED IN THE DEPENDENCY, AND DO A LOT OF MAGIC,
SPRING FRAMEWORK IT'S ALREADY IN OUR MAVEN DEPENDENCIES

BEAN ITS AN INSTANCE OF AN OBJECT, WIRED INTO THE DEPENDENCY

SPRING CORE IT'S ALREADY HERE



SPRING BEANS IS ALREADY HERE


WE ARE GETTING THESE DEPENDENCIES THROUGH SOMETING CALLED, SPRINGBOOT STARTER.


LO QUE NECESITAMOS PARA HACER EL MEJOR USO DE SPRING ES CONTESTAR A LAS SIGUIENTES PREGUNTAS:

1.-WHAT ARE THE BEANS?

CUALES SON LOS BEANS QUE SPRING VA A TENER QUE MANEJAR , USAR E INJECTAR.


2.- WHAT ARE THE DEPENDECNIAS OF A BEAN?

CUALES SON LAS DEPENDENCIAS DEL BEAN,  POR EJEMPLO BINARYSEARCH SU DEPENDENCIA ES SORT ALOGORITHM.





sortAlgorithm es una dependecnia de BinarySearchImpl


3.- WHERE TO SEARCH FOR BEANS?

DEBO DE BUSCAR EN QUE PACKETE , DONDE BUSCAR POR LOS BEANS


BinarySearchImpl is a bean, como le digo a spring que es un bean

por la anotacion @Component




y le agregamos el import

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component


**************************

tambien 



import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;

@Component
@Primary
public class BubbleSortAlgorithm implements SortAlgorithm {
public int[] sort(int[] numbers) {
// Logic for Bubble Sort
return numbers;
}
}


************************

Ahora que ya tengo estos dos beans, 

cuales SON LAS DEPENDENCIAS DE ESTOS BEANS:

COMO LE DIGO A SPRING QUE BINARYSEACRHCIMPL TIENE UNA DEPENDENCIA,

ES CON 

@Autowired

entonces digo que BinarySearchImpl, depende de SortAlgorithm








SortAlghorithm es una dependencia de BinarySearchImpl


SortAlgorithm ahorita no tiene dependencias por lo que no tiene autowired


AHORA VAMOS CON EL PASO 3 DONDE VAMOS A BUSCAR POR BEANS


solamente tenemos beans en el packete principal 
por lo que usaremos la anotacion:

@SpringBootpplication

con esta anotacion pringBoot va a buscar automaticamente dentro del packete y subpaquetes donde se ecuentra esta aotacion


entonces por lo tanto no necesitamos generar nosotros las instancias, SpringBot lo va a hacer por nosotros por lo tanto no las necesitamos

las comentamos



todos los beans seran manejados en por el applicationContext es donde mantendremo todos los beans

necesitamos obtener el bean de Application Context




entonces de aqui le indico cual es el bean que quiero que use


SI RECORDAMOS DE LAS CLASES ANTERIORES, YA QUE LLEVO USANDO SPRING HACE MUCHO TIEMPO, LOS BEANS LOS DEFINIAMOS EN EL APPLICATION CONTEXT QUE ERA DEFINIDO EN UN ARCHIVO XML, LO  CUAL AHORA CON LAS ANOTACIONES NO ES NECESARIO.

DE TODAS MANERAS ES IMPORTANTE CONOCERLO, AUN SE USA AUNQUE EN MENOR MEDIDA (VAMOS A ESTUDIAR ESOS CASOS)




WE GET SPRINGBOTT APLICATION CONTEXT, BY RUNNING IT SPRING BOOT APPLICATION CLASS

FROM THE APPLICATION CONTEXT, IM GETTING THE BINARY SEARCH BEAN

// Application Context
ApplicationContext applicationContext = 
SpringApplication.run(SpringIn5StepsApplication.class, args);
BinarySearchImpl binarySearch = 
applicationContext.getBean(BinarySearchImpl.class);
int result = 
binarySearch.binarySearch(new int[] { 12, 4, 6 }, 3);


AHORA COMO PARTE INICIAL TENEMOS EL SIGUIENTE CODIGO







AHORA LO EJECUTO





2021-01-10 17:15:12.680 DEBUG 45944 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Could not find key 'spring.liveBeansView.mbeanDomain' in any property source
2021-01-10 17:15:12.683  INFO 45944 --- [           main] c.i.s.b.s.SpringIn5StepsApplication      : Started SpringIn5StepsApplication in 1.823 seconds (JVM running for 2.579)
2021-01-10 17:15:12.686 DEBUG 45944 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'binarySearchImpl'
com.in28minutes.spring.basics.springin5steps.BubbleSortAlgorithm@616ac46a
3
2021-01-10 17:15:12.688  INFO 45944 --- [       Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@105fece7: startup date [Sun Jan 10 17:15:11 CST 2021]; root of context hierarchy
2021-01-10 17:15:12.689 DEBUG 45944 --- [       Thread-2] o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'lifecycleProcessor'
2021-01-10 17:15:12.690 DEBUG 45944 --- [       Thread-2] o.s.b.f.s.DefaultListableBeanFactory     : Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@4fb61f4a: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,springIn5StepsApplication,org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory,binarySearchImpl,bubbleSortAlgorithm,org.springframework.boot.autoconfigure.AutoConfigurationPackages,org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,org.springframework.boot.autoconfigure.condition.BeanTypeRegistry,propertySourcesPlaceholderConfigurer,org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,mbeanExporter,objectNamingStrategy,mbeanServer,org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor,org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata,org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties,org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,spring.security-org.springframework.boot.autoconfigure.security.SecurityProperties,org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,server-org.springframework.boot.autoconfigure.web.ServerProperties]; root of factory hierarchy
2021-01-10 17:15:12.690 DEBUG 45944 --- [       Thread-2] o.s.b.f.support.DisposableBeanAdapter    : Invoking destroy() on bean with name 'mbeanExporter'
2021-01-10 17:15:12.690  INFO 45944 --- [       Thread-2] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
2021-01-10 17:15:12.691 DEBUG 45944 --- [       Thread-2] o.s.b.f.s.DefaultListableBeanFactory     : Retrieved dependent beans for bean 'org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory': [org.springframework.context.annotation.internalConfigurationAnnotationProcessor]



LO CUAL ES CORRECTO YA QUE INYECTE LA DEPENDENCIA DE BUBBLESORT YA QUE QUICK SORT NO LE HE PUESTO LA ANOTACION COMPONENTE POR LO TANTO EL APPLICATION CONTEXT NO LO CARGA.

entonces en lugar de nosotros crear los beans de sort y de search clases, dejamos que SPRING HAGA TODA LA MAGIA!


spring maneja las dependencias, inyecta las depeendencias y maneja el ciclo de vida de los beans y la palicacion

SPRING DOES DEPENDENCY MANAGMENT, 

QUE PASA EN LA PARTE TRASERA DE SPRING, VAMOS A USAR EL MODO DEBUG, LA MANERA MAS SENCILLA DE ENTRAR A DEBUG MODE ES 

EN APPLICATION.PROPERTIES 

LO SETEAMOS

logging.level.org.springframework = debug



Y VEMOS QUE OBTENEMOS MAS LOGS DE LO USUAL, 

BUSCAMOS BINARYSEARCHiMPL

LO PRIMERO QUE HACE ES HACER UNA BUSQUEDA DEL COMPONENT SCAN

 main] o.s.c.a.ClassPathBeanDefinitionScanner   : Identified candidate component class: file [C:\Users\rober\Desktop\spring-web-services-master\spring-in-10-steps\target\classes\com\in28minutes\spring\basics\springin5steps\BinarySearchImpl.class]
2021-01-10 17:15:11.639 DEBUG 45944 --- [           main] o.s.c.a.ClassPathBeanDefinitionScanner   : Identified candidate component class: file [C:\Users\rober\Desktop\spring-web-services-master\spring-in-10-steps\target\classes\com\in28minutes\spring\basics\springin5steps\BubbleSortAlgorithm.class]
2021-01-10 17:15:11.653 DEBUG 45944 --- [           

IDENTIFICA LOS DOS QUE DEFINIMOS LOS COMPONENTES




DESPUES ENCONTRAMOS

2021-01-10 17:15:12.076 DEBUG 45944 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Creating shared instance of singleton bean 'binarySearchImpl'
2021-01-10 17:15:12.076 DEBUG 45944 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Creating instance of bean 'binarySearchImpl'

CREATEINSTANCE OF BEAN

ES CUANDO VA A GENERAR LAS INTANCIAS DE LOS BEANES


 : Registered injected element on class [com.in28minutes.spring.basics.springin5steps.BinarySearchImpl]: AutowiredFieldElement for private com.in28minutes.spring.basics.springin5steps.SortAlgorithm com.in28minutes.spring.basics.springin5steps.BinarySearchImpl.sortAlgorithm
2021-01-10 17:15:12.081 DEBUG 45944 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Eagerly caching bean 'binarySearchImpl' to allow for resolving potential circular references
2021-01-10 17:15:12.082 DEBUG 45944 --- [           main] o.s.b.f.annotation.InjectionMetadata     : Processing injected element of bean 'binarySearchImpl': AutowiredFieldElement for private com.in28minutes.spring.basics.springin5steps.SortAlgorithm com.in28minutes.spring.basics.springin5steps.BinarySearchImpl.sortAlgorithm
2021-01-10 17:15:12.085 DEBUG 45944 --- [           main] o.s.core.annotation.AnnotationUtils      : Failed to meta-introspect annotation [interface org.springframework.beans.factory.annotation.Autowired]: java.lang.NullPointerException
2021-01-10 17:15:12.087 DEBUG 45944 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Creating shared instance of singleton bean 'bubbleSortAlgorithm'
2021-01-10 17:15:12.087 DEBUG 45944 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Creating instance of bean 'bubbleSortAlgorithm'
2021-01-10 17:15:12.088 DEBUG 45944 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Eagerly caching bean 'bubbleSortAlgorithm' to allow for resolving potential circular references
2021-01-10 17:15:12.089 DEBUG 45944 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Finished creating instance of bean 'bubbleSortAlgorithm'


+++++++++++++

REGISTRA LOS ELEMENTOS PRA INYECTARLOS

 : Registered injected element on class [com.in28minutes.spring.basics.springin5steps.BinarySearchImpl]: AutowiredFieldElement for private com.in28minutes.spring.basics.springin5steps.SortAlgorithm com.in28minutes.spring.basics.springin5steps.BinarySearchImpl.sortAlgorithm
 : Eagerly caching bean 'binarySearchImpl' to allow for resolving potential circular references
] o.s.b.f.annotation.InjectionMetadata     : Processing injected element of bean 'binarySearchImpl': AutowiredFieldElement for private com.in28minutes.spring.basics.springin5steps.SortAlgorithm com.in28minutes.spring.basics.springin5steps.BinarySearchImpl.sortAlgorithm
 o.s.core.annotation.AnnotationUtils      : Failed to meta-introspect annotation [interface org.springframework.beans.factory.annotation.Autowired]: java.lang.NullPointerException
 o.s.b.f.s.DefaultListableBeanFactory     : Creating shared instance of singleton bean 'bubbleSortAlgorithm'
 o.s.b.f.s.DefaultListableBeanFactory     : Creating instance of bean 'bubbleSortAlgorithm'
 o.s.b.f.s.DefaultListableBeanFactory     : Eagerly caching bean 'bubbleSortAlgorithm' to allow for resolving potential circular references
 o.s.b.f.s.DefaultListableBeanFactory     : Finished creating instance of bean 'bubbleSortAlgorithm'


++++++++++++++\\

Creating instance of bean 'binarySearchImpl'
2021-01-10 17:15:12.080 DEBUG 45944 --- [           main] o.s.b.f.annotation.InjectionMetadata     : Registered injected element on class [com.in28minutes.spring.basics.springin5steps.BinarySearchImpl]: AutowiredFieldElement for private com.in28minutes.spring.basics.springin5steps.SortAlgorithm com.in28minutes.spring.basics.springin5steps.BinarySearchImpl.sortAlgorithm

++++++++++

Registered injected element on class [com.in28minutes.spring.basics.springin5steps.BinarySearchImpl]: AutowiredFieldElement for private com.in28minutes.spring.basics.springin5steps.SortAlgorithm com.in28minutes.spring.basics.springin5steps.BinarySearchImpl.sortAlgorithm
2021-01-10 17:15:12.081 DEBUG 45944 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Eagerly caching bean 'binarySearchImpl' to allow for resolving potential circular references
2021-01-10 17:15:12.082 DEBUG 45944 --- [           main] o.s.b.f.annotation.InjectionMetadata     : Processing injected element of bean 'binarySearchImpl': AutowiredFieldElement for private com.in28minutes.spring.basics.springin5steps.SortAlgorithm com.in28minutes.spring.basics.springin5steps.BinarySearchImpl.sortAlgorithm
2021-01-10 17:15:12.085 DEBUG 45944 --- [           main] o.s.core.annotation.AnnotationUtils      : 



++++++++

[           main] o.s.b.f.s.DefaultListableBeanFactory     : Finished creating instance of bean 'bubbleSortAlgorithm'
2021-01-10 17:15:12.089 DEBUG 45944 --- [           main] f.a.AutowiredAnnotationBeanPostProcessor : Autowiring by type from bean name 'binarySearchImpl' to bean named 'bubbleSortAlgorithm'

++++++++++++


ENTONCES LOS PASOS IMPORTANTES QUE SE VEN EN EL LOG SON:

Searching directory [/in28Minutes/git/getting-started-in-5-steps/spring-in-5-steps/target/classes/com/in28minutes/spring/basics/springin5steps] for files matching pattern [/in28Minutes/git/getting-started-in-5-steps/spring-in-5-steps/target/classes/com/in28minutes/spring/basics/springin5steps/**/*.class]
Identified candidate component class: file [/in28Minutes/git/getting-started-in-5-steps/spring-in-5-steps/target/classes/com/in28minutes/spring/basics/springin5steps/BinarySearchImpl.class]
Identified candidate component class: file [/in28Minutes/git/getting-started-in-5-steps/spring-in-5-steps/target/classes/com/in28minutes/spring/basics/springin5steps/BubbleSortAlgorithm.class]

Creating instance of bean 'binarySearchImpl'
Creating instance of bean 'bubbleSortAlgorithm'
Finished creating instance of bean 'bubbleSortAlgorithm'

Constuctor - Autowiring by type from bean name 'binarySearchImpl' via constructor 
to bean named 'bubbleSortAlgorithm'
Setter -  Autowiring by type from bean name 'binarySearchImpl' to bean named 'bubbleSortAlgorithm'
No Setter or Constructor - Autowiring by type from bean name 'binarySearchImpl' to bean named 'bubbleSortAlgorithm'


Finished creating instance of bean 'binarySearchImpl'


+++++++++

AQUI SE HACE LA INYECCION POR CONSTRUCTOR, OJO, SIN TENER QUE DEFINIR EXPLICITAMENTE EL CONSTRUCTOR ANTERIORMENTE



AHORA COMO PRACTICA GENERAMOS EL OTRO BEAN, EL DE QUICKSORT AHORA



DEFINIMOS EL BEAN COMO COMPONENTE,


Y TENEMOS EL ERROR , DE FAIL TO START


PORQUE APARECE ESTE ERROR, 

DEBIDO A QUE DEFINIMOS DOS BEANS 

NOS DICE LA CAUSA

:
***************************
APPLICATION FAILED TO START
***************************

Description:

Field sortAlgorithm in com.in28minutes.spring.basics.springin5steps.BinarySearchImpl required a single bean, but 2 were found:
- bubbleSortAlgorithm: defined in file [C:\Users\rober\Desktop\spring-web-services-master\spring-in-10-steps\target\classes\com\in28minutes\spring\basics\springin5steps\BubbleSortAlgorithm.class]
- quickSortAlgorithm: defined in file [C:\Users\rober\Desktop\spring-web-services-master\spring-in-10-steps\target\classes\com\in28minutes\spring\basics\springin5steps\QuickSortAlgorithm.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed


+++++++++++


USAMOS @PRIMARY, si tenemos dos componentes en classpath del mismo tipo, debemos de usar @primary



***********

como practica anadimos el constructor

public BinarySearchImpl(SortAlgorithm sortAlgorithm) {
super();
this.sortAlgorithm = sortAlgorithm;
}





LA SALIDA ES CORRECTA INDEPENDIENTEMENTE DE SI DEFINIMOS O NO EL CONSTRUCTOR

2021-01-10 18:10:41.582 DEBUG 15352 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Returning cached instance of singleton bean 'binarySearchImpl'
com.in28minutes.spring.basics.springin5steps.BubbleSortAlgorithm@5c669da8
3



******************

SETTER INJECTION

REMOVEMOS EL CONSTRUCTOR AHORA Y USAMOS SETTER INJECTION

SOLO GENERAMOS EL SETTER

public void setSortAlgorithm(SortAlgorithm sortAlgorithm) {
this.sortAlgorithm = sortAlgorithm;
}



APARECE EN EL LOG

: Finished creating instance of bean 'bubbleSortAlgorithm'
2021-01-10 18:13:33.297 DEBUG 41008 --- [           main] f.a.AutowiredAnnotationBeanPostProcessor : Autowiring by type from bean name 'binarySearchImpl' to bean named 'bubbleSortAlgorithm'
2021-01-10 18:13:33.297 DEBUG 41008 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Finished creating instance of bean 'binarySearchImpl'
2021-01-10 18:13:33.297 DEBUG 41008 --- [           main] o.s.b.f.s.DefaultListableBeanFactory    


++++++++++++++




ojo

POR DEFAUL ES SETTER INJECTOR NO CONSTRUCTOR INYECTION


TENEMOS DOS OPCIONES CONSTRUCTOR INYECTION Y SETTER INYECTION


ALL MANDATORY DEPENDENCIES SHOULD BE AUTOWIRED USING CONSTRUCTYOR

FOR EXAMPLE SORT ALGORITHM IS MANDATORY PORQUE SI LA REMOVEMOS, NO SE PUEDE EJECUTAR INICIAR LA APLICACION, 
CONSTRUCTOR INYECTION I


SI UNA DEPENDENCIA SON ES MANDATORIA, ES DECIR SI NO  ESTA DISPONIBLE Y LA CLASE AUN PUEDE EJECUTARSE ENTONCES ESTAS  DEPENDENCIAS SON OPCIONALES,  PODEMOS USAR SETTER INJECTION


++++++++++++++++++++++++


DEPENDE TAMBIEN DEL NUMERO DE DEPENDENCIAS QUE VAMOS A USAR, YA QUE SI MANEJAMOS 10 DEPENDENCIAS ENTONCES VA A SER COMPLICADO MANEJAR LAS DEPENDENCIAS EN EL CONSTRUCTOR.


MODULARIDAD DE SPRING FRAMEWORK

vemos los modulos no es un jar grand si no que tiene varios jars modulos



SPRING ESTA CONSTRUIDO DE MANERA MODULAR, POR LO QUE ES FLEXIBLE Y PODEMOS OCUPAR UNICAMENTE LO QUE VAMOS A NECESITAR AGREGADO LAS DEPEDENCIAS EN EL POM



SPRING BEANS, CONTEXT, 

CORE CONTAINER

HEMOS USADO EL CORE CONTAINER MODULE

TIENE INTEGRACION CON LA CAPA DE DATOS, DATABASE, 

QUEREMOS CONECTARNOS CON WEBSERVICES, INTEGRACION 

UNO DE LOS IMPORTANTES ES JDBC NOS HACE LAS COSAS FACILES TAMBIEN

BUENA INTEGRACION CON OBJECT RELATIONAL MAPING ORM, HIBERNATE O MYBATIS,  GOOD INTEGRATION CON JMS

PODEMOS HABLAR CON OTRAS APLICACIONES MEDIANTE QUEUE TAMBIEN SE PUEDE OBTENER Y PNER MENSAJES SOBRE QUEUE

TRANSACTION MANAGMET, ALL THE STEPS IN A TRANSACTION SUCCESSFULL,  O PODEMOS HACER ROLLBACK, BUEN SOPORTE PRA ESTO.

WEB SPACE BUENA CONECCION CON STRUTS, SPRING MVC, PORTLETS ARE OUTDATED,  WEBSOCKETS, 


CROSSCUTING, MULTIPLES CAPAS,  HAY COMPONENTES QUE SE COMUNICAN ENTRE DIFERENTES CAPAS ESTAS SON LAS CROSS COTING LAYERS






UNIT TESTING  ES UNO DE ESOS CONCEPTOS

NIT TEST IN WEB LAYER, BUSINESS, AND DATA

TEST UNIT TESTING UNIT TEST FRAMEWORK

SPRING SECURITY, AOP, ASPECT ORIENTED PROGRAMMING

AOP




SPRING PROJECTS


SPRING BOOT / USADO PARA MICROSERVICES, HACE FACIL LA CREACION DE LAS APLICACIONES

SPRING CLOUD, NATIVE APPLICATIONS, DINAMICAMETE CONECTADAS, DEPLOYABLES, ECT.

SPRING DATA PROVEE CONSISTENCE DATA ACCESS, PROPER SQL DATABASE, OR ON SQL DATABASES,  CONSISTENCY

PRING INTEGRATION, ADDRESSE PROBLEMS WITH APPLICATION INTEGRATION PATTERNS,  PATTERNS RECOENDED, HELP US CONNECT ENTERPRISE APPLICATIONS

BATCH APPLICATION, EJEMPLO CREADO,

USAR BATCH LA APLICACION QUE CREE EN OTRO CAPITULO

SPRING SECURITY MUY IMPORTANTE
SECURING YOUR APPLICATION, MULTIPLE SECURITYS OPTIONS, BASIC AUTHETICATION

SPRING HATEOAS
RELATED LINKS TO HELP YOUR CONSUMER WHAT IS FORWARD, ETC, IR AS A DETALLE ACA




SPRING SE MANTIENE A LA MODA, DESDE HACE 15 ANIOS, 

ENABLES TESTABLE CODE, DEPENDENCY INJECTIONPODEMOS USAR UNIT TEST MUY FACILMENTE, JUNIT Y MOKITO 
/ NO HAY PLUMBING CODE, POR EJEMPLO USANDO LOMBOK




FLEXIBLE ARQUITECHTURE, MODULARITY, SPRING MODULES Y SPRING PROJECTS ESPECIFICOS PARA LO QUE NECESITES, MVC FRAMEWORKS SUPPORT FOR STRUTS POR EJEMPLO

NOS PERMITE ESTAR EN LA MODA EN LAS TENDENCIAS, POR EJEMPLO SPRING BOOT , SPRING MICROSRVICES, 



No hay comentarios:

Publicar un comentario

zen consultora

Blogger Widgets

Entrada destacada

Platzy y el payaso Freddy Vega, PLATZI APESTA, PLATZI NO SIRVE, PLATZI ES UNA ESTAFA

  Platzy y los payasos fredy vega y cvander parte 1,  PLATZI ES UNA ESTAFA Hola amigos, este post va a ir creciendo conforme vaya escribiend...