一文掌握SpringBoot注解之@Configuration知识文集(3)

news2024/11/17 8:41:14

在这里插入图片描述

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。
🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。
🎉欢迎 👍点赞✍评论⭐收藏

🔎 SpringBoot 领域知识 🔎

链接专栏
SpringBoot 注解专业知识学习一SpringBoot 注解专栏
SpringBoot 注解专业知识学习二SpringBoot 注解专栏
SpringBoot 注解专业知识学习三SpringBoot 注解专栏

文章目录

    • 🔎 SpringBoot 注解 @Configuration 学习(3)
      • 🍁 21. 如何在配置类中使用@Autowired注解进行依赖注入?
      • 🍁 22. 如何在配置类中使用@DependsOn注解定义Bean之间的依赖关系?
      • 🍁 23. 什么是Bean后置处理器(BeanPostProcessor)?如何在配置类中定义一个Bean后置处理器?
      • 🍁 24. 如何在配置类中定义一个AOP切面?
      • 🍁 25. 如何在配置类中配置事务管理器(Transaction Manager)?
      • 🍁 26. 如何在配置类中配置缓存管理器(Cache Manager)?
      • 🍁 27. 如何在配置类中配置消息队列(Message Queue)?
      • 🍁 28. 如何在配置类中配置邮件发送(Email Sending)?
      • 🍁 29. 如何在配置类中配置定时任务(Scheduled Tasks)?
      • 🍁 30. 如何在配置类中配置国际化(Internationalization)?


🔎 SpringBoot 注解 @Configuration 学习(3)

在这里插入图片描述


🍁 21. 如何在配置类中使用@Autowired注解进行依赖注入?

在配置类中使用 @Autowired 注解进行依赖注入可以让我们在配置类中引用其他的 Bean 对象,以进行配置和管理。通过 @Autowired 注解,Spring 框架会自动查找相应的 Bean 并将其注入到配置类中。

以下是在配置类中使用 @Autowired 注解进行依赖注入的示例:

@Configuration
public class MyConfiguration {

    @Autowired
    private MyBean myBean;

    //...
}

在上述示例中,我们使用 @Autowired 注解将一个名为 myBean 的 Bean 注入到配置类中的 myBean 变量中。

需要注意的是,在配置类中使用 @Autowired 注解进行依赖注入时,被注入的 Bean 对象必须是由 Spring 管理的 Bean。如果要在配置类中使用 @Autowired 注解注入自定义的 Bean 对象,需要确保自定义的 Bean 已经被注册为 Spring 的 Bean。

另外,还可以在构造函数、Setter 方法、普通方法和字段上使用 @Autowired 注解进行依赖注入。例如:

@Configuration
public class MyConfiguration {

    private MyBean myBean;

    public MyConfiguration() {
        // 通过构造函数注入依赖
    }

    @Autowired
    public void setMyBean(MyBean myBean) {
        // 通过Setter方法注入依赖
    }

    @Autowired
    public void injectDependency(MyBean myBean) {
        // 通过普通方法注入依赖
    }

    @Autowired
    private OtherBean otherBean; // 字段注入依赖

    //...
}

总结来说,通过在配置类中使用 @Autowired 注解进行依赖注入,可以让我们方便地引用其他 Bean 对象并进行配置和管理。被注入的 Bean 对象需要是由 Spring 管理的 Bean,可以通过构造函数、Setter 方法、普通方法和字段上的 @Autowired 注解进行注入。


🍁 22. 如何在配置类中使用@DependsOn注解定义Bean之间的依赖关系?

在配置类中使用 @DependsOn 注解可以定义 Bean 之间的依赖关系,确保在初始化该 Bean 之前先初始化指定的 Bean。

以下是在配置类中使用 @DependsOn 注解定义 Bean 之间依赖关系的示例:

@Configuration
public class MyConfiguration {

    @Bean
    @DependsOn("dependencyBean")
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean
    public DependencyBean dependencyBean() {
        return new DependencyBean();
    }

