Spring AOP

Boa noite pessoal,

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

[quote]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)[/quote]

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

[code]<?xml version="1.0" encoding="UTF-8"?>

<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>
[/code]

A classe que executa a aplicação:

[code]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();

}

}
[/code]

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

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:

[code]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();

}

}
[/code]

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.

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!

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