类新实例上的春季@Autowired

我对Spring不太熟悉,我有以下情况:

存储库类:

@Repository
public class MyRepository {
    // ...
}

使用存储库类的类:

public class MyClass extends AbstractClass {

    @Autowired
    private MyRepository myRepository;

    //...
}

我知道,如果我用注释我的,并用一个,那么解决就好了。问题是我处于需要通过反思创建新的实例的情况。因此永远不会解决,并且始终为 null。MyClass@Component@Autowired@AutowiredMyRepositoryMyClassMyRepository

有没有办法在这种情况下使用@Autowired

更好地解释我的情况:我有一些.在应用程序的设置阶段,我创建了其中一个实现。基本上:AbstractClassHashMap

{"MyClass", MyClass.class}
//...

然后我有一个映射到url的泛型使用,上面的和反射,我能够基于给定的(这部分很重要)创建一个类的实例。你们认为有更好的方法来做到这一点吗?Controller/{class}?options=...{class}@PathVariableHashMapoptions

提前致谢


答案 1

Spring本身提供了一些功能,用于在您创建的对象中进行自动布线, 或者其他什么。newnewInstance()

要使用它,您需要一个AutowireCapableBeanFactory,您可以通过Spring的正常依赖注入获得。@Autowired

@Autowired
private  AutowireCapableBeanFactory autowireCapableBeanFactory;

然后,使用其 autowireBean(Object) 方法将属性注入到 Bean 中。@Autowired

Object myBean = map.get(className).newInstance();
autowireCapableBeanFactory.autowireBean(myBean);

设计说明:

如果您真的需要上述方法,请仔细考虑。AutowireCapableBeanFactory的javadoc建议不要在大多数用例中使用此接口:

BeanFactory 的这个子接口并不意味着在正常的应用程序代码中使用:坚持或用于典型用例。BeanFactoryListableBeanFactory

其他框架的集成代码可以利用此接口来连接和填充Spring无法控制其生命周期的现有Bean实例。例如,这对于 WebWork Actions 和 Tapestry Page 对象特别有用。


答案 2

您可以在此处使用工厂设计模式

这在开始时可能看起来有点复杂,但我相信您在实现它之后会喜欢它。

步骤:

  1. 在抽象类的所有实现上添加@Component。
  2. 将工厂类创建为:

    @Component
    public class MyFactory {
    
        private final Map<String, AbstractClass> impletationMap = new HashMap<>();
    
        @Autowired
        ApplicationContext context;
    
        @PostConstruct
        public void initialize() {
            populateDataMapperMap(context.getBeansOfType(AbstractClass.class).values().iterator());
        }
    
        private void populateDataMapperMap(final Iterator<AbstractClass> classIterator) {
            while (classIterator.hasNext()) {
                AbstractClass abstractClassImpl = (AbstractClass) classIterator.next();
                impletationMap.put(abstractClassImpl.getClass().getName(), abstractClassImpl);
    
            }
        }
    }
    

当这个MyFactory类的Bean被初始化时,它将查找抽象类类型的所有Bean,并将它们放在HashMap(implementationMap)中。

现在,从这个工厂,您可以获取HashMap,然后在需要时获取实现。当您添加抽象类的新实现时,这将非常容易,因为工厂将负责它。


推荐