使用@Autowired批量注入某一个接口下边的所有实现类方法(并且进行工厂封装Factory)

使用@Autowired批量注入某一个接口下边的所有实现类方法

首先要知道@AutoWired的作用

Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。
从所属范围来看,Autowired 属于spring的容器配置的一个注解,与它同属容器配置的注解还有:@Required,@Primary, @Qualifier等等。因此@Autowired注解是一个用于容器(container)配置的注解。其次从字面意思来看,@autowired注解来源于英文单词autowire是自动装配的意思,指的一些工业上的用机器代替人口,自动将一些需要完成的组装任务,或者别的一些任务完成。而在spring中,自动装配指的就是使用将Spring容器中的bean自动的和我们需要这个bean的类组装在一起。

实例测试

接下来写一个实例来进行验证

1,创建接口

public interface TestService{
	//获取实现类详情 在工厂中会根据此方法返回值作为map的key,在要使用某一个具体实现类时,根据key来获取对应的实现类
	Stirng getType();
	//执行业务
	String getInfo(String message);
}

2.创建两个实现类

//创建实现类一
@Service
public class TestServiceImplOne implements TestService{
	//实现接口
	Stirng getType(){
		System.out.print('1');
	}
	//实现接口
	String getInfo(String message){
		System.out.print("实现类1实现了:"+message);
	}
}
//创建实现类二
@Service
public class TestServiceImplOne implements TestService{
	//实现接口
	Stirng getType(){
		System.out.print('1');
	}
	//实现接口
	String getInfo(String message){
		System.out.print("实现类2实现了:"+message);
	}
}

3.创建加载实现类的工厂

@Component
public class TestServiceImplFactory{

@AutoWired
//使用注解注入,要注入的list泛型是接口而不是下边实现类,这样就会自动把次接口下的实现类都注入到list中
private List<TestService> serviceList;

//创建hashMap来保存这些实现类,并且调用实现类的getType方法作为key,具体实现类为value(因为spring的BeanFactory时单例模式,所以不用担心会重复创建实现类,实际就是一个引用)
//在外面就可以通过key来获取到对应的实现类,进行不同的动作
private HashMap<String,TestService> serviceMap=new HashMap<>();

@PostConstruct //在项目构建完成时,执行此方法 进行map的赋值
public void init(){
	//遍历实现类集合,根据循环到的实现类的getType()方法作为key,循环到的实现类zuoweuvalue,方便根据key取到对应实现类
	serciceList.stream.forEach(a ->{
		serviceMap.put(a.getType(),a);
	})
}

//提供对外的方法,可以通过key取到实现类
public TestService getTestServiceImplByType(String type){
	return serviceMap.get(type);
}

}

至此,方法结束

你可能感兴趣的:(java,spring,spring,boot)