Eu desconstruo como a primavera gerencia objetos java com um exemplo simples.
Primeiro, defina um pojo simples, o código é o seguinte:
pacote com.jvk.ken.spring; public class Demo {private string name; public Demo () {name = "I'm Demo.";} public void printName () {System.out.println (nome);} public void setName (string) {this.name = name;}}O arquivo de configuração da mola correspondente é o seguinte:
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/Context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd "> <bean id =" Demo "/> </ Beans>
O código de teste simples é o seguinte:
pacote com.jvk.ken.spring; importar org.springframework.beans.factory.beanfactory; importar org.springframework.beanS.factory.xml.xmlBeanFactory; importação org.springframework.core.io.classPathReSource; Public Class; {testspring ();} private static void testspring () lança exceção {beanfactory bf = new XMLBeanFactory (new ClassPathResource ("ApplicationContext.xml"); bf.getBean ("Demo"); System.out.println (bean.getclass ()); bean.printname ();}}Execute a classe de teste e produz as informações a seguir, indicando que um exemplo simples de primavera foi executado com sucesso.
2012-3-28 22:18:07 org.springframework.beans.factory.xml.xmlbeandEfinitionReader LoadBeanDefinitions Informações: Carregando definições de faanas xml do recurso de caminho do caminho.
A partir do código Java curto e do arquivo de configuração XML, podemos ver que o XMLBeanFactory monta Javabean lendo o arquivo de configuração XML e retorna o objeto necessário quando o usuário chama o método getBean. Para imitar seu comportamento, defino um beanfactory simples.
pacote com.jvk.ken.spring; importar java.util.hashmap; importar java.util.map; public class MyBeanFactory {// salvar a definição de mapa de feijão <string, classe> beans = new hashmap <string, classe,); public objeto getBean (string id) throwSexeCexeCexcal, ilegal, ilegal, ilegalfmap <string, class> (); public objeto getBean (string) beans.get (id) .NewInstance ();} String privada xmlfile; public myBeanFactory (string xmlfile) lança classeNotFoundException {super (); this.xmlfile = xmlfile; init ();} private void init () lança classNotFoundException {// Inicialize e analise XML, a análise real do XML é omitida aqui e use o código rígido para imitar system.out.printl ("Arquivo de Configuração:"+xmlfile); "com.jvk.ken.spring.demo"; classe <?> loadclass = this.getclass (). getClassLoader (). loadclass (className); beans.put ("demonstração", carga);}}}O código de teste é o seguinte:
pacote com.jvk.ken.spring; public class Test {public static void main (string [] args) lança exceção {testnotspring ();} private static void testNotspring () lança exceção {myBeanFactory bf = new MyBeanFactory ("ApplicationContext.XMLE"); Demo -Demo. bf.getBean ("Demo"); System.out.println (bean.getclass ()); bean.printname ();}}Após a execução, as seguintes informações são emitidas:
Arquivo de configuração: ApplicationContext.xml classe com.jvk.ken.spring.demo I'm Demo.
O código curto acima mostra como a primavera atua como a fábrica de feijão mais simples. Vamos ajustar o código um pouco abaixo para analisar o que acontece na primavera. Primeiro, altere o método de construção sem parâmetros da classe de demonstração para privado.
Demo () {name = "I'm Demo"; }A execução do código de teste revelou que não havia diferença nos resultados dos testes de primavera, mas meu MyBeanFactory personalizado relatou a seguinte mensagem de erro:
Exceção em thread "main" java.lang.illegalaccessException: classe com.jvk.ken.spring.myBeanFactory não pode acessar um membro da classe com.jvk.ken.spring.demo com modificadores "privado" em sun.reflect.reflection.EnsuremberMemberMabacts (reflexo "em javal. java.lang.class.newInstance0 (classe.java:349) em java.lang.class.newinstance (classe.java:308) em com.jvk.ken.spring.mybeanFactory.getBean (mybeanFactory.java:12) com.jvk.ken.spring.test.testnotspring (test.java:25) em com.jvk.ken.spring.test.main (test.java:9)
A primavera é tão mágica? Não, o código que escrevi é muito simples e pode ser executado diretamente com uma pequena modificação.
public Object getBean (string id) lança Exceção {classe classe1 = beans.get (id); Construtor declaradoConstructor = classe1.getDecLaredConstructor (); declararConstructor.setAccessible (true); retorno declaradoConstructor.NewInstance (); }O acima é o Javabean mais puro gerenciado pelo recipiente de mola. A primavera também suporta outro tipo de feijão, chamado Factory Bean, o exemplo é melhor que mil palavras, veja o código
pacote com.jvk.ken.spring; importar org.springframework.beans.Factory.FactoryBean; classe pública implementa a fábrica de fábrica {@Override public Object getObject () lança excepção {return {);@@@public class PublicTetType () {Return Demo.Cl; false;}}Depois de adicionar a classe Demofactory, modifique o arquivo de configuração da mola ao mesmo tempo
<bean id = "Demo" />
Os outros códigos não são modificados. Depois de executar o código de teste, os resultados da saída são exatamente os mesmos de antes. Por que a classe com.jvk.ken.spring.Demofactory com ID está configurada, mas o resultado retornado é uma instância de demonstração? Isso ocorre porque a primavera detecta que a discussão é um feijão especial que implementa a interface da fábrica. O método getObject será chamado antes de retornar o resultado, portanto o resultado final é o objeto de demonstração. Obviamente, se realmente precisamos obter o feijão da fábrica, podemos escrever BF.getbean ("& Demo") como este.
Resumir
O exposto acima é toda a explicação detalhada do código de criação de objetos de implementação da primavera, espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!