Dá para carregar o valor de uma annotation de arquivo de propriedade?

Ola,
Preciso definir qual objeto sera injetado pelo spring a partir de um arquivo de propriedade. Tem como? Há outra forma de fazer?

@Named(value="categoriaDaoB1")
public class CategoriaDaoB1 implements CategoriaDao {
...
}

@Named(value="categoriaDaoB2")
public class CategoriaDaoB2 implements CategoriaDao {
...
}

@ManagedBean
@RequestScoped
public class CategoriaController {
    
    @Resource(name="pegar este valor no arquivo de propriedade")
     private CategoriaDao dao;
     ...
}

A principio nao sei qual base de dados será utilizada. Entao eu preciso definir no arquivo de propriedades se B1 ou B2, para o Dao correto ser injetado. Tentei com ResourceBundle, mas nao deu certo.
Pode ser que tenha outra forma, mas nao sei.

public class CategoriaController {
    
    ResourceBunble rb = ResourceBundle.getBundle("arquivo.properties");
    @Resource(name="categoriaDao" + rb.getString("basededados");
     private CategoriaDao dao;
     ...
}

99% de chance de não ser possível, na minha opinião.

Mas, explica melhor, você vai ter 2 dao’s tipo UserDaoUm e UserDaoDois?

Com um pouco de criatividade, talvez dê. Mas acho que isso vai te dar um certo trabalho, porque as anotações só aceitam constantes. Por exemplo, isso compila:

public class TesteAnn {


	private static final String STRING_TESTE = "teste";
	
	@Resource(name=STRING_TESTE)
	public void metodo() {
		
	}
	
	
}

Mas isso não:

package teste;

import javax.annotation.Resource;

public class TesteAnn {


	private static final String STRING_TESTE;
	
	static {
		STRING_TESTE = "teste";
	}
	
	@Resource(name=STRING_TESTE)
	public void metodo() {
		
	}
	
	
}

Enfim, talvez você até consiga. Mas vai ter “bad smells” no seu código =/

[]s

[quote=romarcio]99% de chance de não ser possível, na minha opinião.

Mas, explica melhor, você vai ter 2 dao’s tipo UserDaoUm e UserDaoDois?
[/quote]

Eu tenho duas implementacoes do DAO para utilizar diferentes bases de dados onde as tabelas e atributos tem nomes diferentes. A aplicacao ja esta configurada para usar as duas bases de dados e as classes ja estao mapeadas para os dois bancos. Isto ja funciona. So que na hora de injetar o dao eu tenho que definir o @Resource com o nome do dao que vou injetar. Eu quero deixar o nome do banco num properties. Para na hora de rodar a aplicacao o arquivo ser lido e a injecao ser a que vou precisar. Se nao for assim teria que fazer uma POG na minha opiniao.

@Resource (name="categoriaDao1")
private CategoriaDao dao1;

@Resource (name="categoriaDao2")
private CategoriaDao dao2;

public String listar () {
    if (bundle.getString (database).equals ("banco1"))
        return dao1.listar ();
    else
        return dao2.listar ();
}

O que acho que daria para fazer é o seguinte. Coloca os dao’s em pacotes diferentes. tipo sua.aplicacao.dao.b1 e sua.aplicacao.dao.b2

Dai no arquivo de configuração do spring, quando setar a configuração de onde o spring vai ler as anotações, sete o pacote referente:

Ex banco 1:

<context:component-scan base-package="sua.aplicacao.dao.b1"/> <context:component-scan base-package="sua.aplicacao.service"/> <context:component-scan base-package="sua.aplicacao.controller"/>

Dai é só mudar a configuração no arquivo xml para acessar o banco 2:
Ex banco 2:

<context:component-scan base-package="sua.aplicacao.dao.b2"/> <context:component-scan base-package="sua.aplicacao.service"/> <context:component-scan base-package="sua.aplicacao.controller"/>

thimor,

Se estiver usando Spring, dê uma olhada no conceito de Environments dele. De qualquer forma, existem N maneiras mais elegantes de fazer o que você quer.

[]'s