文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

前言

做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的上下文和依赖注规范

该规范定义了一组功能强大的补充服务,这些服务有助于改善应用程序代码的结构。

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

Bean声明和依赖注入


@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上添加如下注解:


@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


@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编程的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