    //...
}

在上述示例中,我们通过在 @Bean 注解中使用 @DependsOn 注解,将 MyBean 对象的初始化依赖于 DependencyBean 对象的初始化。这意味着在实例化和初始化 MyBean 对象之前,会先实例化和初始化 DependencyBean 对象。

需要注意的是,@DependsOn 注解的参数是一个字符串数组,可以指定多个依赖Bean。例如:

@Configuration
public class MyConfiguration {

    @Bean
    @DependsOn({"dependencyBean1", "dependencyBean2"})
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean
    public DependencyBean dependencyBean1() {
        return new DependencyBean();
    }

    @Bean
    public DependencyBean dependencyBean2() {
        return new DependencyBean();
    }

    //...
}

在上述示例中,MyBean 对象的初始化依赖于 dependencyBean1dependencyBean2 的初始化。

通过使用 @DependsOn 注解,我们可以明确指定 Bean 之间的依赖顺序,确保在初始化某个 Bean 之前先初始化它所依赖的其他 Bean。

总结来说,通过在配置类中使用 @DependsOn 注解,可以定义 Bean 之间的依赖关系,确保在初始化某个 Bean 之前先初始化它所依赖的其他 Bean。可以通过在 @Bean 注解中使用 @DependsOn 注解,并指定依赖Bean的名称来实现依赖关系的定义。


🍁 23. 什么是Bean后置处理器(BeanPostProcessor)?如何在配置类中定义一个Bean后置处理器?

Bean后置处理器(BeanPostProcessor)是Spring框架提供的一种扩展机制,用于在Bean实例化和初始化的过程中对Bean进行增强或修改。

Bean后置处理器接口定义了两个关键的回调方法:postProcessBeforeInitializationpostProcessAfterInitialization

  • postProcessBeforeInitialization方法在Bean的初始化之前被调用,允许对Bean进行修改。
  • postProcessAfterInitialization方法在Bean的初始化之后被调用,允许对Bean进行增强。

以下是在配置类中定义一个Bean后置处理器的示例:

@Configuration
public class MyConfiguration {

    @Bean
    public MyBeanPostProcessor myBeanPostProcessor() {
        return new MyBeanPostProcessor();
    }

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    //...
}

在上述示例中,我们定义了一个自定义的Bean后置处理器 MyBeanPostProcessor,并使用 @Bean 注解将其注册为Spring的Bean。同时,我们也定义了一个普通的Bean MyBean

public class MyBeanPostProcessor implements BeanPostProcessor {
    
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 在Bean的初始化之前进行修改
        // 可以对bean对象进行处理或修改,但不能返回一个新的bean对象
        return bean;
    }
    
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 在Bean的初始化之后进行增强
        // 可以对bean对象进行处理或增强,并可以返回一个新的bean对象
        return bean;
    }
}

在上述示例中,MyBeanPostProcessor 类实现了 BeanPostProcessor 接口,并重写了 postProcessBeforeInitializationpostProcessAfterInitialization 方法。我们可以在这两个方法中编写自定义的逻辑,对Bean进行修改或增强。

通过在配置类中定义一个Bean后置处理器,并实现相应的回调方法,我们就可以对Bean实例进行定制化的修改或增强。这可以用于在Bean初始化之前进行前置处理,例如属性注入、属性验证等;也可以用于在Bean初始化之后进行后置处理,例如AOP代理、Bean包装等。


🍁 24. 如何在配置类中定义一个AOP切面?

在配置类中定义一个AOP切面,可以通过使用 @Aspect 注解和相关的切点、通知等注解来实现。下面是一个简单的示例:

@Configuration
@EnableAspectJAutoProxy
public class AopConfiguration {
    
    @Bean
    public MyAspect myAspect() {
        return new MyAspect();
    }
    
    //...
}

