Série Spring:Injeção de dependência com Spring via Annotations

olá Pessoal,

No post de hoje vamos ver como usar annotations no Spring para fazer a injeção de depência. Nos posts anteriores vimos como fazer isso de forma declarativa, ou seja, usando o xml. Agora vamos para algo mais clear, pois sistemas grandes e muitas informações no xml pode ser um pensadelo durante a manuteção.

lets go…

Iniciando

Vamos criar um java project SpringAnnotations com a seguinte estrutura:

springannotationsproject

Criaremos uma interface e uma classe que implementa a mesma:

public interface MachineRegister {

                public void register();

}

public class Caixa1 implements MachineRegister {

                @Override

                public void register() {

                               System.out.println(“Caixa 1 registrado”);}

}

 

E agora teremos a classe que tem dependência:

 public class CentralMachine {

                private MachineRegister machineRegister;

 

                public CentralMachine(MachineRegister machineRegister) {

                               super();

                               this.machineRegister = machineRegister;

                }

                public void setMachineRegister(MachineRegister machineRegister) {

                               this.machineRegister = machineRegister;

                }

                public MachineRegister getMachineRegister() {

                               return machineRegister;

                }

                public void register() {

                               machineRegister.register();                      

                }}

 

Se fossemos declarar essa classe no xml seria assim:

 <bean  id=”caixa1″ class=”br.com.camilolopes.classes.Caixa1″/>

 <bean  id=”centralMachine” class=”br.com.camilolopes.classes.CentralMachine”>

 <constructor-arg name=”caixa1″ ref=”caixa1″/>

 </bean>

 

Mas, veremos como será via Annotations a seguir.

 

Usando Annotations

Vamos ver alguns conceitos importantes que você vai se deparar no código a seguir, mas resolvi dar um overview antes. 

No Spring a dependency injection via annotations nao vem configurado por default, é preciso informar isso ao .xml. Para fazer isso precisamos apenas adicionar a seguinte linha 

<context:annotation-config /> 

E atualizar o cabeçalho do beans para :

xmlns:context=”http://www.springframework.org/schema/context”

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.1.xsd”

Feito isso podemos remover as injenção de dependência.

O arquivo ficará assim:

<beans xmlns=”http://www.springframework.org/schema/beans”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xmlns:context=”http://www.springframework.org/schema/context”

xsi:schemaLocation=”http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.1.xsd“>

<!– Aqui estamos declarando o beans  –>

<bean  id=”caixa1″/>

 <bean  id=”centralMachine” class=”br.com.camilolopes.classes.CentralMachine”/>

 <context:annotation-config/>

</beans>

 

