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