在上述示例中,我们使用 @Configuration 注解将类声明为配置类,使用 @EnableAspectJAutoProxy 注解启用AspectJ自动代理。然后,我们使用 @Bean 注解将自定义的切面 MyAspect 注册为Spring的Bean。

@Aspect
public class MyAspect {
    
    @Before("execution(* com.example.service.*.*(..))")
    public void beforeAdvice(JoinPoint joinPoint) {
        // 在目标方法执行之前执行的通知逻辑
        // 可以通过JoinPoint获取目标方法的信息
    }
    
    @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
    public void afterReturningAdvice(JoinPoint joinPoint, Object result) {
        // 在目标方法正常返回后执行的通知逻辑
        // 可以通过JoinPoint获取目标方法的信息
        // 可以通过result获取目标方法的返回值
    }
    
    @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "exception")
    public void afterThrowingAdvice(JoinPoint joinPoint, Throwable exception) {
        // 在目标方法抛出异常后执行的通知逻辑
        // 可以通过JoinPoint获取目标方法的信息
        // 可以通过exception获取目标方法抛出的异常
    }
    
    // 其他通知类型和注解,例如@After、@Around等
    
}

在上述示例中,我们定义了一个名为 MyAspect 的切面,并使用 @Aspect 注解将其声明为一个切面类。在切面类中,我们使用不同类型的通知注解(例如 @Before@AfterReturning@AfterThrowing等)来定义具体的切面逻辑。通过在通知方法上使用切点表达式来定位目标方法,可以通过 JoinPoint 参数获取目标方法的信息,并根据需要进行处理。

通过在配置类中定义一个AOP切面,我们可以根据切面的类型和注解来定义相应的通知,实现对目标方法的增强、拦截或修改。这样可以实现例如日志记录、性能监控、事务管理等横切关注点的统一处理。


🍁 25. 如何在配置类中配置事务管理器(Transaction Manager)?

在配置类中配置事务管理器(Transaction Manager),可以通过以下步骤实现:

1.在配置类上添加 @EnableTransactionManagement 注解,以启用 Spring 的事务管理功能。

@Configuration
@EnableTransactionManagement
public class AppConfig {
    //...
}

2.在配置类中创建一个数据源(DataSource)的 Bean,并配置相关的数据库连接信息。

@Bean
public DataSource dataSource() {
    // 配置数据源信息
    return new DataSource();
}

3.创建一个事务管理器的 Bean,并指定数据源。

@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

在上述示例中,我们使用 DataSourceTransactionManager 类作为事务管理器的实现,并将数据源 DataSource 作为参数传入。

注意:你需要根据自己的项目配置选择合适的事务管理器,例如 DataSourceTransactionManager(适用于 JDBC 数据源)、JpaTransactionManager(适用于 JPA)、HibernateTransactionManager(适用于 Hibernate)等。

4.(可选)如果需要使用基于注解的事务管理,可以在配置类中添加 @EnableTransactionManagement 注解。

@Configuration
@EnableTransactionManagement
public class AppConfig {
    //...
}

这将启用 Spring 的注解驱动事务管理,允许在需要事务管理的方法上使用 @Transactional 注解。

@Service
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    @Transactional
    public void updateUser(User user) {
        // 更新用户信息的业务逻辑
        userRepository.update(user);
    }

}

在上述示例中,我们在 updateUser 方法上添加了 @Transactional 注解,以指示该方法需要在事务管理下执行。

通过上述配置,我们可以在配置类中配置事务管理器(Transaction Manager)。配置完成后,Spring 将会根据配置的事务管理器,在需要的地方自动应用事务管理,从而实现对数据库操作的事务性管理。


🍁 26. 如何在配置类中配置缓存管理器(Cache Manager)?

在配置类中配置缓存管理器(Cache Manager),可以通过以下步骤实现:

1.在配置类上添加 @EnableCaching 注解,以启用 Spring 的缓存功能。

@Configuration
@EnableCaching
public class AppConfig {
    //...
}