Agora vamos dizer ao Spring as dependências via annotations. Na classe CentralMachine adicione a seguinte anotação:

 public class CentralMachine {

                @Autowired

                private MachineRegister machineRegister;

                @Autowired

                public CentralMachine(MachineRegister machineRegister) {

                               super();

                               this.machineRegister = machineRegister;

                }

 

@AutoWired Annotation

Para injectar a dependencia usamos anotação @Autowired. Assim estamos dizendo que a classe X tem uma dependência de Y.

 Problema

Quando temos uma interface que é implementada por mais de uma classe como o Spring vai saber qual queremos?

Ele não vai saber, porque o Spring não tem bola de Cristal simplesmente  vai lançar uma exceção NoSuchBeanDefinitionException.

 Resolução

@Qualifier Annotations

Permite dizer para o Spring qual implementação ele deve considerar, passamos o id do bean.

public class CentralMachine {

                @Autowired

                @Qualifier(“caixa1”)

                private MachineRegister machineRegister;

 Agora vamos criar uma classe com o método main para testar:

 public class Main {

                public static void main(String[] args) {

//                           essa classe é o container

                ApplicationContext applicationContext = new ClassPathXmlApplicationContext(

                                                               “conf/springconfiguration.xml”);

                 CentralMachine bean = (CentralMachine) applicationContext.getBean(“centralMachine”);

                               bean.register();

                }}

 

Resultado:

resultspringannotations

 

Pronto. Estamos usando annotations para fazer a injeção de depência no Spring. Simples não? Observe que diminuimos  algumas configuração que teriamos que no xml e passamos a fazer direito no código.Particularmente eu gosto muito de annotations.

Os projetos

GitHub: https://github.com/camilolopes/workspacespring

Vou ficando por aqui…

see ya!!

Série Spring: Hello World no Spring

 

olá Pessoal,

Estarei dando inicio a mais uma série aqui no blog e dessa vez é com o Spring framework. No post de hoje veremos como dar um Hello World usando o Spring, parece algo simples e fácil né? Mas, na verdade é. Porém, para quem nunca mexeu com Spring ainda pode achar que é complicado.

O Spring

Sem entrar na teoria pq o que não falta é fonte explicando o que é e pra que serve o framework. Eu digo sempre que o Spring é cara que nos ajuda a não fazer as coisas chatas e repetivas do dia-dia, que normalmente para o cliente não tem valor algum.

 Hello World

Vamos criar um java project, mas não esqueça de ir no site do Spring e baixar a versão mais recente. Estarei usando a versão 3.x.

Development

1. Crie um  java project

2. E os seguintes packages
springhelloworldpackage

3. Agora crie uma classe chamada SpringHelloWorld que terá um método o qual irá imprimir no console a mensagem

“Hello World Spring”.

package br.com.camilolopes.classes;

public class SpringHelloWorld {

                public void showHelloWorld(){

                               System.out.println(“Hello World Spring”);

                }}

4. No package conf  crie um arquivo XML , aqui chamei de springconfiguration.xml. E adicione o código a seguir ao arquivo:

<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-3.0.xsd”>

 <bean  id=“hello” class=“br.com.camilolopes.classes.SpringHelloWorld”/>

</beans>

 

O cabeçalho temos  a configuração do Spring e a versão que estamos o usando. Mas, o essencial está na tag do bean. Ali estamos dizendo ao Spring para ele instanciar um objeto para a classe SpringHelloWorld, sendo assim  na aplicação podemos obter essa instância pelo id do bean e invocar qualquer método disponível da classe. Isso é o mesmo que fazemos

SpringHelloWorld variavelInstancia = new SpringHelloWorld();

Só que agora quem faz isso é o Spring e não nós mais. Veremos a seguir na prática o uso.

5. crie uma classe com o método main. Chamei a minha de Main.

package br.com.camilolopes.main;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext; 

import br.com.camilolopes.classes.SpringHelloWorld;

public class Main {

      public static void main(String[] args) {

//          essa classe é o container

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(

                        “conf/springconfiguration.xml”);

            SpringHelloWorld bean = (SpringHelloWorld) applicationContext.getBean(“hello”);

            bean.showHelloWorld();      }}

 O ApplicationContext é o coração do Spring é através deles que vamos obter o que precisamos para trabalhar. Observe que informei para o ApplicationContext  onde está o arquivo de configuração do Spring que ele precisa se basear.Em seguida tem um .getBean e passei o id do bean que desejo, que é o id que declaramos no xml:

<bean  id=“hello” class=“br.com.camilolopes.classes.SpringHelloWorld”/>

 Ou seja, nesse momento o Spring já fez o new na classe por baixo dos panos, agora podemos fazer o que quiser com o objeto, nesse caso chamei  o único método existente e o resultado foi:

helloworldspringresult

 Simples assim!!. E isso é o básico do Spring.

GitHub

Acesse o repositório no github com todos os projetos da série Spring:  https://github.com/camilolopes/workspacespring

Vou ficando por aqui e espero que tenham gostado do post.

Abraços,

 

 

Lançamento Oficial do Livro JEE com Frameworks

Comprar

ae Pessoal,

Hoje é mais um dia feliz na minha vida, e primeiramente quero agradecer à todos vocês, pela força, atenção, feedbacks que venho recebendo nesses 3 anos de blog e sem eles, acho que não estaria aqui hj fazendo este post e publicando mais este projeto. Pois, meu segundo filhão nasceu, huhuhu \o/. Lindo igual ao pai, por consequencia do destino hehe. Uma das novidades é que além do formato impresso, temos a versão e-book. A seguir fiz um overview,há um post detalhado de  pré-lançamento aqui.

Lets go…

Note: Infelizmente, tivemos um problema na linha de produção da gráfica e atrasou a publicação que estava prevista para meados de julho/2011.

Agradecimento

Antes de tudo, preciso agradecer ao melhor amigo o Edson Gonçalves. Amigo este de longas datas, o qual eu tenho grande admiração e respeito. É um dos profissionais mais completos de TI que já pude conhecer, o cara tem um conhecimento cross que é uma coisa de louco(não se limita só a parte técnica). Fora amizade que temos, onde às vezes pego o caminho errado, o verdadeiro amigo aparece e ti fala:”Falei que poderia contar comigo, o caminho  é aquele vai em frente”. Esse é o Edson um amigo de verdade.

Outra pessoa que não posso deixar de agradecer é o Daniel de Oliveria (leader-DFJUG) de uma das maiores e respeitável comunidade de Java que temos no Brasil, estou falando do DFJUG. E não poderia deixar de dar minha contribuição (para quem não sabe eu vim da comunidade Java, foi onde tudo começou e hoje retribuir o que recebi é o minimo que posso fazer), adicionado a marca  na capa do livro. Obrigado Daniel pelo seu apoio e da comunidade :).

Overview

O livro tem como objetivo de ajudar aqueles profissionais que desejam aprender Java com Frameworks. É comum ao sairmos do “ABC do JEE” (normalmente é JSP/Servlet) sem saber qual framework estudar (Hibernate, JSF, Spring, “Struts”, VRaptor etc). Porém, há um problema que todo iniciante encontra: como aprender os frameworks e saber integrá-los em uma aplicação real? É isso que vamos ver no livro, aprender a usar os frameworks de forma prática e ver um pouco da teoria(se não gosta de teoria não se preocupe, pois veremos o suficiente para poder programar de maneira confortável). Os exemplos são variados, desde Java Application até JEE, a evolução de aprendizado no livro está no formato “baby-step” ajudando assim o leitor leigo no assunto. Uma novidade que alguns vão gostar e outros não, são os exercícios chamados de “Trabalho do dia” que tem como objetivo fazer o leitor desenvolver uma solução, porém há momentos que o leitor vai precisar fazer uma pesquisa na documentação da API, Google ou consultar outros capítulos.Porém, não avisamos isso no livro, então  o leitor terá que ter essa percepção. O motivo de ter adotado isso aos exercícios, transmitir um pouco do que vai encontrar no dia-dia como desenvolvedor in company, pois nem sempre teremos um colega do lado para dar o help que precisamos.

Público-Alvo

Programadores Java que tem como objetivo aprender de forma pratica o uso dos frameworks JEE mais requisitado no mercado.

Qual o diferencial?

Meus livros são diferentes, primeiramente pela escrita. Eu gosto muito da informalidade, de ser direto e tentar transmitir a informação da melhor maneira possível, como se eu tivesse ao lado do leitor. Nesse livro há vários diferenciais, um deles é o nosso laboratório on-line onde o leitor poderá fazer download do source, assistir uns vídeos de como colocar aplicação em um servidor de produção JEE(apoio da www.integrator.com.br), exercícios práticos etc.

Quando ler?

Assim, que terminar seus estudos, com Servlet & JSP, vc pode ler, do contrário, não faça o investimento agora e aguarde mais um pouquinho( coloque o livro na prateleira ou remova do seu carrinho de compras : ) ).

