Solon

@Component 与 @Service 的区别

对于类的注解,框架内部主要分有两大块:

  • 非动态代理类:
    • 主要由内核提供的:@Configuration、@Controller、@Remoting、@Component
    • 其中 @Controller、@Remoting 支持函数拦截
    • 支持 Graalvm Native 打包
  • 动态代理类:
    • 由 solon.aspect 提供的:@Service、@Dao、@Repository(它们仅是语义不同)
    • 支持函数可拦截
    • 不支持 Graalvm Native 打包

区别

@Service

  • 被动态代理,支持函数可拦截。例如支持:@Tran、@Cache 等借助函数拦截实现的能力
  • 但,不支持 Graalvm Native 打包

支持函数可拦截:

@Service
public class UserService{
    @Tran
    public void addUser(User user){
    
    }
}

@Component

  • 不支持函数可拦截
  • 支持 Graalvm Native 打包
  • 支持特定形态自动处理
  • 支持函数提取
  • 支持 Bean、BeanWrap 订阅

特定形态自动处理:Plugin、EventListener、Handler、Filter、LoadBalance.Factory。例:Handler 会自动注册到路由器

@Mapping("/hello")
@Component
public class DemoHandler implements Handler{
    public void handle(Context ctx) throws Throwable{
        
    }
}

函数提取:通过 aopContext.beanExtractorAdd(XxlJob.class, new XxlJobExtractor()) 直接提取组件的 @XxlJob 函数

@Component
public class DemoJob{
    @XxlJob
    public void job1() throws Throwable{
        
    }
}

Bean、BeanWrap 订阅:(订阅,也支持 @Configuration + @Bean 产生的)

//通过订阅获取多个 IXxx 实现的组件或Bean(要在容器扫描前,提前订阅)
aopContext.subBeansOfType(IXxx.class, bean->{

});

@Component
public class DemoBean1 implements IXxx{
    
}

@Component
public class DemoBean2 implements IXxx{
    
}