在具有CDI的Java EE平台中,能够注入POJO类的实例.以非常简单的方式,我们需要使用@Inject注释来注入某个接口的默认实例.我们也可以使用限定符为我们的领域注入具体的类.但这些解决方案相当静态.
我需要一些更具动力的注入模型.
让我来介绍一下我的问题:假设我们有接口Animal和三个实现该接口的类:Ant,Dog,Elephant.我想动态地注入这三个类中的一个的实例,它依赖于一些变量,如字符串(动物名称).在Java SE中我会这样做:
Map<String, Animal> animalMap = new HashMap<>();
animalMap.put("ant", new Ant());
animalMap.put("dog", new Dog());
animalMap.put("elephant", new Elephant());
...
String animalName = ...;
Animal animal = animalMap.get(animalMap);
animal.doSomething();
Run Code Online (Sandbox Code Playgroud)
所以我需要这样的东西:
class AnimalManager {
@Inject // ?
private Animal animal; // ?
public void run(String animalName) {
// based on animalName get new instance of animal and run doSomething()
...
animal.doSomething(); // if animalName is "ant" call the doSomething on Ant class
}
}
Run Code Online (Sandbox Code Playgroud)
在所有实现Animal接口的类中,我需要使用带有@EJB注释的变量.
在Java EE中最好和最正确的方法是什么?
编辑:
好的,基于Svetlin Zarev和hwellmann的回应(谢谢!)我创建了这个: …
我有8.7.0版本的GitLab平台,我目前正在设置CI部分.我创建了一个新的gitlab-runner,它使用shell作为执行器.问题是,在调用转轮来完成自己的工作之前,系统无法获取git更改.构建过程的控制台输出:
gitlab-ci-multi-runner 1.1.3 (a470667)
Using Shell executor...
Running on <my-page>...
Fetching changes...
warning: failed to remove <some-path>/localClassSetAnalysis.bin
warning: failed to remove <some-path>/localClassSetAnalysis.lock
...
gitlab-ci-multi-runner 1.1.3 (a470667)
Using Shell executor...
Running on <my-page>...
Cloning repository...
rm: cannot remove ‘path-to-some-directory>’: Permission denied
rm: cannot remove ‘path-to-some-directory>’: Permission denied
...
Run Code Online (Sandbox Code Playgroud)
存储文件的文件夹是/ home/gitlab-runner/builds所以我想,有两个用户:git和gitlab-runner,git用户无法删除或重写此目录中的文件.更改后,目录权限构建过程启动并成功完成,但之后文件再次具有旧权限(读取+写入用户(gitlab-runner)并读取其余的权限).所以现在我必须(最简单的方法)在构建之前始终从/ home/gitlab-runner/builds中删除所有内容,但当然这不是解决方案......我该怎么办?