Quarkus中的依赖注入DI和面向切面aop编程

 更新时间:2022年02月22日 15:25:18   作者:kl  
这篇文章主要为大家介绍了Quarkus中的依赖注入DI和面向切面aop的编程规范思想,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

前言

做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

通俗的说,JSR365是一套java实现DI依赖注入功能的接口设计,具体的框架只要实现这条接口,就可以正常的提供依赖注入功能,Quarkus就是实现的这套api,但是没有完全实现,所有只有部分功能。这里不研究具体的规范协议,内容太多了,有兴趣的可以在上面的地址中翻阅,下面主要看看在Quarkus中,怎么使用的。

Bean声明和依赖注入

/**
 * @author kl : http://kailing.pub
 * @version 1.0
 * @date 2020/7/13 16:55
 */
@ApplicationScoped
public class TestBean {
    @Inject
    Bean1 bean1;
}
@ApplicationScoped
class 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
@Startup
public class TestBean {
    @Inject
    Bean1 bean1;
}

Bean的生命周期

@ApplicationScoped
@Startup
public class TestBean {
    @Inject
    Bean1 bean1;

    @PostConstruct
    private void init(){
        System.out.println("实例化后调用");
    }
    @PreDestroy
    private 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
@Startup
public class TestBean {
    @Inject
    Bean1 bean1;
}
@Dependent
class BeanConfig{
    @Produces
    @IfBuildProperty(name = "quarkus.bean1.enabled", stringValue = "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());
    @AroundInvoke
    public 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编程的资料请关注脚本之家其它相关文章!

相关文章

  • Java实现QQ第三方登录的示例代码

    Java实现QQ第三方登录的示例代码

    这篇文章主要介绍了Java实现QQ第三方登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Java协程编程之Loom项目实战记录

    Java协程编程之Loom项目实战记录

    这篇文章主要介绍了Java协程编程之Loom项目尝鲜,如果用尝鲜的角度去使用Loom项目,可以提前窥探JVM开发者们是如何基于协程这个重大特性进行开发的,这对于提高学习JDK内核代码的兴趣有不少帮助,需要的朋友可以参考下
    2021-08-08
  • 详解Java的引用类型及使用场景

    详解Java的引用类型及使用场景

    这篇文章主要介绍了详解Java的引用类型及使用场景,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • SpringBoot中实现Redis缓存预热

    SpringBoot中实现Redis缓存预热

    缓存预热是一种在系统启动后,但在实际使用前将数据加载到缓存中的技术,本文主要来和大家一起探讨如何在Spring Boot应用程序中实现Redis缓存预热,以确保系统在处理请求前就已经处于最佳状态,感兴趣的可以了解下
    2023-11-11
  • Springboot2 集成 druid 加密数据库密码的配置方法

    Springboot2 集成 druid 加密数据库密码的配置方法

    这篇文章给大家介绍Springboot2 集成 druid 加密数据库密码的配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • 详解spring applicationContext.xml 配置文件

    详解spring applicationContext.xml 配置文件

    本篇文章主要介绍了详解spring applicationContext.xml 配置文件 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 解决MyEclipse6.5无法启动,一直停留刚开始启动界面的详解

    解决MyEclipse6.5无法启动,一直停留刚开始启动界面的详解

    本篇文章是对解决MyEclipse6.5无法启动,一直停留刚开始启动界面的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • java如何将Object数组转换为指定类型数组

    java如何将Object数组转换为指定类型数组

    这篇文章主要介绍了java如何将Object数组转换为指定类型数组,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Mybatis-Plus主键插入null值报错问题及解决

    Mybatis-Plus主键插入null值报错问题及解决

    这篇文章主要介绍了Mybatis-Plus主键插入null值报错问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 完美解决docx4j变量替换的问题

    完美解决docx4j变量替换的问题

    这篇文章主要介绍了完美解决docx4j变量替换的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论