2.在配置类中创建一个缓存管理器的 Bean,并指定缓存的实现方式。

@Bean
public CacheManager cacheManager() {
    // 配置缓存管理器的实现方式
    return new CacheManager();
}

在上述示例中,我们创建了一个名为 cacheManager 的 Bean,并返回一个自定义的缓存管理器实例。

注意:你需要根据自己的项目需求选择合适的缓存管理器实现,例如 Spring 自带的 org.springframework.cache.concurrent.ConcurrentMapCacheManager(基于内存的缓存实现)或者其他第三方缓存实现,如 Ehcache、Redis 等。

@Bean
public CacheManager cacheManager() {
    return new ConcurrentMapCacheManager("cacheName1", "cacheName2", ...);
}

在上述示例中,我们使用 ConcurrentMapCacheManager 并为其指定了一些缓存的名称。

3.(可选)如果需要基于注解的缓存操作,可以在需要缓存的方法上添加 @Cacheable@CachePut@CacheEvict 注解。

@Service
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    @Cacheable("users")
    public User getUser(Long id) {
        // 查询用户的业务逻辑
        return userRepository.findById(id);
    }

    @CacheEvict(value = "users", key = "#id")
    public void deleteUser(Long id) {
        // 删除用户的业务逻辑
        userRepository.deleteById(id);
    }

}

在上述示例中,我们在 getUser 方法上添加了 @Cacheable 注解,指示 Spring 运行时应将该方法的结果存储到名为 “users” 的缓存中,并在下次调用相同参数的方法时直接返回缓存中的结果。

通过上述配置,我们可以在配置类中配置缓存管理器(Cache Manager)。配置完成后,Spring 将会自动应用缓存管理器,并根据配置的缓存注解,在需要的地方自动进行缓存操作,从而提高系统的性能和响应速度。


🍁 27. 如何在配置类中配置消息队列(Message Queue)?

在配置类中配置消息队列(Message Queue),可以通过以下步骤实现:

1.首先,需要确定使用哪种消息队列的实现,例如 RabbitMQ、Kafka、ActiveMQ 等。根据选择,需引入对应的依赖。

2.在配置类上添加 @EnableJms 注解,以启用 Spring 的 JMS(Java Message Service)功能。

@Configuration
@EnableJms
public class AppConfig {
    //...
}

3.创建连接工厂的 Bean,并设置与消息队列的连接信息。

@Bean
public ConnectionFactory connectionFactory() {
    // 配置连接工厂,根据选择的消息队列实现进行配置
    return new RabbitMQConnectionFactory();
}

在上述示例中,我们创建了一个名为 connectionFactory 的 Bean,并返回一个自定义的 RabbitMQ 连接工厂实例。

注意:你需要根据自己的项目需求选择合适的连接工厂实现,例如 RabbitMQ 的连接工厂是 org.springframework.amqp.rabbit.connection.ConnectionFactory,这里的示例仅供参考。

4.创建模板(Template)的 Bean,并设置消息队列的相关配置。

@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
    JmsTemplate jmsTemplate = new JmsTemplate();
    jmsTemplate.setConnectionFactory(connectionFactory);
    // 设置其他相关属性,例如默认目的地、消息转换器等
    return jmsTemplate;
}

在上述示例中,我们创建了一个名为 jmsTemplate 的 Bean,并使用上一步中创建的连接工厂进行初始化。

5.(可选)根据需要,可以在配置类中创建消息监听器(Message Listener)的 Bean,用于处理接收到的消息。

@Bean
public MessageListener messageListener() {
    return new MyMessageListener();
}

在上述示例中,我们创建了一个名为 messageListener 的 Bean,并返回一个自定义的消息监听器实例。

6.(可选)将消息监听器与目的地(Destination)进行绑定。

