Java Spring自己从众多接口实现中挑选一个接口实现?
下面的朋友是我的代码,我正在尝试用Spring运行依赖注入 我有一个接口,该接口的两个类实现 一个bean.xml和一个主方法类 接口IWriter.javaJava Spring自己从众多接口实现中挑选一个接口实现?,java,spring,spring-mvc,Java,Spring,Spring Mvc,下面的朋友是我的代码,我正在尝试用Spring运行依赖注入 我有一个接口,该接口的两个类实现 一个bean.xml和一个主方法类 接口IWriter.java package DI; public interface IWriter { public void writer(String s); } package DI; import org.springframework.stereotype.Service; @Service
package DI;
public interface IWriter {
public void writer(String s);
}
package DI;
import org.springframework.stereotype.Service;
@Service
public class Writer implements IWriter {
public void writer (String s){
System.out.println(s);
}
}
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);
}
}
package DI;
import org.springframework.stereotype.Service;
@Service("writer")
public class Writer implements IWriter {
public void writer (String s){
System.out.println(s);
}
}
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);
}
}
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);
}
}
Class Writer.java
package DI;
public interface IWriter {
public void writer(String s);
}
package DI;
import org.springframework.stereotype.Service;
@Service
public class Writer implements IWriter {
public void writer (String s){
System.out.println(s);
}
}
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);
}
}
package DI;
import org.springframework.stereotype.Service;
@Service("writer")
public class Writer implements IWriter {
public void writer (String s){
System.out.println(s);
}
}
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);
}
}
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);
}
}
类niceswriter.java
package DI;
public interface IWriter {
public void writer(String s);
}
package DI;
import org.springframework.stereotype.Service;
@Service
public class Writer implements IWriter {
public void writer (String s){
System.out.println(s);
}
}
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);
}
}
package DI;
import org.springframework.stereotype.Service;
@Service("writer")
public class Writer implements IWriter {
public void writer (String s){
System.out.println(s);
}
}
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);
}
}
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);
}
}
另一类
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);
}
}
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);
}
}
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);
}
}
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>
当我运行代码时,Spring容器给出Writer.java类方法的输出。我还没有指定要选择哪个实现。当有多个接口的实现,并且您使用@Autowired时,Spring如何选择Writer.java的实现???,在这种情况下,Spring绑定任何一个类。但是如果您想自动连接特定的实现,那么可以使用
@Qualifier( "<implementing class name>" )
@限定符(“”)
关于春天你必须知道的几件事是
- 所有Springbean都是被管理的——它们“活”在一个称为“应用程序上下文”的容器中
- 每个应用程序都有一个指向该上下文的入口点。此外,还有一个应用程序上下文是引导的,所有bean都是自动连接的。在web应用程序中,这可以是启动侦听器
通过将一个bean的实例放置到另一个bean实例中所需的字段中来实现自动连接。这两个类都应该是bean,也就是说,它们应该被定义为存在于应用程序上下文中。如下更改代码 Class Writer.java
package DI;
public interface IWriter {
public void writer(String s);
}
package DI;
import org.springframework.stereotype.Service;
@Service
public class Writer implements IWriter {
public void writer (String s){
System.out.println(s);
}
}
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);
}
}
package DI;
import org.springframework.stereotype.Service;
@Service("writer")
public class Writer implements IWriter {
public void writer (String s){
System.out.println(s);
}
}
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);
}
}
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);
}
}
类niceswriter.java
package DI;
public interface IWriter {
public void writer(String s);
}
package DI;
import org.springframework.stereotype.Service;
@Service
public class Writer implements IWriter {
public void writer (String s){
System.out.println(s);
}
}
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);
}
}
package DI;
import org.springframework.stereotype.Service;
@Service("writer")
public class Writer implements IWriter {
public void writer (String s){
System.out.println(s);
}
}
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);
}
}
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);
}
}
另一类
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);
}
}
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);
}
}
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);
}
}
试试这个
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);
}
}
类niceswriter.java
package DI;
public interface IWriter {
public void writer(String s);
}
package DI;
import org.springframework.stereotype.Service;
@Service
public class Writer implements IWriter {
public void writer (String s){
System.out.println(s);
}
}
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);
}
}
package DI;
import org.springframework.stereotype.Service;
@Service("writer")
public class Writer implements IWriter {
public void writer (String s){
System.out.println(s);
}
}
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);
}
}
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);
}
}
另一类
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);
}
}
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);
}
}
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);
}
}
这取决于用例,您可以使用spring概要文件、自定义注释或其他答案中提到的使用@Qualifier(按名称注入)来选择接口的实现,这相当于JSR-330的@Named annotation我想使用
application.properties
显示另一个选项
好处:
- 添加/更改接口的实现时,不需要更改代码
- 与单元测试和其他环境配合良好
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
@Service
@ConditionalOnProperty(value = "writer.type", havingValue = "default")
public class Writer implements IWriter {
@Override
public void writer(String s) {
System.out.println("The string is " + s);
}
}
及
当application.properties
包含writer.type=nice
NiceWriter时,将为IWriter接口实例化NiceWriter
除此之外,还有其他选项,如,.在提交前格式化代码,以提高可读性和理解性。我将记住有关代码格式的信息。无论如何,谢谢你的回复。在发布问题之前,代码应该格式良好。谢谢你的回答!我需要根据不同的环境(例如,模拟/存根测试/非生产环境中的一些应用程序方面)+可扩展性来控制所使用的实现。对于这个用例,我认为这种方法最适合。我马上测试一下。