Skip to content

Latest commit

 

History

History
97 lines (71 loc) · 3.91 KB

File metadata and controls

97 lines (71 loc) · 3.91 KB

通过注解匹配不同的类

您可以在您的应用程序中使用RoleServiceComponent来获取符合用户角色的Service实例。例如,在YourClientClass中,您可以这样使用:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class YourClientClass {

    private final YourServiceInterface service;

    @Autowired
    public YourClientClass(RoleServiceComponent<YourServiceInterface> serviceComponent) {
        try {
            this.service = serviceComponent.getManagerService(YourServiceInterface.class);
        } catch (Throwable throwable) {
            throw new RuntimeException("Error initializing YourClientClass", throwable);
        }
    }

    public void doSomething() {
        service.doSomething();
    }
}

在YourClientClass中,通过构造函数注入RoleServiceComponent,然后在构造函数中调用getManagerService方法来获取合适的Service实例。请注意,在getManagerService方法中,我们将YourServiceInterface.class作为参数传递给泛型类型T,这样可以根据不同的Service接口来获取不同的Service实例。

现在,当YourClientClass被实例化时,它将根据当前用户角色动态选择相应的Service实例,并将其注入到service属性中。您可以通过调用doSomething方法来使用这个Service实例。

确保在使用RoleServiceComponent时,定义了合适的@AccountRoleClz注解,并根据实际需求进行适当的调整。如果还有其他问题,请随时提问。

首先,定义一个类RoleServiceComponent,其中AccountRoleClz就是一个Annotation如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class RoleServiceComponent {

    private final ApplicationContext context;

    @Autowired
    public RoleServiceComponent(ApplicationContext context) {
        this.context = context;
    }

    public <T> T getManagerService(Class<T> returnInterface) throws Throwable {
        String role = SessionUtils.getCurrentUser().getRole();
        return context.getBeansOfType(returnInterface)
                .values()
                .stream()
                .filter(service -> service.getClass().isAnnotationPresent(AccountRoleClz.class))
                .filter(service -> service.getClass().getAnnotation(AccountRoleClz.class).value().equals(role))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("No service found for role: " + role));
    }
}

在这个类中,我们使用了泛型方法 T getManagerService(Class returnInterface),它将返回类型作为泛型参数,并且使用returnInterface作为getBeansOfType的参数来获取指定类型的bean。

接下来,我们可以在YourClientClass中使用RoleServiceComponent来获取合适的Service实例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class YourClientClass {

    private final YourServiceInterface service;

    @Autowired
    public YourClientClass(RoleServiceComponent roleServiceComponent) {
        try {
            this.service = roleServiceComponent.getManagerService(YourServiceInterface.class);
        } catch (Throwable throwable) {
            throw new RuntimeException("Error initializing YourClientClass", throwable);
        }
    }

    public void doSomething() {
        service.doSomething();
    }
}

现在,YourClientClass不再需要泛型参数,而是直接将YourServiceInterface.class作为参数传递给roleServiceComponent.getManagerService方法,以获取符合用户角色的Service实例。

这样修改后,RoleServiceComponent的使用更加简洁,同时保持了与之前实现相同的动态Service选择功能。