@Bean
public DefaultMessageListenerContainer messageListenerContainer(MessageListener messageListener, ConnectionFactory connectionFactory) {
    DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
    container.setConnectionFactory(connectionFactory());
    container.setDestinationName("myQueue");
    container.setMessageListener(messageListener());
    return container;
}

在上述示例中,我们创建了一个名为 messageListenerContainer 的 Bean,并将消息监听器、连接工厂以及目的地绑定在一起。

通过上述配置,我们可以在配置类中配置消息队列(Message Queue)。配置完成后,Spring 将会自动应用配置,使得我们能够方便地使用消息队列进行异步消息的发送和接收。具体的使用细节和配置需根据所选的消息队列实现和项目需求进行调整。


🍁 28. 如何在配置类中配置邮件发送(Email Sending)?

在配置类中配置邮件发送(Email Sending),可以通过以下步骤实现:

1.首先,需要确定使用哪种邮件发送的实现,例如 JavaMail、Spring Mail 等。根据选择,需引入对应的依赖。

2.在配置类上添加 @Configuration 注解,以标识该类为配置类。

@Configuration
public class AppConfig {
    //...
}

3.在配置类中创建邮件发送的实例。

@Bean
public JavaMailSender javaMailSender() {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    // 配置邮件发送相关属性,例如SMTP服务器、端口号、账户密码等
    return mailSender;
}

在上述示例中,我们创建了一个名为 javaMailSender 的 Bean,并返回一个 JavaMailSenderImpl 实例。

注意:你需要根据自己的项目需求选择合适的邮件发送实现,这里的示例仅供参考。

4.(可选)根据需要,可以在配置类中创建邮件消息的模板(Template),用于发送邮件。

@Bean
public SimpleMailMessage templateMessage() {
    SimpleMailMessage message = new SimpleMailMessage();
    // 设置邮件的默认信息,例如发件人、主题等
    return message;
}

在上述示例中,我们创建了一个名为 templateMessage 的 Bean,并返回一个 SimpleMailMessage 实例,可以在发送邮件时使用该模板进行定制。

5.配置邮件发送的相关属性,例如 SMTP 服务器、端口号、账户密码等。

@Bean
public JavaMailSender javaMailSender() {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setHost("smtp.example.com"); // 设置SMTP服务器地址
    mailSender.setPort(587); // 设置SMTP服务器端口号
    mailSender.setUsername("username"); // 设置发件人账户名
    mailSender.setPassword("password"); // 设置发件人账户密码
    // 配置其他相关属性,例如SMTP认证、SSL/TLS设置等
    return mailSender;
}

在上述示例中,我们调用 JavaMailSenderImpl 的相关方法,设置了 SMTP 服务器、端口号、发件人账户名和密码。

6.(可选)如果需要使用 SSL/TLS 进行安全连接,可以进行配置。

@Bean
public JavaMailSender javaMailSender() {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setHost("smtp.example.com"); // 设置SMTP服务器地址
    mailSender.setPort(465); // 设置SMTP服务器端口号
    mailSender.setUsername("username"); // 设置发件人账户名
    mailSender.setPassword("password"); // 设置发件人账户密码
    Properties properties = new Properties();
    properties.setProperty("mail.smtp.auth", "true");
    properties.setProperty("mail.smtp.starttls.enable", "true");
    mailSender.setJavaMailProperties(properties);
    return mailSender;
}

在上述示例中,我们设置了邮件发送的相关属性,并创建了一个 Properties 对象,设置了 SMTP 认证和启用 SSL/TLS。

通过上述配置,我们可以在配置类中配置邮件发送(Email Sending)。配置完成后,Spring 将会自动应用配置,使得我们能够方便地使用邮件发送功能。具体的使用细节和配置需根据所选的邮件发送实现和项目需求进行调整。请注意,邮件发送涉及到敏感信息,建议将敏感信息存放在外部的配置文件中,并通过 Spring 的属性配置来引用。


🍁 29. 如何在配置类中配置定时任务(Scheduled Tasks)?