Requisitos

É preciso já ter uma certa experiência com Java, Banco de dados, saber como as aplicações JEE funcionam etc. Como o livro é focado em ensinar a usar de forma pratica os frameworks, não podemos perder tempo com toda teoria de JEE, então vamos direto ao assunto.Particularmente não gosto de livros grandes, eles ficam mais caros e o que eu quero é um preço acessível para todos, enfim até os que recebem mesada podem comprar (pelo menos a minha na época que tinha, os livros eram caros demais rs).

Desconto

Se quiser comprar o exemplar com 30% de desconto no site da Editora, basta usar o código a seguir durante a compra: V00014 e se cadastrar como associado.

Concorra Sorteio será 21/08/2011

Faça um RT da mensagem abaixo e sua inscrição, assim terá a chance de receber um exemplar na sua casa autografado(se preferir). Para sorteio usaremos o random.org e o número sorteado será o ganhador e a verificação do RT  Lembrando que para aqueles que fizeram mais de um cadastro com o mesmo e-mail, não estará concorrendo ao exemplar.

Lançamento do Livro Guia JEE c/ frameworks @RT: @camilolope #JEE #frameworks.Confira:

Lançamento Oficial do Livro JEE com Frameworks

Após, o resultado entrarei em contato pelo e-mail cadastrado e o ganhador tem até 48 hrs para responder, após o envio  do e-mail.Do contrário um novo sorteio será realizado, e o ganhador anterior acabou de perder a chance de receber o livro. : )

