{"id":13,"date":"2010-03-15T19:51:55","date_gmt":"2010-03-15T22:51:55","guid":{"rendered":"http:\/\/www.javaframework.org\/portal\/2010\/03\/15\/spring-3-configurando-beans-com-annotations\/"},"modified":"2010-03-15T20:08:30","modified_gmt":"2010-03-15T23:08:30","slug":"spring-3-configurando-beans-com-annotations","status":"publish","type":"post","link":"https:\/\/www.javaframework.org\/portal\/2010\/03\/15\/spring-3-configurando-beans-com-annotations\/","title":{"rendered":"Spring 3, configurando beans com Annotations"},"content":{"rendered":"<p>Hoje, \u00e9 muito comum frameworks configur\u00e1veis atrav\u00e9s de annotations. O Spring tamb\u00e9m possui esse estilo de configura\u00e7\u00e3o que \u00e9 bastante pr\u00e1tico e traz produtividade ao desenvolvimento. Voc\u00ea poder\u00e1 inclusive misturar configura\u00e7\u00e3o via XML e Annotations e utilizar qual for mais adequada para cada situa\u00e7\u00e3o. Nesse tutorial mostraremos como a configura\u00e7\u00e3o pode ser feita atrav\u00e9s de annotations e ainda como pode ser feita a detec\u00e7\u00e3o autom\u00e1tica dos beans atrav\u00e9s do classpath scanning.<\/p>\n<p> <!--more-->  <\/p>\n<p>&#160;<\/p>\n<p>Esse tutorial \u00e9 continua\u00e7\u00e3o do <a href=\"http:\/\/www.javaframework.org\/portal\/2010\/03\/14\/hello-world-com-spring-3-para-um-projeto-web\/\">Hello World com Spring 3 para um projeto WEB<\/a>, se ainda n\u00e3o tem um projeto Spring configurado, \u00e9 recomend\u00e1vel ler o outro tutorial antes de prosseguir com esse. Algumas anota\u00e7\u00f5es utilizadas nesse cap\u00edtulo necessitam JEE 5 (como @PostConstruct).<\/p>\n<h3>1. Configurando os beans com annotations<\/h3>\n<p>Vamos come\u00e7ar configurando beans com Annotations, ao inv\u00e9s de usar a configura\u00e7\u00e3o de XML. Como \u00e9 poss\u00edvel utilizar as duas configura\u00e7\u00f5es simultaneamente, a configura\u00e7\u00e3o feita atrav\u00e9s de Annotations \u00e9 processada antes da configura\u00e7\u00e3o via XML. A configura\u00e7\u00e3o em XML pode ent\u00e3o sobrescrever a configura\u00e7\u00e3o feita com Annotations.<\/p>\n<p>Para habilitar a configura\u00e7\u00e3o dos beans via annotations, basta adicionar uma tag context:annotation-config no seu arquivo applicationContext.xml (Note a inclus\u00e3o do namespace <em>context<\/em>)<\/p>\n<p><font size=\"2\" face=\"Courier New\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;     <br \/>&lt;beans xmlns=&quot;<\/font><a href=\"http:\/\/www.springframework.org\/schema\/beans&quot;\"><font size=\"2\" face=\"Courier New\">http:\/\/www.springframework.org\/schema\/beans&quot;<\/font><\/a>    <br \/><font size=\"2\" face=\"Courier New\">&#160;&#160;&#160;&#160;&#160;&#160; xmlns:xsi=&quot;<\/font><a href=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;\"><font size=\"2\" face=\"Courier New\">http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;<\/font><\/a>    <br \/><font size=\"2\" face=\"Courier New\">&#160;&#160;&#160;&#160;&#160;&#160; <u>xmlns:context=&quot;<\/u><\/font><a href=\"http:\/\/www.springframework.org\/schema\/context\"><font size=\"2\" face=\"Courier New\"><u>http:\/\/www.springframework.org\/schema\/context&quot;<\/u><\/font><\/a>    <br \/><font size=\"2\" face=\"Courier New\">&#160;&#160;&#160;&#160;&#160;&#160; xsi:schemaLocation=&quot;<\/font><a href=\"http:\/\/www.springframework.org\/schema\/beans\"><font size=\"2\" face=\"Courier New\">http:\/\/www.springframework.org\/schema\/beans<\/font><\/a><font size=\"2\" face=\"Courier New\">     <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <\/font><a href=\"http:\/\/www.springframework.org\/schema\/beans\/spring-beans-3.0.xsd\"><font size=\"2\" face=\"Courier New\">http:\/\/www.springframework.org\/schema\/beans\/spring-beans-3.0.xsd<\/font><\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href=\"http:\/\/www.springframework.org\/schema\/context\"><font size=\"2\" face=\"Courier New\"><u>http:\/\/www.springframework.org\/schema\/context<\/u><\/font><\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href=\"http:\/\/www.springframework.org\/schema\/context\/spring-context-3.0.xsd&quot;\"><font size=\"2\" face=\"Courier New\"><u>http:\/\/www.springframework.org\/schema\/context\/spring-context-3.0.xsd<\/u>&quot;<\/font><\/a><font size=\"2\" face=\"Courier New\">&gt;     <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160; &lt;context:annotation-config\/&gt;      <br \/><\/font><font size=\"2\" face=\"Courier New\">     <br \/>&lt;\/beans&gt;<\/font><\/p>\n<p>Com essa tag, ser\u00e1 poss\u00edvel fazer a configura\u00e7\u00e3o dos beans por Annotations.<\/p>\n<p>Vejamos as anota\u00e7\u00f5es (alguns dos exemplos mostrados foram retirados da documenta\u00e7\u00e3o do Spring):<\/p>\n<h5>@Required<\/h5>\n<p>A anota\u00e7\u00e3o @Required \u00e9 utilizada nos setters das propriedades do bean, veja o exemplo:<\/p>\n<p><font size=\"2\" face=\"Courier New\"><strong>public class<\/strong> SimpleMovieLister {      <\/p>\n<p>&#160;&#160;&#160; <strong>private<\/strong> MovieFinder movieFinder;      <\/p>\n<p>&#160;&#160;&#160; @Required      <br \/>&#160;&#160;&#160; <strong>public void<\/strong> setMovieFinder(MovieFinder movieFinder) {      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>this<\/strong>.movieFinder = movieFinder;      <br \/>&#160;&#160;&#160; }      <br \/>&#160;&#160;&#160; \/\/ &#8230;      <br \/>}<\/font><\/p>\n<p>Essa anota\u00e7\u00e3o indica que essa propriedade deve ser populada na configura\u00e7\u00e3o. Caso n\u00e3o haja configura\u00e7\u00e3o para essa propriedade uma exce\u00e7\u00e3o ser\u00e1 lan\u00e7ada pelo container.<\/p>\n<h5>@Autowired e @Inject<\/h5>\n<p>Como esperado, voc\u00ea pode utilizar a anota\u00e7\u00e3o @Autowired em m\u00e9todos setter. Se estiver utilizando um JAR para o JSR-330 (Inje\u00e7\u00e3o de dependencia) poder\u00e1 utilizar a anota\u00e7\u00e3o @Inject. O Spring detecta se o JAR est\u00e1 presente automaticamente. A anota\u00e7\u00e3o @Autowired faz a configura\u00e7\u00e3o da propriedade de forma autom\u00e1tica, buscando na f\u00e1brica do Spring algum bean que possa satisfazer a dependencia e ent\u00e3o realizando a configura\u00e7\u00e3o.<\/p>\n<p><font size=\"2\" face=\"Courier New\"><strong>public class<\/strong> SimpleMovieLister {      <br \/>&#160;&#160;&#160; <strong>private<\/strong> MovieFinder movieFinder;      <br \/>&#160;&#160;&#160; @Autowired      <br \/>&#160;&#160;&#160; <strong>public void<\/strong> setMovieFinder(MovieFinder movieFinder) {      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>this<\/strong>.movieFinder = movieFinder;      <br \/>&#160;&#160;&#160; }      <br \/>&#160;&#160;&#160; \/\/ &#8230;      <br \/>}<\/font><\/p>\n<p>Propriedade anotadas com @Autowired devem ser obrigatoriamente preenchidas. Voc\u00ea pode alterar esse comportamento atrav\u00e9s do atributo required, como @Autowired(required=false). A anota\u00e7\u00e3o @Inject n\u00e3o tem a mesma defini\u00e7\u00e3o, sendo o preenchimento opicional. <\/p>\n<p>Tamb\u00e9m \u00e9 poss\u00edvel utilizar essa anota\u00e7\u00e3o em m\u00e9todos com nomes aleat\u00f3rios e com v\u00e1rios argumentos:<\/p>\n<p><font size=\"2\"><font face=\"Courier New\"><strong>public class<\/strong> MovieRecommender {        <br \/>&#160;&#160;&#160; <strong>private<\/strong> MovieCatalog movieCatalog;        <br \/>&#160;&#160;&#160; <strong>private<\/strong> CustomerPreferenceDao customerPreferenceDao;        <br \/>&#160;&#160;&#160; <br \/>&#160;&#160;&#160; @Autowired        <br \/>&#160;&#160;&#160; <strong>public void<\/strong> prepare(MovieCatalog movieCatalog, CustomerPreferenceDao customerPreferenceDao) {        <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>this<\/strong>.movieCatalog = movieCatalog;        <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>this<\/strong>.customerPreferenceDao = customerPreferenceDao;        <br \/>&#160;&#160;&#160; }        <br \/>&#160;&#160;&#160; \/\/ &#8230;        <br \/>}<\/font><\/font><\/p>\n<p>Voc\u00ea pode usar o @Autowired em construtores e campos:<\/p>\n<p><font size=\"2\"><font face=\"Courier New\"><strong>public class<\/strong> MovieRecommender {        <br \/>&#160;&#160;&#160; @Autowired        <br \/>&#160;&#160;&#160; <strong>private<\/strong> MovieCatalog movieCatalog;        <br \/>&#160;&#160;&#160; <strong>private<\/strong> CustomerPreferenceDao customerPreferenceDao;        <br \/>&#160;&#160;&#160; @Autowired        <br \/>&#160;&#160;&#160; <strong>public<\/strong> MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {        <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>this<\/strong>.customerPreferenceDao = customerPreferenceDao;        <br \/>&#160;&#160;&#160; }        <br \/>&#160;&#160;&#160; \/\/ &#8230;        <br \/>}<\/font><\/font><\/p>\n<h5>@Value<\/h5>\n<p>A anota\u00e7\u00e3o @Value \u00e9 utilizada quando temos propriedades que n\u00e3o s\u00e3o outros beans exemplo:<\/p>\n<p><font size=\"2\"><font face=\"Courier New\"><strong>public class<\/strong> MovieCatalog {        <br \/>&#160;&#160;&#160; @Value(\u201cComedy\u201d)        <br \/>&#160;&#160;&#160; String name;<\/font><\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\">}<\/font><\/p>\n<h5>@PostConstruct e @PreDestroy<\/h5>\n<p>As anota\u00e7\u00f5es @PostContruct e @PreDestroy servem para anotar m\u00e9todos que devem ser chamados quando o container for iniciado e destruido respectivamente. \u00c9 necess\u00e1rio ter um JAR do JSR-250 para ter dispon\u00edveis essas anota\u00e7\u00f5es. Se n\u00e3o tiver esse JAR dispon\u00edvel uma alternativa \u00e9 utilizar os atributos init-method e destroy-method na defini\u00e7\u00e3o do bean no XML do Spring. Ou o bean implementar as interfaces InitializingBean e DisposeableBean.<\/p>\n<h3>2. Contruindo uma aplica\u00e7\u00e3o utilizando Annotations<\/h3>\n<p>Utilizando uma aplica\u00e7\u00e3o que j\u00e1 esteja configurada com o Spring, vamos criar dois beans e utilizar a inje\u00e7\u00e3o de depend\u00eancia atrav\u00e9s de annotations. Crie duas classes conforme o exemplo:<\/p>\n<p><font size=\"2\" face=\"Courier New\"><strong>package<\/strong> org.javaframework.spring; <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\"><strong>import<\/strong> javax.annotation.PostConstruct; <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\"><strong>import<\/strong> org.springframework.beans.factory.annotation.Autowired;      <\/p>\n<p><strong>public class<\/strong> MostraInformacoesSistema { <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\">&#160;&#160;&#160; <strong><font color=\"#0000ff\">@Autowired<\/font><\/strong>      <br \/>&#160;&#160;&#160; Sistema sistema;      <\/p>\n<p>&#160;&#160;&#160; <strong><font color=\"#0000ff\">@PostConstruct<\/font><\/strong>      <br \/>&#160;&#160;&#160; <strong>public void<\/strong> mostraInformacoes(){      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;Sistema: &quot;+sistema.getNome()+      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;, vers\u00e3o: &quot;+sistema.getVersao());      <br \/>&#160;&#160;&#160; }      <br \/>}<\/font><\/p>\n<\/p>\n<p><font size=\"2\"><font face=\"Courier New\"><strong>package<\/strong> org.javaframework.spring; <\/font><\/font><\/p>\n<p><font size=\"2\"><font face=\"Courier New\"><strong>import<\/strong> org.springframework.beans.factory.annotation.Value;        <\/p>\n<p><strong>public class<\/strong> Sistema { <\/font><\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\">&#160;&#160;&#160; <strong><font color=\"#0000ff\">@Value(&quot;Spring com annotations&quot;)<\/font><\/strong>      <br \/>&#160;&#160;&#160; String nome;      <\/p>\n<p>&#160;&#160;&#160; <strong><font color=\"#0000ff\">@Value(&quot;1.0&quot;)<\/font><\/strong>      <br \/>&#160;&#160;&#160; String versao;      <\/p>\n<p>&#160;&#160;&#160; <strong>public<\/strong> String getNome() {      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>return<\/strong> nome;      <br \/>&#160;&#160;&#160; }      <br \/>&#160;&#160;&#160; <strong>public<\/strong> String getVersao() {      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>return<\/strong> versao;      <br \/>&#160;&#160;&#160; }      <br \/>&#160;&#160;&#160; <strong>public void<\/strong> setNome(String nome) {      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.nome = nome;      <br \/>&#160;&#160;&#160; }      <br \/>&#160;&#160;&#160; <strong>public void<\/strong> setVersao(String telefone) {      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.versao = telefone;      <br \/>&#160;&#160;&#160; }      <br \/>}<\/font><\/p>\n<p>A classe Sistema servir\u00e1 para guardarmos algumas informa\u00e7\u00f5es que ser\u00e3o mostradas pela classe MostraInformacoesSistema. Foi utilizada a anota\u00e7\u00e3o @Autowired no atributo sistema da classe MostraInformacoesSistema, isso indica para o Spring fazer a configura\u00e7\u00e3o dessa propriedade automaticamente. A anota\u00e7\u00e3o @PostConstruct far\u00e1 com que o m\u00e9todo mostraInformacoes seja chamado assim que o bean esteja completamente configurado. <\/p>\n<p>Agora vamos configurar o XML do Spring para ler essas anota\u00e7\u00f5es e fazer a configura\u00e7\u00e3o, configure seu arquivo applicationContext.cml conforme o exemplo:<\/p>\n<p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;   <br \/>&lt;beans xmlns=&quot;<a href=\"http:\/\/www.springframework.org\/schema\/beans&quot;\">http:\/\/www.springframework.org\/schema\/beans&quot;<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160; xmlns:xsi=&quot;<a href=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;\">http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160; xmlns:context=&quot;<a href=\"http:\/\/www.springframework.org\/schema\/context&quot;\">http:\/\/www.springframework.org\/schema\/context&quot;<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160; xsi:schemaLocation=&quot;<a href=\"http:\/\/www.springframework.org\/schema\/beans\">http:\/\/www.springframework.org\/schema\/beans<\/a>&#160;<a href=\"http:\/\/www.springframework.org\/schema\/beans\/spring-beans-3.0.xsd\">     <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; http:\/\/www.springframework.org\/schema\/beans\/spring-beans-3.0.xsd<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href=\"http:\/\/www.springframework.org\/schema\/context\">http:\/\/www.springframework.org\/schema\/context<\/a>     <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href=\"http:\/\/www.springframework.org\/schema\/context\/spring-context-3.0.xsd&quot;\">http:\/\/www.springframework.org\/schema\/context\/spring-context-3.0.xsd&quot;<\/a>&gt;    <\/p>\n<p>&#160;&#160;&#160; &lt;context:annotation-config\/&gt; <\/p>\n<p>&#160;&#160;&#160; &lt;bean class=&quot;org.javaframework.spring.MostraInformacoesSistema&quot;\/&gt;   <\/p>\n<p>&#160;&#160;&#160; &lt;bean class=&quot;org.javaframework.spring.Sistema\u201d\/&gt;    <\/p>\n<p>&lt;\/beans&gt;<\/p>\n<p>Declaramos um bean da classe MostraInformacoesSistema e outro da classe Sistema. O Spring ir\u00e1 fazer a inje\u00e7\u00e3o do objeto Sistema no objeto MostraInformacoesSistema, gra\u00e7as a anota\u00e7\u00e3o @Autowired que utilizamos. <\/p>\n<p>Ao testar a aplica\u00e7\u00e3o ser\u00e1 impresso no console: <em>Sistema: Spring com annotations, vers\u00e3o: 1.0<\/em><\/p>\n<p>Outras informa\u00e7\u00f5es sobre a configura\u00e7\u00e3o por anota\u00e7\u00f5es, assim como outras anota\u00e7\u00f5es dispon\u00edveis, podem ser vistas na documenta\u00e7\u00e3o do Spring, se\u00e7\u00e3o <a href=\"http:\/\/static.springsource.org\/spring\/docs\/3.0.x\/spring-framework-reference\/html\/beans.html#beans-annotation-config\" target=\"_blank\">3.9 Annotation-based container configuration<\/a>.<\/p>\n<p>Fizemos a configura\u00e7\u00e3o do bean por annotations, mas ainda precisamos declarar o bean no XML. Isso porque a tag context:annotation-config apenas l\u00ea as anota\u00e7\u00f5es e faz a configura\u00e7\u00e3o, mas n\u00e3o implica em detectar as classes automaticamente. Para isso precisamos de outra tag, que ser\u00e1 mostrada a seguir.<\/p>\n<h3>3. Classpath scanning<\/h3>\n<p>Classpath scanning \u00e9 um recurso do Spring que l\u00ea o classpath da aplica\u00e7\u00e3o e busca classes que possam ser configuradas, isso evita que voc\u00ea tenha que declarar essas classes no XML. Essas classes s\u00e3o passadas por um filtro e ent\u00e3o uma defini\u00e7\u00e3o de um bean \u00e9 criada para elas. Geralemente esse filtro \u00e9 alguma anota\u00e7\u00e3o que marca que determinada classe deve ser utilizada como um componente. Essas anota\u00e7\u00f5es s\u00e3o: @Component, @Service, @Controller e @Repository (que foi introduzida no Spring 2.0). Voc\u00ea pode tamb\u00e9m criar suas pr\u00f3prias anota\u00e7\u00f5es e filtros para declarar os componentes.<\/p>\n<p>A anota\u00e7\u00e3o @Component \u00e9 um tipo gen\u00e9rico para qualquer bean que deve ser gerenciado pelo Spring. @Repository, @Service e @Controller s\u00e3o especializa\u00e7\u00f5es de @Component e servem para as camadas de persistencia, servi\u00e7o e apresenta\u00e7\u00e3o respectivamente. Voc\u00ea pode utilizar @Component para qualquer classe da sua aplica\u00e7\u00e3o, mas utilizar uma anota\u00e7\u00e3o mais espec\u00edfica ajuda caso deseje criar um filtro, utilizar ferramentas, ou orienta\u00e7\u00e3o a aspectos. Funcionalmente todas as anota\u00e7\u00f5es servem para declarar beans, n\u00e3o existe diferen\u00e7a entre elas a n\u00e3o ser na quest\u00e3o de organiza\u00e7\u00e3o da apliaca\u00e7\u00e3o e utilidades citadas anteriormente.<\/p>\n<p>Para detectar as classes e gerar beans precisamos de uma outra tag no applicationContext.xml<\/p>\n<p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;   <br \/>&lt;beans xmlns=&quot;<a href=\"http:\/\/www.springframework.org\/schema\/beans&quot;\">http:\/\/www.springframework.org\/schema\/beans&quot;<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns:xsi=&quot;<a href=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\">http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xmlns:context=&quot;<a href=\"http:\/\/www.springframework.org\/schema\/context\">http:\/\/www.springframework.org\/schema\/context&quot;<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xsi:schemaLocation=&quot;<a href=\"http:\/\/www.springframework.org\/schema\/beans\">http:\/\/www.springframework.org\/schema\/beans<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href=\"http:\/\/www.springframework.org\/schema\/beans\/spring-beans-3.0.xsd\">http:\/\/www.springframework.org\/schema\/beans\/spring-beans-3.0.xsd<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href=\"http:\/\/www.springframework.org\/schema\/context\">http:\/\/www.springframework.org\/schema\/context<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href=\"http:\/\/www.springframework.org\/schema\/context\/spring-context-3.0.xsd&quot;\">http:\/\/www.springframework.org\/schema\/context\/spring-context-3.0.xsd&quot;<\/a>&gt;    <\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;context:component-scan base-package=&quot;org.javaframework&quot;\/&gt;    <\/p>\n<p>&lt;\/beans&gt;<\/p>\n<p>Essa tag ir\u00e1 indicar ao Spring para procurar as classes e fazer a configura\u00e7\u00e3o dos beans. O atributo base-package indica em qual pacote as classes devem ser lidas, podem ser especificados quantos pacotes desejar, separados por v\u00edrgula. <\/p>\n<p>Com essa tag, podemos alterar o applicationContext.xml da aplica\u00e7\u00e3o exemplo que criamos, retirando as declara\u00e7\u00f5es dos beans. O arquivo applicationContext.xml fica da seguinte forma:<\/p>\n<p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;   <br \/>&lt;beans xmlns=&quot;<a href=\"http:\/\/www.springframework.org\/schema\/beans&quot;\">http:\/\/www.springframework.org\/schema\/beans&quot;<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160; xmlns:xsi=&quot;<a href=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;\">http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160; xmlns:context=&quot;<a href=\"http:\/\/www.springframework.org\/schema\/context&quot;\">http:\/\/www.springframework.org\/schema\/context&quot;<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160; xsi:schemaLocation=&quot;<a href=\"http:\/\/www.springframework.org\/schema\/beans\">http:\/\/www.springframework.org\/schema\/beans<\/a>&#160;<a href=\"http:\/\/www.springframework.org\/schema\/beans\/spring-beans-3.0.xsd\">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; http:\/\/www.springframework.org\/schema\/beans\/spring-beans-3.0.xsd<\/a>    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href=\"http:\/\/www.springframework.org\/schema\/context\">http:\/\/www.springframework.org\/schema\/context<\/a>&#160;<a href=\"http:\/\/www.springframework.org\/schema\/context\/spring-context-3.0.xsd&quot;\">     <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; http:\/\/www.springframework.org\/schema\/context\/spring-context-3.0.xsd&quot;<\/a>&gt;    <\/p>\n<p>&#160;&#160;&#160; &lt;context:annotation-config\/&gt;    <br \/>&#160;&#160;&#160; &lt;context:component-scan base-package=&quot;org.javaframework&quot;\/&gt; <\/p>\n<p>&lt;\/beans&gt;<\/p>\n<p>As classes devem ter alguma anota\u00e7\u00e3o que indique que s\u00e3o componentes, utilizamos a anota\u00e7\u00e3o @Service<\/p>\n<p><font size=\"2\" face=\"Courier New\"><strong>package<\/strong> org.javaframework.spring; <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\"><strong>import<\/strong> javax.annotation.PostConstruct; <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\"><strong>import<\/strong> org.springframework.beans.factory.annotation.Autowired;      <br \/><strong>import<\/strong> org.springframework.stereotype.Service; <\/font><\/p>\n<p><font size=\"2\"><font face=\"Courier New\"><strong><font color=\"#0000ff\">@Service           <br \/><\/font>public class<\/strong> MostraInformacoesSistema { <\/font><\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\">&#160;&#160;&#160; @Autowired     <br \/>&#160;&#160;&#160; Sistema sistema;      <\/p>\n<p>&#160;&#160;&#160; @PostConstruct      <br \/>&#160;&#160;&#160; <strong>public void<\/strong> mostraInformacoes(){      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;Sistema: &quot;+sistema.getNome()      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <\/font><font size=\"2\" face=\"Courier New\">+&quot;, vers\u00e3o: &quot;+sistema.getVersao());     <br \/>&#160;&#160;&#160; }      <br \/>}<\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\"><strong>package<\/strong> org.javaframework.spring; <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\"><strong>import<\/strong> org.springframework.beans.factory.annotation.Value;      <br \/><strong>import<\/strong> org.springframework.stereotype.Service; <\/font><\/p>\n<p><font size=\"2\"><font face=\"Courier New\"><strong><font color=\"#0000ff\">@Service<\/font><\/strong>        <br \/><strong>public class<\/strong> Sistema { <\/font><\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\">&#160;&#160;&#160; @Value(&quot;Spring com annotations&quot;)     <br \/>&#160;&#160;&#160; String nome;      <\/p>\n<p>&#160;&#160;&#160; @Value(&quot;1.0&quot;)      <br \/>&#160;&#160;&#160; String versao;      <\/p>\n<p>&#160;&#160;&#160; <strong>public<\/strong> String getNome() {      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return nome;      <br \/>&#160;&#160;&#160; }      <br \/>&#160;&#160;&#160; <strong>public<\/strong> String getVersao() {      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return versao;      <br \/>&#160;&#160;&#160; }      <br \/>&#160;&#160;&#160; <strong>public void<\/strong> setNome(String nome) {      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.nome = nome;      <br \/>&#160;&#160;&#160; }      <br \/>&#160;&#160;&#160; <strong>public void<\/strong> setVersao(String telefone) {      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.versao = telefone;      <br \/>&#160;&#160;&#160; }      <br \/>}<\/font><\/p>\n<p>Agora, basta criar as classes e utilizar as anota\u00e7\u00f5es para fazer a configura\u00e7\u00e3o, contando que as classes estejam no pacote definido em base-package elas ser\u00e3o detectadas e configuradas automaticamente, sem a necessidade de interven\u00e7\u00e3o no XML de configura\u00e7\u00e3o do Spring.<\/p>\n<p>Mais informa\u00e7\u00f5es sobre o classpath scanning podem ser obtidas na documenta\u00e7\u00e3o do Spring, se\u00e7\u00e3o <a href=\"http:\/\/static.springsource.org\/spring\/docs\/3.0.x\/spring-framework-reference\/html\/beans.html#beans-classpath-scanning\" target=\"_blank\">3.10 Classpath Scanning and Managed Components<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoje, \u00e9 muito comum frameworks configur\u00e1veis atrav\u00e9s de annotations. O Spring tamb\u00e9m possui esse estilo de configura\u00e7\u00e3o que \u00e9 bastante pr\u00e1tico e traz produtividade ao desenvolvimento. Voc\u00ea poder\u00e1 inclusive misturar configura\u00e7\u00e3o via XML e Annotations e utilizar qual for mais adequada para cada situa\u00e7\u00e3o. Nesse tutorial mostraremos como a configura\u00e7\u00e3o pode ser feita atrav\u00e9s de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[12,11,10,4,6,9],"class_list":["post-13","post","type-post","status-publish","format-standard","hentry","category-tutoriais","tag-annotations","tag-bean","tag-configuracao","tag-framework","tag-jee","tag-spring"],"_links":{"self":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts\/13","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/comments?post=13"}],"version-history":[{"count":3,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts\/13\/revisions"}],"predecessor-version":[{"id":16,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts\/13\/revisions\/16"}],"wp:attachment":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/media?parent=13"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/categories?post=13"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/tags?post=13"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}