在配置类中配置定时任务(Scheduled Tasks),可以通过以下步骤实现:

1.首先,在配置类上添加 @Configuration 注解,以标识该类为配置类。

@Configuration
public class AppConfig {
    //...
}

2.在配置类中启用定时任务的功能,需要添加 @EnableScheduling 注解。

@Configuration
@EnableScheduling
public class AppConfig {
    //...
}

在上述示例中,我们使用了 @EnableScheduling 注解,启用了定时任务的功能。

3.在需要执行定时任务的方法上,添加 @Scheduled 注解,并设置任务的执行时间。

@Configuration
@EnableScheduling
public class AppConfig {
    @Scheduled(cron = "0 0 12 * * ?") // 每天中午12点执行任务
    public void scheduledTask() {
        // 执行定时任务的代码
    }
}

在上述示例中,我们给 scheduledTask() 方法添加了 @Scheduled 注解,并在注解中设置了任务的执行时间。这里使用了 cron 表达式,该表达式表示在每天中午12点执行任务。你可以根据需求设置不同的 cron 表达式来指定任务的执行时间。

4.(可选)如果需要使用自定义的线程池执行定时任务,可以在配置类中创建线程池。

@Configuration
@EnableScheduling
public class AppConfig {
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10); // 设置线程池的大小
        // 配置其他相关的线程池属性
        return scheduler;
    }

    @Scheduled(cron = "0 0 12 * * ?") // 每天中午12点执行任务
    public void scheduledTask() {
        // 执行定时任务的代码
    }
}

在上述示例中,我们创建了一个名为 taskSchedulerTaskScheduler Bean,并返回一个 ThreadPoolTaskScheduler 实例。通过调整线程池的大小和其他相关属性,可以定制化配置线程池。然后,我们在定时任务的方法上继续添加 @Scheduled 注解,使用默认的线程池执行定时任务。

通过上述配置,我们可以在配置类中配置定时任务(Scheduled Tasks)。注意定时任务的执行方法必须是公有的,并且不接受任何参数。具体的使用细节和配置需根据项目需求进行调整。定时任务的错误处理、任务之间的依赖关系等也可以通过配置进一步调整。


🍁 30. 如何在配置类中配置国际化(Internationalization)?

在配置类中配置国际化(Internationalization),可以按照以下步骤进行:

1.在配置类上添加 @Configuration 注解,以标识该类为配置类。

@Configuration
public class AppConfig {
    //...
}

2.在配置类中创建一个 MessageSource 的 Bean,并设置国际化资源文件的位置和其他相关属性。

@Configuration
public class AppConfig {
    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("messages"); // 设置国际化资源文件的名称前缀,默认为 "messages"
        messageSource.setDefaultEncoding("UTF-8"); // 设置资源文件的编码,默认为 "UTF-8"
        // 配置其他相关的 MessageSource 属性
        return messageSource;
    }
}

在上述示例中,我们创建了一个名为 messageSourceMessageSource Bean,并返回了一个 ResourceBundleMessageSource 实例。我们通过调用 setBasename() 方法设置了国际化资源文件的名称前缀,这里默认为 “messages”。同时,我们使用了 setDefaultEncoding() 方法设置了资源文件的编码,这里默认为 “UTF-8”。

3.在需要进行国际化的地方使用 MessageSource Bean 来获取对应的国际化消息。

@Configuration
public class AppConfig {
    @Autowired
    private MessageSource messageSource;

    public void doSomething() {
        String message = messageSource.getMessage("greeting.message", null, Locale.US);
        System.out.println(message);
    }
}

在上述示例中,我们使用了 @Autowired 注解将 MessageSource 注入到需要进行国际化的地方。然后,我们通过调用 getMessage() 方法来获取对应的国际化消息。这里的第一个参数是消息的键,第二个参数是参数数组(如需在消息中使用参数),第三个参数是 Locale 对象,用于指定要使用的语言和地区。

