1. Injeção de dependência (DI)
A injeção de dependência parece muito profunda, mas na verdade é: atribuir valores aos atributos. Existem dois métodos no total. O primeiro está na forma de parâmetros do construtor, e o outro está na forma do método de configuração.
1 injeção de construtor
1 injeção usando o construtor
Método de injeção usando XML
A. Ordem dos parâmetros
<construtor-arg index = "0"> <value> zhang san </value> </construtor-arg>
<Construtor-Arg Index = "1"> <Value> 56 </value> </structor-arg>
B. Tipo de parâmetro
<construtor-arg type = "java.lang.integer"> <Value> 56 </value> </structor-arg>
<construtor-arg type = "java.lang.string"> <Value> zhang san </value> </construtor-arg>
Exemplos específicos
Se você deseja injetar parâmetros em uma aula de pessoa agora, o aluno é outra aula.
public class Pessoa {private String pid; nome de string privado; estudante particular estudante; Pessoa pública (String PID, aluno do aluno) {this.pid = pid; this.student = aluno; } public pessoa (string pid, nome da string) {this.pid = pid; this.name = nome; }}Configure o ApplicationContext.xml. Se nenhuma configuração de parâmetro for executada, um erro será relatado e o construtor correspondente não poderá ser encontrado. Se os parâmetros correspondentes estiverem configurados, o construtor correspondente deverá ser declarado na classe.
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.xsd"> <bean id = "pessoa"> <! O índice de um construtor em classe pessoal é a marca de ângulo do parâmetro. O valor do tipo do parâmetro. Se for uma propriedade básica, use esta tarefa ref para consultar o tipo Atribuir-> <construtor-arg index = "0" type = "java.lang.string" value = "aaa"> </tirctor-arg> <Constructor-arg index = "1" ref = "Student"> </constructor-erg> </bide value = "1"> </propriedade> </bean> <bean id = "student"> </shean> </ Beans>
Escreva a classe de teste DixmlConstructorTest e execute a depuração do ponto de interrupção. Você descobrirá que, de acordo com os parâmetros de configuração, o construtor inserido é a pessoa (String PID, estudante de estudante)
public class DixmlConstructorTest {@Test public void test1 () {ApplicationContext context = new ClassPathXMLApplicationContext ("ApplicationContext.xml"); Pessoa pessoa = (pessoa) context.getBean ("pessoa"); }}2 injeção usando o método do setter de propriedade
Método de injeção usando XML:
A. Injeção de feijão simples simples inclui dois tipos: tipo de embalagem e string
<bean id = "perseverService"> <!-tipo básico, tipo string-> <propriedade name = "idade" value = "20"> </property> <propriedade name = "name" value = "zhang wuji"> </propriedade> </bean>
B. Cite outros feijões
<bean id = "pessoa" /> <bean id = "persenservice"> <propriedade name = "pessoa" ref = "pessoa" /> </shean>
1.1 Coleção da lista de montagem
<propriedade name = "lists"> <list> <value> LIST1 </value> <Value> LIST2 </value> <ref bean = "pessoa"/> </list> </oiltery>
1.2 Coleção de conjunto de montagem
<Property name = "Sets"> <Set> <Value> LIST1 </Value> <Value> LIST2 </value> <ref bean = "pessoa"/> </set> </propriedade>
1.3 Mapa de montagem
<Propriedade name = "maps"> <pap> <Entrada key = "01"> <Value> map01 </value> </entradas> <Entrada key = "02"> <Value> map02 </value> </st Entry> </pap> </operation>
O valor de <Entrada> no mapa é o mesmo que o <List> e <Set>, que pode criar qualquer elemento de atributo válido. Deve -se notar que o valor da chave deve ser string.
1.4 Propriedades de montagem
<propriedade name = "props"> <ports> <props key = "01"> prop1 </pp> <prop
Exemplos específicos
1. Crie dois objetos, pessoa e estudante
pacote xgp.spring.demo; importar java.util.list; importar java.util.map; importar java.util.properties; importar java.util.set; public class Person {private string pid; nome de string privado; estudante particular estudante; listas de listas privadas; Conjuntos privados; mapa privado mapa; Propriedades de propriedades privadas; objeto privado [] objetos; public Person () {System.out.println ("Nova pessoa"); } // omita métodos getter e setter} pacote xgp.spring.demo; public class Student {public Student () {System.out.println ("New Student"); } public void diz () {System.out.println ("Student"); }}Configure o arquivo ApplicationContext.xml
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- Put person and student in spring container property used to describe the property value of the Person class If it is a general property, use value to assign ref. Se a propriedade for um tipo de referência, use ref para atribuir valor-> <bean id = "pessoa" init-method = "init" lazy-init = "true"> <propriedade name = "pid" value = "1"> </property> <propriedades name = "name" value = "wang ermazi"> </propriedade> <names> lister "student" <bent = ""> ">"> ">"> <value>list2</value> <ref bean="student"/> </property> <property name="sets"> <set> <value>set1</value> <value>set2</value> <ref bean="student"/> </set> </property> <property name="map"> <map> <entry key="entry1"> <value>map1</value> </entry> <entry key="entry2"> <ref bean = "aluno"/> </st Entry> </pap> </property> <propriedade name = "Propriedades"> <Dors> <!-Nenhum tipo de referência necessário-> <prop1 key = "prop1"> prop1 </prop> <propra key = "prop2"> prop2 </prop> </props> </propriedade> <weene name = "objects> <tist> </propriedade> </ Bean> <bean id = "student"> </shean> </ Beans>
Escreva uma classe de teste DixmlSetterTest
pacote xgp.spring.test; importar org.junit.test; importar org.springframework.context.applicationContext; importar org.springframework.context.support.classPathXMLApplicationContext; Import XGP.SPring.Demo.Person; 1. O que o contêiner de primavera faz? (1) Inicie o contêiner de mola* (2) Crie um objeto para os dois grãos de pessoa e estudante* (3) Analise o atributo de nome da propriedade, consulte o método do setter, analise os atributos* valor ou ref da propriedade, passe parâmetros ao método do setter e use a tecnologia de reflexão para atribuir valores ao objeto. * (4) Extraia o objeto do contêiner de mola e chame o método do objeto. * 2. Qual é a ordem de execução dos recipientes de mola? */ @Test public void test1 () {ApplicationContext context = new ClassPathXMLApplicationContext ("ApplicationContext.xml"); Pessoa pessoa = (pessoa) context.getBean ("pessoa"); System.out.println (PERSON.GETPID ()); System.out.println (Person.getName ()); System.out.println (PERSON.GETLISTS ()); System.out.println (PERSON.GETSETS ()); System.out.println (Person.getMap ()); System.out.println (Pessoas.getObjects (). Length); }}/*1 wang wu [list1, list2, xgp.spring.demo.student@76a9b9c] [set1, set2, xgp.spring.demo.student@76a9b9c] {entrada1 = map1, entrada2 = map2} 2*// A ordem de execução dos recipientes de mola
1. Todos são configurações padrão
2.
3. Pessoa definida (preguiçoso-init = true)
Resumir
Existem dois métodos para injetar parâmetros. O construtor precisa escrever o construtor correspondente, o setter precisa gerar o método do setter correspondente e o construtor padrão está gravado.
2.5 O significado do COI e DI
Depois de aprender isso, qual é o significado de descobri -lo? Vamos escrever um exemplo de um sistema de gerenciamento de documentos para ilustrar os requisitos. Veja a figura abaixo
1. Escreva a interface do documento
documento de interface pública {public void read (); public void write ();}2. Escreva classes de implementação WordDocument, ExcelDocument, PDFDocument
public class WordDocument implementa o documento {public void read () {System.out.println ("palavra leitura"); } public void write () {System.out.println ("word write"); }}3. Escreva um sistema de documentador
public class DocumentManager {Documento privado do documento; public void setDocument (documento documento) {this.document = document; } public documentManager () {} public documentManager (documento documento) {super (); this.document = document; } public void read () {this.document.read (); } public void write () {this.document.write (); }}4. Escreva uma classe de teste DocumentTest
/*** Usando IOC e DI, você pode obter programação completa orientada para interface** /public class DocumentTest { /*** Document Document = new WordDocument (); * Esta linha de código não é completamente orientada para a interface, porque uma classe específica aparece no lado direito do sinal igual*/ @test public void testDocument_nospring () {document Document = new WordDocument (); DocumentManager documentManager = new DocumentManager (document); documentManager.read (); documentManager.Write (); } /*** No lado do código, não sei quem implementa o documento. Isso é determinado pelo arquivo de configuração da mola * <bean id = "documentManager"> <!-Document é uma interface-> <propriedades name = "document"> <!-wordDocument é uma classe de implementação, atribuída à interface do documento-> <ref bEAN = "pdfdocument"/</propriedade> </bean> */ @ @ @) ClassPathXMLApplicationContext ("ApplicationContext.xml"); DocumentManager DocumentManager = (DocumentManager) Context.getBean ("DocumentManager"); documentManager.read (); documentManager.Write (); }}Pelo acima, podemos ver a diferença entre não aplicar a mola e a aplicação da mola
<!-DocumentManager, WordDocument, ExcelDocument, pdfdocument é colocado no recipiente de mola-> <bean id = "wordDocument"> </ Bean> <bean id = "ExcelDocument"> </bean> <Bean id = "pdfdocument"> </40i> <Bean> "PDFD" <!-Document é uma interface-> <propriedade name = "document"> <!-wordDocument é uma classe de implementação, atribuída à interface do documento-> <ref bean = "pdfdocument"/> </propriedade> </bean>
O uso da primavera requer apenas a configuração do objeto correspondente <ref bean = ""> no ApplicationContext, sem prestar atenção a classes de implementação específicas e implementar a programação completa orientada para a interface. É por isso que a primavera pode se integrar a tantas ferramentas.
2.6 Structs de simulação de instância MVC2
Descrição do requisito
Crie um diretório de projeto
codificação:
1. Crie uma camada DAO para estabelecer uma interface Persondao e implementar uma classe Persondaoimpl
interface pública persondao {public void savePerson ();} classe pública persondaoiMpl implementa Persondao {@Override public void SavePerson () {System.out.println ("Salvar pessoa"); }}2. Estabeleça uma camada de serviço, interface de persegurança e classe de implementação de PersenserviceImpl
interface pública PersmoService {public void savePerson ();} classe pública PersenserviceImpl implementa Persevice {Private Persondao Persondao; public void setPersondao (persondao persondao) {this.persondao = persondao; } @Override public void savePerson () {this.persondao.saveperson (); }}3. Crie ação, classe de personação
classe pública Personaction {PERSONSERVICE PERSONCIAL PERSONCIAL; public void setPerSoService (Persevice Persenservice) {this.personservice = Persenservice; } public void savePerson () {this.personservice.savePerson (); }}4. Configure o ApplicationContext.xml
<!-Coloque o serviço, DAO, classe de ação no recipiente de mola-> <bean id = "persondao"> </i bean> <bean id = "persenservice"> <propriedade name = "persondao"> <reffean = "persondao"/> </operty> </bean> <ban id = "Personaction"> </propriedade> </ Bean>
5. Escreva a classe de teste testmvc
classe pública mvctest {@test public void testmvc () {ApplicationContext context = new ClassPathXMLApplicationContext ("ApplicationContext.xml"); Personacte Personaction = (Personact) context.getBean ("Personaction"); Personact.SavePerson (); // Salvar pessoa}}O exemplo acima mostra claramente a programação orientada para interface da mola. A camada de serviço precisa apenas chamar a interface da camada DAO, mas não precisa prestar atenção à classe de implementação da camada DAO, e a ação só precisa chamar a interface do serviço, mas não precisa prestar atenção à classe de implementação do serviço.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.