2013-07-02 26 views
8

Bạn bè bên dưới là mã của tôi, tôi đang cố gắng chạy sự phụ thuộc Tiêm với SpringMùa xuân là chọn một giao diện thực hiện nhiều, một mình?

Tôi có một giao diện, hai triển khai lớp của giao diện đó.

One bean.xml và một lớp phương thức chính.

Interface IWriter.java

package DI; 
    public interface IWriter { 
    public void writer(String s); 
} 

Lớp Writer.java

 package DI; 

    import org.springframework.stereotype.Service; 

    @Service 
    public class Writer implements IWriter { 
     public void writer (String s){ 
      System.out.println(s); 
     } 
    } 

Lớp NiceWriter.java

package DI; 

import org.springframework.stereotype.Service; 

@Service 
public class NiceWriter implements IWriter { 
    public void writer (String s){ 
     System.out.println("The string is " + s); 
    } 
} 

lớp Một

package DI; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.stereotype.Service; 

@Service 
public class MySpringBeanWithDependency { 

    @Autowired 
    private IWriter writer; 

    public void run() { 
     String s = "This is my test"; 
     writer.writer(s); 
    } 
} 

Main.java

package DI; 

import org.springframework.beans.factory.BeanFactory; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

import DI.MySpringBeanWithDependency; 

public class Main { 
    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 
     BeanFactory factory = context; 
     MySpringBeanWithDependency test = (MySpringBeanWithDependency) factory.getBean("mySpringBeanWithDependency"); 
     test.run(); 
    } 
} 

bean.xml

  <?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-2.5.xsd 
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

     <context:component-scan base-package="DI" /> 

     </beans> 

Khi tôi chạy container đang mùa xuân mang đến cho đầu ra của phương pháp của lớp Writer.java. Tôi không có bất kỳ nơi nào được chỉ định thực hiện để chọn. Spring sẽ chọn cách thực hiện Writer.java như thế nào?

+0

Trước khi đăng câu hỏi, mã shuld được định dạng tốt –

Trả lời

4

thay đổi mã của bạn như sau.

Lớp Writer.java

package DI; 

    import org.springframework.stereotype.Service; 

    @Service("writer") 
    public class Writer implements IWriter { 
    public void writer (String s){ 
     System.out.println(s); 
    } 
    } 

Lớp NiceWriter.java

package DI; 

    import org.springframework.stereotype.Service; 

    @Service("niceWriter") 
    public class NiceWriter implements IWriter { 
    public void writer (String s){ 
    System.out.println("The string is " + s); 
    } 
    } 

Một lớp

 package DI; 

     import org.springframework.beans.factory.annotation.Autowired; 
     import org.springframework.beans.factory.annotation.Qualifier; 
     import org.springframework.stereotype.Service; 

     @Service 
     public class MySpringBeanWithDependency { 

    @Autowired 
    @Qualifier("writer")//if you need to autowire Writer service 
    private IWriter writer; 

    @Autowired 
    @Qualifier("niceWriter")//if you need to autowire NiceWriter service 
    private IWriter niceWriter 


     public void run() { 
     String s = "This is my test"; 
     writer.writer(s); 
     } 
    } 
+3

Format mã trước khi nộp cho readablity tốt hơn và hiểu –

+0

Tôi sẽ giữ trong tâm trí về định dạng mã. Anyways cảm ơn cho trả lời. – user2472968

10

Khi có nhiều triển khai giao diện và bạn sử dụng @Autowired trong trường hợp đó, mùa xuân ràng buộc bất kỳ lớp nào. nhưng nếu bạn muốn autowire thực hiện cụ thể sau đó bạn có thể sử dụng

@Qualifier("<implementing class name>") 

@Qualifier documentation

vài điều mà bạn phải biết về mùa xuân được

  • Tất cả đậu mùa xuân được quản lý - họ "sống" bên trong một vùng chứa, được gọi là "ngữ cảnh ứng dụng".
  • Mỗi ứng dụng có một điểm vào cho ngữ cảnh đó. Ngoài ra, có một nơi mà bối cảnh ứng dụng được bootstrapped và tất cả các bean - autowired. Trong các ứng dụng web, điều này có thể là một người nghe khởi động.

Tự động xảy ra bằng cách đặt một thể hiện của một bean vào trường mong muốn trong trường hợp của một bean khác. Cả hai lớp phải là hạt, nghĩa là chúng phải được định nghĩa để sống trong ngữ cảnh ứng dụng.

1

Hãy thử thế này.

Class Writer.java 

    package DI; 

    import org.springframework.stereotype.Service; 

    @Service("writer") 
    public class Writer implements IWriter { 
    public void writer (String s){ 
     System.out.println(s); 
    } 
    } 

Lớp NiceWriter.java

package DI; 

    import org.springframework.stereotype.Service; 

    @Service("niceWriter") 
    public class NiceWriter implements IWriter { 
    public void writer (String s){ 
    System.out.println("The string is " + s); 
    } 
    } 

Một lớp

 package DI; 

     import org.springframework.beans.factory.annotation.Autowired; 
     import org.springframework.beans.factory.annotation.Qualifier; 
     import org.springframework.stereotype.Service; 

     @Service 
     public class MySpringBeanWithDependency { 

    @Autowired 
    private IWriter writer; 

    @Autowired 
    private IWriter niceWriter 


     public void run() { 
     String s = "This is my test"; 
     writer.writer(s); 
     } 
    } 
Các vấn đề liên quan