通过上述配置,我们可以在配置类中配置国际化(Internationalization)。你可以根据自己的项目需求进行调整,包括设置资源文件的位置、编码、语言和地区等。在需要进行国际化的地方,通过 MessageSource Bean 获取对应的国际化消息,以实现多语言支持。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1429038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ADI 知识库】 AN-1354:集成式ZIF、RF至比特、LTE、广域接收机分析和测试结果

官方链接: https://www.analog.com/cn/resources/app-notes/an-1354.html 简介 本应用笔记参考了3GPP TS 36系列文件和ADI公司的多种数据手册、特性标定报告和实验室测试结果。本文重点关注基于集成式零中频(ZIF)、RF至比特、IC (AD9371)的多载波广域LTE接收机的性…

使用css绘制小三角形

要使用CSS绘制小三角形&#xff0c;您可以使用border属性来设置边框样式。下面是一种常见的绘制小三角形的方法&#xff1a; <style>.box {width: 0;height: 0;/* border-top: 10px solid red; */border-bottom: 10px solid blue;border-left: 10px solid transparent;b…

2024PMP考试新考纲-【业务环境领域】典型真题和很详细解析(3)

华研荟继续分享【业务环境Business Environment领域】在新考纲下的真题&#xff0c;帮助大家体会和理解新考纲下PMP的考试特点和如何应用所学的知识和常识&#xff08;经验&#xff09;来解题&#xff0c;并且举一反三&#xff0c;一次性3A通过2024年PMP考试。 2024年PMP考试新…

Interpolator:在Android中方便使用一些常见的CubicBezier贝塞尔曲线动画效果

