spring capitulo 03
DESCRIPTION
TRANSCRIPT
![Page 1: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/1.jpg)
![Page 2: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/2.jpg)
![Page 3: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/3.jpg)
Conhecer os resource loaders do Spring
Saber utilizar o init-methodSaber utilizar a herança de
definições de beansSaber fazer classes de validaçõesConhecer o BeanWrapperConhecer os PostProcessors
![Page 4: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/4.jpg)
Conhecer os principais properties editors
Conhecer os eventos do container
Saber utilizar o PropertyPlaceHolderConfigurer
Saber utilizar o SingletonBeanFactoryLocator
Conhecer os recursos de i18n
![Page 5: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/5.jpg)
ResourcePatternResolver(ant style) file: classpath: wild-cards /* ServletContextResourceLoader Extensível, criar seu próprio
![Page 6: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/6.jpg)
init-method• Executa método ao iniciar• init-method=“voidMethod”• Método público e void
Callbacks do Spring:• InitializingBean
• afterPropertiesSet
• DisposableBean• destroy
![Page 7: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/7.jpg)
Dois colaboradores ou maisPropriedades abstract e parentEstrutura de HerançaReaproveitamento de injeções
![Page 8: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/8.jpg)
package com.targettrust.spring.extend;public abstract class PessoaService {
private String nome;private String telefone;private String email;
public PessoaService() {}public String getNome() {
return nome;}public void setNome(String nome) {
this.nome = nome;}public String getTelefone() {
return telefone;}public void setTelefone(String telefone) {
this.telefone = telefone;}public String getEmail() {
return email;}public void setEmail(String email) {
this.email = email;}
}
![Page 9: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/9.jpg)
package com.targettrust.spring.extend;public class PessoaFisicaService extends PessoaService {
private String cpf;
public PessoaFisicaService() {}public boolean validaCpf(){
return CpfUtils.validaCPF(cpf);}
public void mostraPessoa(){ if (validaCpf()){ System.out.println("nome: " + getNome() + " telefone: " + getTelefone() +
" email: " + getEmail() + " cpf: " + cpf);
}else{ System.out.println("Essa pessoa não tem um CPF Valido."); }}
public String getCpf() {return cpf;
}public void setCpf(String cpf) {
this.cpf = cpf;}
}
![Page 10: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/10.jpg)
package com.targettrust.spring.extend;public class PessoaFisicaService extends PessoaService {
private String cpf;
public PessoaFisicaService() {}public boolean validaCpf(){
return CpfUtils.validaCPF(cpf);}
public void mostraPessoa(){ if (validaCpf()){ System.out.println("nome: " + getNome() + " telefone: " + getTelefone() +
" email: " + getEmail() + " cpf: " + cpf);
}else{ System.out.println("Essa pessoa não tem um CPF Valido."); }}
public String getCpf() {return cpf;
}public void setCpf(String cpf) {
this.cpf = cpf;}
}
![Page 11: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/11.jpg)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="pessoaService" class="com.targettrust.spring.extend.PessoaService" abstract="true" > <property name="nome" value="Diego" /> <property name="email" value="[email protected]" /> <property name="telefone" value="455-55-55" /> </bean> <bean abstract="false" id="pessoaFisicaService" class="com.targettrust.spring.extend.PessoaFisicaService" parent="pessoaService" > <property name="cpf" value="47888971210" /> </bean>
</beans>
![Page 12: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/12.jpg)
• Interface Validor• boolean supports (Class clazz);•void validate (Object target, Errors errors);
• VadationUtils•rejectIfEmpty•rejectValue•Retorno de erro via objeto (Spring MVC, tags de tela)
![Page 13: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/13.jpg)
package com.targettrust.spring.validate;import org.springframework.validation.Errors;import org.springframework.validation.ValidationUtils;import org.springframework.validation.Validator;public class Pessoa implements Validator{
private String nome;private Integer idade;
public boolean supports(Class clazz) {return Pessoa.class.equals(clazz);
}public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmpty(errors, "nome", "nome.vazio"); Pessoa p = (Pessoa) target;
if (p.getIdade() < 0) { errors.rejectValue("idade", "valor negativo"); } else if (p.getIdade() > 120) { errors.rejectValue("idade", "velho de mais"); }}public String getNome() {
return nome;}public void setNome(String nome) {
this.nome = nome;}public Integer getIdade() {
return idade;}public void setIdade(Integer idade) {
this.idade = idade;}
}
![Page 14: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/14.jpg)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" default-lazy-init="true">
<bean id="pessoa" class="com.targettrust.spring.validate.Pessoa" > <property name="nome" value="Fulano" /> <property name="idade" value="-1" /> </bean>
</beans>
![Page 15: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/15.jpg)
package com.targettrust.spring.validate;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.validation.BeanPropertyBindingResult;import org.springframework.validation.Errors;public class Teste { public static void main(String[] args) { BeanFactory bf = new ClassPathXmlApplicationContext("/com/targettrust/spring/validate/Spring-beans.xml");
Pessoa p = (Pessoa) bf.getBean("pessoa");System.out.println("Nome: " + p.getNome() + " idade: " + p.getIdade());
Errors e = new BeanPropertyBindingResult(p,"Pessoa");p.validate(p, e);
for(Object es: e.getAllErrors()){ System.out.println(es);}
}}
Chamada manual !!!
![Page 16: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/16.jpg)
• Wrapper de JavaBeans• Pattern GoF Decorator• Acesso a propriedade de objetos:
• Getters• Setters• Pode escrever?• Pode Ler?
![Page 17: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/17.jpg)
• Acesso a sub-propriedades de profundidade ilimitada
• Manipulação com propriedades de maneira elegante
• Implementação padrão: BeanWrapperImpl
• PropertyDescriptor
![Page 18: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/18.jpg)
![Page 19: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/19.jpg)
• Customização de beans através de Callbacks
• Forma de extenção do Spring para:• Lógica de instanciação• Lógica de resolução de
dependências• Operações em geral após a
etapa de registro de beans do Spring
![Page 20: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/20.jpg)
• Múltiplos BeanPostProcessors• Efetuar a ordem de execução
através da propriedade order, implementar a interface Ordered
• Atuação: Após a criação do bean• Executado antes de init-methods
![Page 21: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/21.jpg)
• ApplicationContext: Registro automático
• BeanFactory: Registro manual
• São trados de maneira especial: “Toca inicializa”
ConfigurableBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
MeuBeanPostProcessor postProcessor = new MeuBeanPostProcessor();factory.addBeanPostProcessor(postProcessor);
![Page 22: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/22.jpg)
• Cuidado com AOP Auto-proxy: Bean não elegíveis, Spring emitirá um alerta
• Veja um exemplo de BeanPostProcessor:package com.targettrust.spring.beanpostprocessors;public class ObjetoA {}
package com.targettrust.spring.beanpostprocessors;public class ObjetoB {}
package com.targettrust.spring.beanpostprocessors;public class ObjetoC {}
![Page 23: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/23.jpg)
package com.targettrust.spring.beanpostprocessors;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;
public class LogCreationBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {return bean;
}
@Override public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {System.out.println("Craindo bean: " + beanName);return bean;
}}
![Page 24: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/24.jpg)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" default-lazy-init="false"> <bean id="a" class="com.targettrust.spring.beanpostprocessors.ObjetoA" /> <bean id="b" class="com.targettrust.spring.beanpostprocessors.ObjetoB" /> <bean id="c" class="com.targettrust.spring.beanpostprocessors.ObjetoC" /> <bean class="com.targettrust.spring.beanpostprocessors.LogCreationBeanPostProcessor” />
</beans>
![Page 25: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/25.jpg)
package com.targettrust.spring.beanpostprocessors;import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Teste { public static void main(String[] args) { new ClassPathXmlApplicationContext("/com/targettrust/spring/" + "beanpostprocessors/Spring-beans.xml");
}}
![Page 26: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/26.jpg)
• Recebe o Objeto, então podemos:• Aplicar algum proxy• Aplicar algum validador• Poder: Annotations + interface
+ BeanPostProcessor
![Page 27: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/27.jpg)
• Similar ao BeanPostProcessor• Pode ler metadados do Spring• Possibilidade de modificação de
dados(informações injetadas)• Spring utiliza no core:
• PropertyResourceConfigurer• PropertyPlaceHolderConfigurer
![Page 28: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/28.jpg)
package com.targettrust.spring.beanfactorypostprocessors;import java.text.SimpleDateFormat;import java.util.Date;public class DataService {
private String pattern;public String getPattern() {
return pattern;}public void setPattern(String pattern) {
this.pattern = pattern;}
public String showSysDate(){SimpleDateFormat sdf = new SimpleDateFormat(pattern);return sdf.format(new Date());
}}
![Page 29: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/29.jpg)
package com.targettrust.spring.beanfactorypostprocessors;import java.io.FileInputStream;import java.util.Map;import java.util.Properties;import java.util.Map.Entry;import org.springframework.beans.BeansException;import org.springframework.beans.FatalBeanException;import org.springframework.beans.factory.config.BeanFactoryPostProcessor;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;public class DatePatternRouterBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Properties p = new Properties(); try { p.load(new FileInputStream("./src/com/targettrust/spring/” +
beanfactorypostprocessors/patterns.properties")); System.out.println("Patterns: " + p); } catch (Exception e) {
throw new FatalBeanException("Erro ao buscar patterns!",e); }
Map<Object,Object> beans = beanFactory.getBeansOfType(DataService.class); for(Entry<Object, Object> e: beans.entrySet()){ System.out.println("Aplicando pattern em service: " + e); DataService service = ((DataService)e.getValue()); service.setPattern(p.getProperty("pattern." + service.getPattern().replace("#", ""))); } }}
![Page 30: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/30.jpg)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" default-lazy-init="false"> <bean id="brasilDateService" class="com.targettrust.spring.beanfactorypostprocessors.DataService" > <property name="pattern" value="#brasil" /> </bean> <bean id="usDateService" class="com.targettrust.spring.beanfactorypostprocessors.DataService" > <property name="pattern" value="#us" /> </bean>
<bean class="com.targettrust.spring.beanfactorypostprocessors.DatePatternRouterBeanFactoryPostProcessor" />
</beans>
![Page 31: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/31.jpg)
package com.targettrust.spring.beanfactorypostprocessors;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Teste { public static void main(String[] args) { ApplicationContext ap = new ClassPathXmlApplicationContext("/com/targettrust/spring/beanfactorypostprocessors/Spring-beans.xml"); System.out.println("Data Brasil pattern : " + ((DataService)ap.getBean("brasilDateService")).showSysDate()); System.out.println("Data Us pattern : " + (DataService)ap.getBean("usDateService")).showSysDate());
}}
![Page 32: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/32.jpg)
• Muito utilizado• Convertem a informação para o
tipo de dado correto.
• Deixa o XML menos verbose• Padroniza e prove produtividade
<bean id="txt" class="java.io.File"> <constructor-arg index="0" value="C:/BOOTSECT.BAK" /></bean>
![Page 33: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/33.jpg)
![Page 34: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/34.jpg)
![Page 35: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/35.jpg)
![Page 36: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/36.jpg)
• PropertyEditorManager(java, procurar)
• Localização automática• Foo• FooEditor• Extensível:
PropertyEditorSupport
![Page 37: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/37.jpg)
package com.targettrust.spring.propertyeditor;public class Aluno {
private String nome;public Aluno() {}
public Aluno(String nome) {super();this.nome = nome;
}
public String getNome() {return nome;
}public void setNome(String nome) {
this.nome = nome;}
@Overridepublic String toString() {
return nome;}
}
![Page 38: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/38.jpg)
package com.targettrust.spring.propertyeditor;import java.util.List;public class Turma {
private String nome;private List<Aluno> alunos;
public Turma() {}public Turma(String nome, List<Aluno> alunos) {
super();this.nome = nome;this.alunos = alunos;
}
public String getNome() {return nome;
}public void setNome(String nome) {
this.nome = nome;}public List<Aluno> getAlunos() {
return alunos;}public void setAlunos(List<Aluno> alunos) {
this.alunos = alunos;}
@Overridepublic String toString() {
return nome + " alunos: " + alunos.toString();}
}
![Page 39: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/39.jpg)
package com.targettrust.spring.propertyeditor;import java.beans.PropertyEditorSupport;public class AlunoEditor extends PropertyEditorSupport{
@Overridepublic void setAsText(String text) throws IllegalArgumentException {
Aluno a = new Aluno(text);setValue(a);
}
}
![Page 40: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/40.jpg)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="turma“ class="com.targettrust.spring.propertyeditor.Turma"> <property name="nome" value="Curso-Spring" /> <property name="alunos">
<list> <value>Rod</value> <value>Joe</value> <value>Bart</value> <value>Homer</value> <value>Hammer</value></list>
</property> </bean>
<bean id="customEditorConfigurer“ class="org.springframework.beans.factory.config.CustomEditorConfigurer“ > <property name="customEditors"> <map>
<entry key="com.targettrust.spring.propertyeditor.Aluno"> <bean class="com.targettrust.spring.propertyeditor.AlunoEditor" /> </entry> </map>
</property> </bean></beans>
![Page 41: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/41.jpg)
• Só no ApplicationContext• ApplicationEvent• ApplicationListener• Toda vez que um
ApplicationEvent é disparado seu ApplicationListener é notificado recebendo o evento.
• Sincronos (Bloqueio do Spring até o fim de todos)
![Page 42: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/42.jpg)
![Page 43: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/43.jpg)
package com.targettrust.spring.event;import org.springframework.context.ApplicationEvent;
public class FeriadoEvent extends ApplicationEvent{
private String data;private static final long serialVersionUID = 1L;
public FeriadoEvent(Object source,String data) {super(source);this.data = data;
}public String getData() { return data;}
}
![Page 44: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/44.jpg)
package com.targettrust.spring.event;import org.springframework.context.ApplicationEvent;import org.springframework.context.ApplicationListener;
public class FeriadoListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) { if (event instanceof FeriadoEvent){
FeriadoEvent fe = (FeriadoEvent)event; System.out.println("Viva! Dia: " + fe.getData() + " é feriado. Uhhuu!!!" );}
}}
![Page 45: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/45.jpg)
package com.targettrust.spring.event;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;
public class RH implements ApplicationContextAware {
private ApplicationContext ac;
public void pulicarFeriados(){ ac.publishEvent(new FeriadoEvent(this,"01/01/08"));}
@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ac = applicationContext;}
}
![Page 46: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/46.jpg)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="rh" class="com.targettrust.spring.event.RH" /> <bean id="funcionarioEsperto" class="com.targettrust.spring.event.FeriadoListener" />
</beans>
![Page 47: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/47.jpg)
package com.targettrust.spring.event;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Teste {
public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("/com/targettrust/spring/event/Spring-beans.xml");
RH rh = (RH)ac.getBean("rh"); rh.pulicarFeriados(); }}
![Page 48: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/48.jpg)
• Externalizar informações na BF• É um BeanFactoryPostProcessor• Externalização em .properties• Útil para:
• Conexões de banco• Usuários• Listas de e-mails• Evita mexer no XML, diminui
erros
![Page 49: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/49.jpg)
• Procura nas propriedades do sistema de modo: systemPropertiesMode
• Excelente para realizar roteamentos
• Diminui o volume de dados em XML
• Aceita Property em linha, dupla flexibilidade
![Page 50: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/50.jpg)
package com.targettrust.spring.propertyplaceholderconfigurer;public class Instrutor {
private String nome;private int idade;private String time;private float altura;
// getters and Setters}
nome=deigoidade=22altura=1.85
Arquivo .properties
![Page 51: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/51.jpg)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location“> <value>classpath:com/targettrust/spring/propertyplaceholderconfigurer/config.properties </value> </property> <property name="properties"> <value>time=Grêmio</value>
</property> </bean> <bean
id="I”class="com.targettrust.spring.propertyplaceholderconfigurer.Instrutor" >
<property name="nome" value="${nome}" /> <property name="idade" value="${idade}" /> <property name="time" value="${time}" /> <property name="altura" value="${altura}" />
</bean></beans>
![Page 52: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/52.jpg)
• Permite carregar múltiplos arquivos de configurações de uma só vez
• Aplicação dividida em camadas• Cuidado ao utilizar: veja JEE • Cada camada é uma BeanFactory• XML na raiz do cp com nome:
beanRefFactory.xml
![Page 53: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/53.jpg)
package com.targettrust.spring.singletonbeanfactorylocator;public class ObjetoA {}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" default-lazy-init="true"> <bean id="A1" class="com.targettrust.spring.singletonbeanfactorylocator.ObjetoA” /> </beans>
+ A2 A3 A4
![Page 54: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/54.jpg)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"default-lazy-init="false"
> <bean id="beanFactoryBean“class="org.springframework.context.support.ClassPathXmlApplicationContext”> <constructor-arg> <list> <value> com/targettrust/spring/singletonbeanfactorylocator/Spring-beans-A.xml </value> <value> com/targettrust/spring/singletonbeanfactorylocator/Spring-beans-B.xml </value> <value> com/targettrust/spring/singletonbeanfactorylocator/Spring-beans-C.xml </value> </list> </constructor-arg> </bean>
<bean id="beanFactoryBean2“ class="org.springframework.context.support.ClassPathXmlApplicationContext“ > <constructor-arg> <list>
<value> com/targettrust/spring/singletonbeanfactorylocator/Spring-beans-D.xml </value> </list> </constructor-arg> </bean></beans>
![Page 55: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/55.jpg)
package com.targettrust.spring.singletonbeanfactorylocator;import org.springframework.beans.factory.access.BeanFactoryLocator;import org.springframework.beans.factory.access.BeanFactoryReference;import org.springframework.beans.factory.access.SingletonBeanFactoryLocator;public class Teste {
public static void main(String[] args) { BeanFactoryLocator bfl = SingletonBeanFactoryLocator.getInstance(); BeanFactoryReference bf = bfl.useBeanFactory("beanFactoryBean"); ObjetoA a1 = (ObjetoA)bf.getFactory().getBean("A1"); ObjetoA a2 = (ObjetoA)bf.getFactory().getBean("A2"); ObjetoA a3 = (ObjetoA)bf.getFactory().getBean("A3");
bf = bfl.useBeanFactory("beanFactoryBean2"); ObjetoA a4 = (ObjetoA)bf.getFactory().getBean("A4");
System.out.println("ObjetoA a1: " + a1); System.out.println("ObjetoA a2: " + a2); System.out.println("ObjetoA a3: " + a3); System.out.println("ObjetoA a4: " + a4); }}
![Page 56: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/56.jpg)
• Somente no ApplicationContext• Procura por MessageSource• StaticMessageSource (padrão):
• Programaticamente• ResourceBundleMessageSource:
• Suporte textFormart• Carrega arquivos por nome
base• MessageSourceAware
![Page 57: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/57.jpg)
package com.targettrust.spring.i18n;import java.util.Locale;import org.springframework.context.MessageSource;import org.springframework.context.MessageSourceAware;public class Pessoa implements MessageSourceAware{
private String nome;private int idade;private MessageSource ms;
// Getters e Setters
public void setIdade(int idade) { if( idade<=0 || idade >= 120 ) throw new IllegalArgumentException(ms.getMessage("idade.invalida",new
Object[]{idade},Locale.getDefault())); this.idade = idade;
}}
![Page 58: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/58.jpg)
idade.invalida= A idade: {0} não é aceitável por que é muito velha ou menor do que 1
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="messageSource“ class="org.springframework.context.support.ResourceBundleMessageSource“ > <property name="basenames"> <list> <value>mensagems</value> </list> </property> </bean>
<bean id="pessoa“ class="com.targettrust.spring.i18n.Pessoa“ />
</beans>
![Page 59: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/59.jpg)
package com.targettrust.spring.i18n;import java.util.Locale;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Teste { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("/com/targettrust/spring/i18n/Spring-beans.xml");
Locale.setDefault(new Locale("pt","BR"));setIdade(ac);
}
private static void setIdade(ApplicationContext ac){Pessoa p = (Pessoa)ac.getBean("pessoa");p.setNome("Crom");
try{ p.setIdade(200);}catch(RuntimeException re){ re.printStackTrace();}
}
}
![Page 60: Spring Capitulo 03](https://reader034.vdocuments.mx/reader034/viewer/2022051109/5482b0c9b47959ec0c8b48a6/html5/thumbnails/60.jpg)
1. Crie um objeto Pessoa: nome, idade, telefone.2. Crie um validador Pessoa3. Invoque o validador de pessoa em um BeanPostProcessor4. Externalize as mensagens de erro em um arquivo property e
mostre mensagens i18n caso a idade da pessoa esteja inválida.5. Crie um property editor que seja possível passar o nome, idade e
telefone da pessoa apenas na propriedade nome e o property editor espalhará as informações em suas propriedades corretas