@Autowired在类实例使用反射创建的类内部不起作用

时间:2019-03-02 14:24:03

标签: java spring spring-boot reflection

我正在创建Spring Boot应用程序。在此应用程序中,有一组逻辑类,此逻辑类实例使用反射创建(基于某些条件逻辑被更改,这就是我用来反射的原因)在辅助逻辑类中,我尝试自动装配存储库类,但它不起作用。该逻辑类使用@Component进行了注释,但无法正常工作。

有没有办法做到这一点。春天我使用反射来自动连接类,所以我自己使用反射后不知道,是否可以使用@Autowired。

代码:

interface ILogic{
    void saveUser();
    // set of methods
}

@Repository
interface ARepository extends JpaRepository<ARepository,Integer>{}

@Component
class ALogic implement ILogic{
    private final ARepository aRepository;
    private final BRepository bRepository;
    @Autowired
    public Alogic(ARepository aRepository, BRepository bRepository){
    // code stuff 
    }
    // implementation of methods in ILogic interface
} 

@Component
class BLogic implement ILogic{
    private final ARepository aRepository;
    private final BRepository bRepository;
    @Autowired
    public Alogic(ARepository aRepository, BRepository bRepository){
        // code stuff 
    }
    // implementation of methods in ILogic interface
}  

class CreateConstructor{
    public ILogic getLogicInstance(){
        // give logic class instance base on some condition
    }
}

@Service
class userService{

    CreateConstructor createConstructor= new CreateConstructor();
    public void saveUser(){
        createConstructor.getLogicInstance().saveUser();
    }
}

不是在Logic类内部创建存储库类实例。

编辑:

public ILogic getLogicInstance(String className) {
    try {
        String packageName = MultiTenantManager.currentTenant.get();//  this return required logic class included  package name. 
        Class<?> constructors = Class.forName("lk.example."+packageName+"."+className);
        return (ILogic) constructors.getConstructor().newInstance();
    } catch () {}
}

1 个答案:

答案 0 :(得分:2)

在您用new或通过反射创建的实例中,Spring无法注入任何东西。

执行所需操作的一种方法是从应用程序上下文中请求Bean,具体如下:


@Autowired 
private ApplicationContext applicationContext;

public void createUser(Class<?> beanClass) {
    ILogic logic = applicationContext.getBean(beanClass);
    logic.saveUser();
}