说明 方便在Android中使用Interpolator一些常见的CubicBezier贝塞尔曲线动画效果。 示意图如下 import android.view.animation.Interpolator import androidx.core.view.animation.PathInterpolatorCompat/*** 参考* android https://yisibl.github.io/cubic-bezier* 实现常…

在flutter中集成Excel导入和导出

flutter中集成Excel导入和导出功能 1、需要的依赖 在pubspec.yaml #excel导出syncfusion_flutter_xlsio: ^24.1.45open_file: ^3.0.1#导入excelflutter_excel: ^1.0.1#选择文件的依赖file_picker: ^6.1.1&#xff08;1&#xff09;依赖说明 在测试时&#xff0c;我们在使用导…

MySQL学习记录——일 MySQL 安装、配置

文章目录 1、卸载内置环境2、安装MySQL3、启动4、登录5、配置my.cnf 当前环境是1核2G云服务器&#xff0c;CentOS7.6 1、卸载内置环境 云服务器中有可能会自带mysql还有mariadb这样的数据库服务&#xff0c;在安装我们mysql前&#xff0c;得先查找一下是否有。 ps ajx |grep m…

20240202在WIN10下使用whisper.cpp

20240202在WIN10下使用whisper.cpp 2024/2/2 14:15 【结论&#xff1a;在Windows10下&#xff0c;确认large模式识别7分钟中文视频&#xff0c;需要83.7284 seconds&#xff0c;需要大概1.5分钟&#xff01;效率太差&#xff01;】 83.7284/4200.1993533333333333333333333333…

Latex学习记录

目录 1.Latex各种箭头符号总结 2.[Latex]公式编辑&#xff0c;编号、对齐 3.Latex公式编号: 多行公式多编号&#xff0c;多行公式单编号 4.LaTex中输入空格以及换行 1.Latex各种箭头符号总结 箭头符号 - ➚ (piliapp.com)https://cn.piliapp.com/symbol/arrow/Latex各种箭头…

【algorithm】一个简单的PID工程 base 用于手生时候快速复习 用于设计模式 cpp语法八股 快速复习校验

写在前面 最近项目一直用matlab&#xff0c;防止手生整一个回忆工具使用的简单的pid demo&#xff0c;走一边流程&#xff0c;包括配工程debug看结果&#xff0c;复用之前记录的配置见我的bloghttps://blog.csdn.net/weixin_46479223/article/details/135082867?csdn_share_t…

Faster-Whisper 实时识别电脑语音转文本

Faster-Whisper 实时识别电脑语音转文本 前言项目搭建环境安装Faster-Whisper下载模型编写测试代码运行测试代码实时转写脚本 参考 前言 以前做的智能对话软件接的Baidu API&#xff0c;想换成本地的&#xff0c;就搭一套Faster-Whisper吧。 下面是B站视频实时转写的截图 项…

thinkphp项目之composer快速安装使用

引言 由于项目的需求&#xff0c;thinkphp项目使用到composer。网上搜索有一堆的教程使用&#xff0c;根据自己的需要摸索了下。 步骤 1. 安装phpstudy v8&#xff0c;这个经常用的运行环境&#xff0c;方便好多开发者。安装教程一步一步到最后就行。 2. 安装composer组件&a…

问题:媒体查询语法中, 可用设备名参数表示“文档打印或预览“的是 #媒体#媒体#其他

问题&#xff1a;媒体查询语法中, 可用设备名参数表示"文档打印或预览"的是 A、C.?screen B.?projection C、A.?print D.?speech 参考答案如图所示

【LeetCode: 462. 最小操作次数使数组元素相等 II + 贪心】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

java.lang.UnsatisfiedLinkError: no onnxruntime4j_jni in java.library.path

目录 1.问题现象: 2.问题定位 3.问题解决 4.很少遇到JDK小版本导致出问题 1.问题现象: 使用langchain <!-- langchain4j start--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId><version&g…

AtCoder Beginner Contest 338F - Negative Traveling Salesman【floyd+状态压缩dp】

原题链接&#xff1a;https://atcoder.jp/contests/abc338/tasks/abc338_f Time Limit: 6 sec / Memory Limit: 1024 MB Score: 500 points、 问题陈述 有一个有N个顶点和M条边的加权简单有向图。顶点的编号为 1 到 N&#xff0c;i/th 边的权重为 Wi​&#xff0c;从顶点 U…

影院购票|电影院订票选座小程序|基于微信小程序的电影院购票系统设计与实现(源码+数据库+文档)

电影院订票选座小程序目录 目录 基于微信小程序的电影院购票系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能实现 2、管理员功能实现 &#xff08;1&#xff09;影院信息管理 &#xff08;2&#xff09;电影信息管理 &#xff08;3&#xff09;已…

Docker 容器卷

1、概念介绍 如果是CentOS7安全模块会比之前系统版本加强&#xff0c;不安全的会先禁止&#xff0c;所以目录挂载的情况被默认为不安全的行为&#xff0c;在SELinux里面挂载目录被禁止掉了&#xff0c;如果要开启&#xff0c;我们一般使用--privlegedtrue命令&#xff0c;扩大…

springwebflux高性能服务

场景&#xff1a; 分别使用springwebmvc 使用tomcat &#xff08;tomcat 9&#xff09;和springwebflux 做一个简单的接口 &#xff0c;该接口返回一个随机数 压测环境&#xff1a; 4C 8G ECS 使用tomcat 压测结果 Max 抖动的厉害 保持压测的参数不变 使用webflux 压测结果 …

七普详细数据——广东省七普分乡、镇、街道数据,shp格式,自取

基本信息. 数据名称: 广东省七普分乡、镇、街道数据 数据格式: Shp 数据几何类型: 面 数据坐标系: WGS84 数据时间&#xff1a;2020年 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1zrks总人口数&#xff08;人&#xff09;2a0-140…

YOLOv5改进 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层(轻量化Neck、全网独家首发)

一、本文介绍 本文给大家带来的改进机制是最近这几天最新发布的改进机制MFDS-DETR提出的一种HS-FPN结构,其是一种为白细胞检测设计的网络结构,主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分:特征选择模块和特征融合模块,在本文的下面均会有讲解,…