@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{
}