Spring AOP

3 respostas
Z

Boa noite pessoal,

Estou tentando implementar o trabalho com AOP do Spring, mas o seguinte erro é exibido quanto tento executar a aplicação:

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext). log4j:WARN Please initialize the log4j system properly. Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to br.com.springidol.bean.Usuario at br.com.springidol.app.UsuarioApp.main(UsuarioApp.java:20)

O xml com as declarações do Spring é o seguinte:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">


	<bean id="tipo" class="br.com.springidol.bean.Tipo" scope="prototype">
		<constructor-arg value="Cliente" />
	</bean>


	<bean id="usuarioTarget" class="br.com.springidol.bean.Usuario"
		autowire="byName" scope="prototype">
		<property name="nome" value="Wagner" />
	</bean>

	<bean id="audita" class="br.com.springidol.bean.Audita" />

	<bean id="auditadvice" class="br.com.springidol.bean.AuditaAdvice">
		<property name="audita" ref="audita" />
	</bean>

	<bean id="auditaAdvisor"
		class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
		<property name="advice" ref="auditadvice" />
		<property name="pattern" value=".*exibeNome" />
	</bean>

	<bean id="usuario" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="target" ref="usuarioTarget" />
		<property name="interceptorNames" value="auditaAdvisor" />
		<property name="proxyInterfaces" value="br.com.springidol.bean.exibicao" />
	</bean>

</beans>

A classe que executa a aplicação:

package br.com.springidol.app;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import br.com.springidol.bean.Usuario;


public class UsuarioApp {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-servlet.xml");
		
		Usuario u = (Usuario) ctx.getBean("usuario");
		
		u.exibeNome();
	
	}

}

A classe com a declaração dos métodos para execução aos métodos definidos como joinpoints é seguinte:

package br.com.springidol.bean;

public class Audita {

	public Audita() {
	}

	public void PrimeiroPonto() {
		System.out.println("Executado Primeiro Ponto...");
	}

	public void SegundoPonto() {
		System.out.println("Executado Segundo Ponto...");
	}

	public void TerceiroPonto() {
		System.out.println("Executado Terceiro Ponto...");
	}

}

A classe usuário:

package br.com.springidol.bean;

public class Usuario implements exibicao{

	private String nome;
	private Tipo tipo;

	public Usuario() {
	}

	public Usuario(String nome, Tipo tipo) {
		this.nome = nome;
		this.setTipo(tipo);
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public void setTipo(Tipo tipo) {
		this.tipo = tipo;
	}

	public Tipo getTipo() {
		return tipo;
	}

	public void inicializa() {
		System.out.println("Inicializado");
	}

	public void termina() {
		System.out.println("Terminado");
	}
	
	public void exibeNome(){
		System.out.println( this.nome);
	}
	
}

Não entendo porque é apresentado esse erro.

Alguém poderia me orientar?

Obrigado

3 Respostas

Z

Bom,

Para que estiver iniciando e possuir a mesma dúvida.

Eu estava errando no momento em que definia e utilizava o cast para a variável u como Usuario, sendo que o correto seria definir e utilizar o cast utilizando da interface definida para monitoramento do ponto em execução na classe, no caso a interface exibicao.

Então a classe que executa o programa fica da seguinte forma:

package br.com.springidol.app;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


import br.com.springidol.bean.exibicao;


public class UsuarioApp {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-servlet.xml");
		
		exibicao u = (exibicao) ctx.getBean("usuario");
		
		u.exibeNome();
	
	}

}

Lembrando que isso aqui são apenas códigos de estudo, por isso parece meio bagunçado rs.

Obrigado aos que quiseram ajudar e a mim mesmo que descobri pesquisando.

Z

Mas uma dúvida que surgiu foi a seguinte:

Sem utilizar autoproxying, eu devo criar uma interface para casa bean contendo a declaração de seus métodos getters e setters onde eu quiser utilizar AOP para recuperar os valores de propriedades?

Considerando que devo declarar uma bean no arquivo xml e outra que deve servir de proxy e que recupero por meio da interface.

Obrigado!

Z

Reposta para minha pergunta: autoproxing.
Eu participo bastante em minhas próprias dúvidas rs

Criado 1 de maio de 2010
Ultima resposta 2 de mai. de 2010
Respostas 3
Participantes 1