Quarkus中的依赖注入DI和面向切面aop编程
目录
- 前言
- JSR365:Java2.0的上下文和依赖注规范
- Bean声明和依赖注入
- Bean的生命周期
- 条件化初始Bean
- 面向切面编程aop
- Bean列表接口
- 结语
前言 做java开发的肯定清楚spring中的核心思想ioc和aop,ioc即控制反转的意思,di的核心思想和ioc一样,描述的也是同一个事情同一个思想,只是di的依赖注入更容易被理解了,aop即面向切面,如注解事务功能,就是基于aop的思想来实现的。Quarkus中也实现了一套非标准的cdi规范,下面就来看看Quarkus中的di和aop相关内容。
cdi规范协议:https://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#introduction
JSR 365:Java 2.0的上下文和依赖注规范 该规范定义了一组功能强大的补充服务,这些服务有助于改善应用程序代码的结构。
- 绑定到生命周期上下文的有状态对象的定义良好的生命周期,其中上下文集是可扩展的
- 复杂的类型安全的依赖项注入机制,包括在开发或部署时选择依赖项的能力,而无需进行冗长的配置
- 支持Java EE模块化和Java EE组件体系结构-解决Java EE组件之间的依赖关系时要考虑Java EE应用程序的模块化结构
- 与统一表达语言(EL)集成,允许在JSF或JSP页面中直接使用任何上下文对象
- 装饰注入对象的能力
- 通过类型安全的拦截器绑定将拦截器与对象相关联的能力
- 一个事件通知模型
- 除了Java Servlets规范定义的三个标准Web上下文之外的Web 对话上下文
- 允许便携式扩展与容器完美集成的SPI
Bean声明和依赖注入
/** * @author kl : http://kailing.pub * @version 1.0 * @date 2020/7/13 16:55 */@ApplicationScopedpublic class TestBean {@InjectBean1 bean1; }@ApplicationScopedclass Bean1 {String ping() {return "Bean1"; }}
在Quarkus中,可以使用@Dependent,@ApplicationScoped,@Singleton,@RequestScoped和@SessionScoped等CDI中定义的注解去声明一个Bean对象,支持 @Inject注解和构造函数注入一个Bean。默认情况下,本声明的Bean都是延迟加载的,在应用第一次接收请求时才会初始化这个bean,如果需要在应用程序启动时就加载Bean,需要在Bean上添加如下注解:
/** * @author kl : http://kailing.pub * @version 1.0 * @date 2020/7/13 16:55 */@ApplicationScoped@Startuppublic class TestBean {@InjectBean1 bean1; }
Bean的生命周期
@ApplicationScoped@Startuppublic class TestBean {@InjectBean1 bean1; @PostConstructprivate void init(){System.out.println("实例化后调用"); }@PreDestroyprivate void pre(){System.out.println("销毁前调用"); }void startup(@Observes StartupEvent event) {System.out.println("应用启动后调用"); }void stop(@Observes ShutdownEvent event) {System.out.println("应用关闭后调用"); }}
条件化初始Bean
/** * @author kl : http://kailing.pub * @version 1.0 * @date 2020/7/13 16:55 */@ApplicationScoped@Startuppublic class TestBean {@InjectBean1 bean1; }@Dependentclass BeanConfig{@Produces@IfBuildProperty(name = "quarkus.bean1.enabled", stringValue = "https://www.it610.com/article/true")private Bean1 bean1(){return new Bean1(); }}class Bean1 {String ping() {return "Bean1"; }}
如上,只有在配置文件中显示的配置quarkus.bean1.enabled=true时,才会激活Bean1的初始化
面向切面编程aop Quarkus中编写aop的程序和spring中类似,首先定义一个切点注解
@Inherited@InterceptorBinding@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface Logging {}
然后编写切面类
@Logging@Interceptor class LogInterceptor {private final Logger logger = LoggerFactory.getLogger(getClass()); @AroundInvokepublic Object logging(InvocationContext ic) throws Exception {logger.info("方法参数:{}", ic.getParameters().toString()); return ic.proceed(); }}
编写切面类时,只需要在切面类上将自定义的注解标注在类上即可,然后使用@AroundInvoke注解标注方法,被拦截到方法时,方法调用信息会自动注入到InvocationContext中。Quarkus中的aop没有spring中那么多的概念,只有环绕通知的使用方式。使用时,将自定义的注解标注在类或者方法上即可
Bean列表接口 Quarkus在本地开发时,会自动注册HTTP GET- /quarkus/arc/beans接口,返回所有Bean的列表
结语 以上,是Quarkus中依赖注入和面向切面的基本使用方式和技巧,虽然没有spring的功能那么多那么细分。但是基本的功能都已具备了
【Quarkus中的依赖注入DI和面向切面aop编程】以上就是Quarkus中的依赖注入DI和面向切面aop编程的详细内容,更多关于Quarkus中DI与aop编程的资料请关注脚本之家其它相关文章!
推荐阅读
- 举个栗子-Tableau|举个栗子~Tableau 技巧(219)(用浏览器提取 .twbx 文件中的形状)
- 『无为则无心』Python面向对象|『无为则无心』Python面向对象 — 47、Python中的self详解
- netty系列之:channel|netty系列之:channel,ServerChannel和netty中的实现
- git使用|git在项目管理中的最佳实践
- JavaScript|ES6中的map和reduce
- 爸爸妈妈眼中的爱情与亲情
- python|Python中的if __name__ == '__main__'是什么意思呢
- 访谈提纲如何写()
- 优雅的用符号拼接list中的元素
- 一名高中生心中的小秘密