Spring: injetando ApplicationContext por anotação

11 respostas
C

alguem sabe ou jah viu e poderia postar aki no forum como eu faria uma classe minha q precisa extender a interface ApplicationContextAware, e com isso eu preciso tb implementar 2 metodos q vêm com essa interface, antes e depois de carregar o contexto do spring, teria como eu fazer isso sem precisar implententar esta interface!?

usando anotações!? :smiley:

desde jah agradeço!! :slight_smile:

11 Respostas

U

applicationContextAware só tem um metodo, o setApplicationContext,
o que tem dois metodos é beanFactoryPostProcessor

mas só tem esta forma, nao tem suporte para anotações pra isto ainda …

se tu cadastrar um request no site do spring-annotation da pra incluir isto no proximo release
https://spring-annotation.dev.java.net

C

putz fiz uma salada, e akbei falando de mais… ou ateh msm de menos… ehhehehe

eu tenho uma classe q eu implementei a interface BeanPostProcessor do spring, para q meu bean do spring seja carregado e tb como eu implemento a interface ApplicationContextAware para q seja feita a injeção do meu applicationcontext…
mas keria fazer essa classe sem ter q implementar a interface BeanPostProcessor e redefinir os métodos

postProcessAfterInitialization
postProcessBeforeInitialization

ahhh e tb precisei declarar meu bean no meu arquivo de xml de configuração do spring…

teria como aop eu carregar esse bean sem implementar tal interface(BeanPostProcessor) e por anotação ou outra tecnica q exista!?

desde jah agradeço!! :slight_smile:

U

seguinte, para carregar beans no contexto do spring sem XML tu pode dar uma olhada no https://spring-annotation.dev.java.net
Para injetar um application context a unica solução é usando applicationContextAware
para pos processar todos os beans da bean factory antes e depois das propriedades setadas a unica forma é implementando beanPostProcessor
agora se tu só quer um metodo de inicialização e finalização do teu bean é só configurar o init-method e destroy-method, ou se tu estiver utilizando o Spring-Annotation @PostCreate e @PreDestroy

mais informações no site do projeto ou no meu blog.

F

Ola,

Para que voce precisa disso? Dizend a necessidade talvez fique mais facil pensarmos em algo.

]['s

C

to com um erro agora mto estranho :confused:

peguei o jar spring-annotation-base-1.0.01.jar

e fiz uma classe…
usando a anotação @Bean

@Bean(name="daoFormulario")
public class FormularioDAOImpl implements FormularioDAO {

}

depois fiz outra classe, sem a anotação

public DAO getDao(Class classePersistente) throws DAOFactoryException {

}

e configurei meu spring-config-dao.xml da seguinte mandeira…
&lt?xml version=“1.0” encoding=“UTF-8”?&gt
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sa="https://spring-annotation.dev.java.net/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
https://spring-annotation.dev.java.net/context https://spring-annotation.dev.java.net/context.xsd"
default-autowire=“byName”>

&lt;import resource="classpath*:applicationContext.xml" /&gt;
&lt;sa:annotation-autoload /&gt;

&lt;bean id="carlos" class="br.ufscar.dc.posgraduacao.model.factory.DAOFactory"/&gt;

</beans>

como no exemplo do site aonde peguei o spring-annotation-base-1.0.01.jar

e fiz uma classe de teste

public static void main(String[] args) {
		/*ClassPathXmlApplicationContext appctx = new ClassPathXmlApplicationContext("/spring-config-dao.xml");
		new XmlBeanFactory(new ResourceMapFactoryBean())
		*/
		Resource resource = new FileSystemResource("D:/java/ProjetoPosGraduacao/src/web/WEB-INF/config/spring/spring-config-dao.xml");
		BeanFactory appctx = new XmlBeanFactory(resource);
		DAOFactory f = (DAOFactory) appctx.getBean("carlos");
		System.out.println(f);
		FormularioDAOImpl m = (FormularioDAOImpl) appctx.getBean("daoFormulario");
		System.out.println(m);
	}

mas ao roda-la, aparece o seguinte erro…

DAOFactory@105738
log4j:WARN No appenders could be found for logger (org.springframework.core.CollectionFactory).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'daoFormulario' is defined
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:338)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:870)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:237)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:156)
	at br.ufscar.dc.posgraduacao.model.dao.toplink.TesteSpringAnnotation.main(TesteSpringAnnotation.java:23)

alguem saberia me dizer o pq meu arquivo xml naum tah carregando meu bean daoFormulario!? :shock:

desde jah agradeço toda ajuda q vcs têem me dado aki!! :slight_smile:

C

trokei a versão do jar do spring-annotation para a: spring-annotation-base-1.0.2.jar

e com isso surgiu um novo erro…

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from file [D:\java\ProjetoPosGraduacao\src\java\br\ufscar\dc\posgraduacao\teste\appContext.xml]; nested exception is java.lang.NoClassDefFoundError: javax/annotation/PreDestroy
Caused by: java.lang.NoClassDefFoundError: javax/annotation/PreDestroy
	at net.java.dev.springannotation.utils.BeanReader.register(BeanReader.java:557)
...

:frowning: :’(

U

a versão 1.0.2 usa o jar da JSR 250 (Commons-Annotations)
baixa ele daqui: http://maven1.glassfishwiki.org/javax.annotation/jars/jsr250-api-1.0.jar

o 1.0.1 ainda precisava de um arquivo to.properties na raiz do classpath onde deve ser scaneado se não me engano.

os teus .class estão em um diretório aberto ou em um .jar?

C

kra baixei a jsr 250
e com o spring-annotation 1.0.2 num programinha de teste funciono!! :slight_smile:

o q seria esse to.properties!? scanear o q!? naum entendi isso kra :frowning:

ahh e na minha aplicação web, naum funciono colocando a versão 1.0.2 e nem a jsr 250
aki eu empacoto os .class num .jar, tem q fazer alguma outra configuração!?

kra valeu msm pela ajuda!! :smiley:

U

para colocar os .class dentro de um .jar, tem que criar um arquivo to.properties na raiz do jar, assim o Spring-Annotation vai buscar as classes de dentro do jar também …
isto é para evitar que na hora de buscar as classes anotadas, seja necessário ler todos os jars do classpath, então só são lidos os jars que tem um arquivo to.properties na raiz.
se as classes estiverem em um diretório aberto ele busca automático …

C

fala ae urubatan,
kra fiz as alterações necessárias e agora funciono de boa…
foi soh coloca o to.properties no jar das minhas classes :stuck_out_tongue:

kra valeu msm a ajuda e a atenção!! :slight_smile:
abraços…

M

Olá, onde posso conseguir o spring-anotation 1.0.2, os links q fui, não estão funcionando!!

Criado 5 de dezembro de 2006
Ultima resposta 30 de out. de 2007
Respostas 11
Participantes 4