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

在这里插入图片描述

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

🔎 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.mfbz.cn/a/367248.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QEMU源码全解析 —— 内存虚拟化(2)

接前一篇文章: 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 QEMU内存管理模型 特此致谢! QEMU内存初始化 1. 基本结构 在开始介绍内存初始化…

对象克隆Objects

对象克隆 把A对象的属性值完全拷贝给B对象,也叫对象拷贝,对象复制。 package MyApi.a04objectdemo;public class ObjectDemo03 {public static void main(String[] args) throws CloneNotSupportedException {//1.先创建一个对象int []data{1,2,3,4,5,…

深度学习(12)--Mnist分类任务

一.Mnist分类任务流程详解 1.1.引入数据集 Mnist数据集是官方的数据集,比较特殊,可以直接通过%matplotlib inline自动下载,博主此处已经完成下载,从本地文件中引入数据集。 设置数据路径 from pathlib import Path# 设置数据路…

C# Onnx GroundingDINO 开放世界目标检测

目录 介绍 效果 模型信息 项目 代码 下载 介绍 地址:https://github.com/IDEA-Research/GroundingDINO Official implementation of the paper "Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection" 效果 …

RT-Thread 28. Nano实现MSH及CPU利用率显示

Nano版源码官网下载 https://github.com/RT-Thread/rtthread-nano/archive/refs/heads/master.zip 1. 代码结构 2.代码 //main.c #include "gd32f3x0.h" #include <rthw.h> #include <rtthread.h> #include "cpuusage.h"#define delay_ms(x…

树型结构构建,模糊查询,过滤

一、前言 1、最近在做甘特图&#xff0c;有些需求和树型结构要求很大&#xff0c;看的是 pingCode&#xff0c;有搜索 2、还有抽取一部分树型结构的&#xff0c;如下是抽取上面的结构类型为需求的&#xff0c;重新组成树型 二、构建多颗树型结构 1、某些业务下&#xff0c;从…

【Nginx】Ubuntu如何安装使用Nginx反向代理?

文章目录 使用Nginx反向代理2个web接口服务步骤 1&#xff1a;安装 Nginx步骤 2&#xff1a;启动 Nginx 服务步骤 3&#xff1a;配置 Nginx步骤 4&#xff1a;启用配置步骤 5&#xff1a;检查配置步骤 6&#xff1a;重启 Nginx步骤 7&#xff1a;访问网站 proxy_set_header 含义…

vue-3d-model

vue-3d-model - npm GitHub - hujiulong/vue-3d-model: &#x1f4f7; vue.js 3D model viewer component 通过该插件降低Threejs的使用难度 vue项目加载三维模型&#xff0c;我把模型放在了服务器的tomcat里面&#xff0c;需要对tomcat的fbx项目文件夹设置跨域&#xff0c;如…

同城外卖跑腿app开发:重新定义城市生活

随着科技的发展和人们生活节奏的加快&#xff0c;同城外卖跑腿app应运而生&#xff0c;成为现代城市生活中的重要组成部分。本文将探讨同城外卖跑腿app开发的意义、市场需求、功能特点以及未来的发展趋势。 一、同城外卖跑腿app开发的意义 同城外卖跑腿app作为一种便捷的生活…

如何看待“Linux 中国” 开源社区,停止运营?

如何看待“Linux 中国” 开源社区&#xff0c;停止运营&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家…

专业120+总分400+宁波大学912信号与系统考研经验电子信息通信集成电路光电

今年考研顺利上岸&#xff0c;专业课912信号与系统120&#xff0c;总分400&#xff0c;被宁波大学录取&#xff0c;回望这一年的复习有过迷茫和犹豫&#xff0c;也有过坚持和坚强&#xff0c;总结一下自己的复习得失&#xff0c;希望对大家复习有所帮助。专业课&#xff1a; 前…

论文阅读:Learning Lens Blur Fields

这篇文章是对镜头模糊场进行表征学习的研究&#xff0c;镜头的模糊场也就是镜头的 PSF 分布&#xff0c;镜头的 PSF 与物距&#xff0c;焦距&#xff0c;光学系统本身的像差都有关系&#xff0c;实际的 PSF 分布是非常复杂而且数量也很多&#xff0c;这篇文章提出用一个神经网络…

Unity_ShaderGraph示例项目启动

Unity_ShaderGraph示例项目启动 大前提不变:URP模板,Unity2023.1.19使用 Shader Graph - Unity 手册Shader Graph 是一个工具,能够让您直观地构建着色器。您可以在图形框架中创建并连接节点,而不必手写代码。Shader Graph 提供了能反映所作更改的即时反馈,对于不熟悉着色…

自然语言处理(NLP)—— Dialogflow ES聊天机器人

1. 背景介绍 这个实验室的目标是让你了解并使用Google的Dialogflow服务。Dialogflow是一个可以让你创建聊天机器人的服务&#xff0c;这个过程不需要或者只需要很少的编程技能。 1.1 账号的创建 为了完成这个实验室&#xff0c;你需要在以下网站上创建账号&#xff1a…

在 Elastic Agent 中为 Logstash 输出配置 SSL/TLS

要将数据从 Elastic Agent 安全地发送到 Logstash&#xff0c;你需要配置传输层安全性 (TLS)。 使用 TLS 可确保你的 Elastic Agent 将加密数据发送到受信任的 Logstash 服务器&#xff0c;并且你的 Logstash 服务器从受信任的 Elastic Agent 客户端接收数据。 先决条件 确保你…

RK3588 Android 12 Framework修改记录(八)Settings Ethernet以太网 多网卡设置静态IP

https://blog.csdn.net/lishu_/article/details/114391764 如何优雅的实现Android Ethernet 以太网的开启与关闭 RK3588 Android 12 Framework修改记录&#xff08;八&#xff09;Settings Ethernet以太网 多网卡设置静态IP - 知乎 Android 7.1 以太网反射 EthernetManager 配置…

LabVIEW CVT离合器性能测试

介绍了CVT&#xff08;连续变速器&#xff09;离合器的性能测试的一个应用。完成了一个基于LabVIEW软件平台开发的CVT离合器检测与控制系统&#xff0c;通过高效、准确的测试方法&#xff0c;确保离合器性能达到最优。 系统采用先进的硬件配合LabVIEW软件&#xff0c;实现了对…

【Vue3】源码探索之旅:compiler-core之parseChildren函数(二)

简言 parseChildren函数是在baseParse函数中作为createRoot函数的子节点参数传入的&#xff0c;今天来探索下parseChildren函数。 parseChildren在 compiler-core/src/parse.ts文件内。 parseChildren 这个函数就是用来解析模板字符串内容的 &#xff0c;里面有个while循环…

使用输出事件激活Simulink块

什么是输出事件? 输出事件是发生在Stateflow图表中,但在图表外的Simulink块中可见的事件。这种类型的事件允许图表将图表中发生的事件通知模型中的其他块。 您可以使用输出事件来激活同一模型中的其他块。您可以在图表中定义多个输出事件,其中每个输出事件映射到一个输出端…

Quick BI中lod函数之lod_include

一、lod函数简介 LOD函数的全称是详细级别表达式&#xff08;Level Of Detail Expressisons&#xff09;。它主要是为了克服一些表达式之间计算颗粒度不一致的问题。比如&#xff0c;要计算第一季度各月销售收入占比&#xff0c;这里分子计算颗粒度为’月’&#xff0c;但是分…