Fazer inscrição

Você pode deixar de ganhar se não fizer isso:

  • cadastrar e não fazer o RT;

  • fazer o RT e não se cadastrar;

A qtde de RT fica por sua conta, se quiser fazer mais de RT, ficarei feliz :).

Versão do Livro

  • Paper – R$ 47,20
  • E-book  – R$ 35,40

Eu quero comprar o meu

Onde comprar?

  • Site da Editora
  • Saraiva
  • Cultura
  • Fnac
  • Americanas.com
  • Submarino
  • e outras que eu não lembro rs

Download

Conseguir com a editora amostra de algumas páginas do livro, confiram aqui

Vou ficando por aqui e espero que tenham gostado do post.

Abracos see ya!!

Solucionado ROLE_ Spring Security

Olá Pessoal,

O post de hoje vem com o objetivo de complementar dois posts do Edson Gonçalves referente Spring Security. Muitos desenvolvedores que pretende usar Spring Security (SS) em suas apps JEE para implementar a regra de segurança sofrem quando já temos dados cadastrado no BD e não queremos mudar as informações no BD para prefix o ROLE_ que é requerido pelo SS.

Neste post vou mostrar como resolver este problema, que você pode se deparar em sistema legado.

Lets go…

Recomendado:

Spring Security + BD

Spring Security Sem BD

Iniciando

Vou levar em conta que você ja tem implementado o SS conforme este post do Edson Gonçalves. Caso contrário leia o post do Gonçalves antes de continuar com o meu.

Mas, para refrescar sua mente lembre-se que o role deve ter ROLE_ prefixado para que as regras funcionem. Isso é default no SS. Há como alterar, porém pesquisei muitooo e não conseguir implementar, no forum SS há varias sugestoes, mas nenhuma delas foi mais eficiente que prefix o ROLE_ com os dados trazido do BD.

Desenvolvendo

A solução é mais simples que podemos imaginar, você vai precisar apenas prefix o ROLE_. Para quem usa MySQL temos a funcao concat(), no Oracle podemos usar | | etc. Em verifique na documentação do seu banco como concatenar.

A seguir mostramos com o MySQL. É simples demais, confira:

authorities-by-username-query="SELECT  username, concat('ROLE_',authority) FROM users where username = ? "

O código completo fica assim:

< jdbc-user-service data-source-ref="dataSource"  

users-by-username-query="SELECT username, password, 'true' as enable FROM users WHERE username=?"
authorities-by-username-query="SELECT  username, concat('ROLE_',authority) FROM users where username = ? "
/>

ou dessa forma:

 users-by-username-query="SELECT l.login as username, l.senha as password, 'true' as enable from funcionario l where l.login=?"	
authorities-by-username-query="SELECT lo.login as username, CONCAT('ROLE_',lo.cargo)as authority FROM funcionario lo where lo.login=?"	/>
 

Outra dica é se a coluna do usuario/password não for o que o Spring Security espera, basta você fazer conforme o código a seguir:

users-by-username-query="SELECT us.email as username, us.senha as password, 'true' as enable FROM	usuario as us WHERE email=?"
authorities-by-username-query="SELECT  us.email as username, us.tipo as authority FROM usuario us where email= ?"

Vou ficando por aqui, espero que tenham gostado do post.

Abracos e até o próximo post.