2024年最新Java编程配置思路详解,kafka面试题整理

总结

面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考

一份还热乎的蚂蚁金服面经(已拿Offer)面试流程4轮技术面+1轮HR

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

xml配置缺点:配置文件的读取和解析需要耗时,xml配置文件内容太多会显得很臃肿,不方便管理。

Java编程配置优点:相对于xml配置而言,其结构更清晰,可读性更高,同时也节省了解析xml耗时。

Java编程配置缺点:修改应用配置参数需要重新编译。其实并不是一个大的问题,实际生成环境中,应用配置完成后一般都不会也不敢去随意修改。

两者各有千秋,考虑到Spring4.x和SpringBoot都在推荐使用Java编程配置的方式,那我们也应该顺应时代潮流,你可以不用,但你应该要懂!

Java编程配置步骤

第一步:创建配置类,在类名上添加注解Configuration,告知Spring这是一个配置类,其作用类似xml文件

第二步:加载外部配置文件,在类名上添加注解PropertySource,指定properties文件的读取路径

第三步:获取应用配置属性值,在属性变量上添加注解Value,通过${}表达式获取配置文件中参数

第四步:依赖注入,在方法上添加Bean注解,也可以用FactoryBean

第一步和第四步的语法,文章第二部分会详细介绍。第二步和第三步的语法,文章第三部分会详细介绍。

import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.mchange.v2.c3p0.ComboPooledDataSource; /** * Spring 配置类 * 配置数据源,事务管理,bean,自动扫描包 * @author itdragon */ @Configuration // 声明该类为配置类 @PropertySource({“classpath:propertySource.properties”}) // 引入外部文件 @ComponentScan(“com.itdragon”) // 配置自动扫描包的路径 @EnableTransactionManagement // 开启基于注解的事务管理功能 public class ApplicationContextConfig { @Value(“ D A T A U S E R " ) p r i v a t e S t r i n g D A T A U S E R ; @ V a l u e ( " {DATA_USER}") private String DATA_USER; @Value(" DATAUSER")privateStringDATAUSER;@Value("{DATA_PAWD}”) private String DATA_PAWD; @Value(“ D A T A D R I V E R " ) p r i v a t e S t r i n g D A T A D R I V E R ; @ V a l u e ( " {DATA_DRIVER}") private String DATA_DRIVER; @Value(" DATADRIVER")privateStringDATADRIVER;@Value("{DATA_JDBC_URL}”) private String DATA_JDBC_URL; @Bean // 数据源 public DataSource dataSource() throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(DATA_USER); dataSource.setPassword(DATA_PAWD); dataSource.setDriverClass(DATA_DRIVER); dataSource.setJdbcUrl(DATA_JDBC_URL); return dataSource; } @Bean // jdbc模板 public JdbcTemplate jdbcTemplate() throws Exception{ JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource()); return jdbcTemplate; } @Bean // 事务管理 public PlatformTransactionManager transactionManager() throws Exception{ return new DataSourceTransactionManager(dataSource()); } }

事务类

import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.itdragon.dao.ITDragonDao; @Service public class ITDragonServer { @Autowired(required=false) private ITDragonDao itdragonDao; public List<Map<String,Object>> findAll() { return itdragonDao.findAll(); } @Transactional public void updateNameById(String name, Long id) { itdragonDao.updateUserNameById(name, id); System.out.println(0/0); // 事务异常 } }

完整代码,请异步github

二、组件注入


Bean注解类似xml文件中的<bean>标签,其中被Bean注解修饰的方法名对应<bean>标签中的id,也可以通过Bean注解的value属性设置id的值。在SpringBoot底层代码中被大量使用。

若希望容器启动后创建对象,并在使用后从容器中直接获取,则什么都不需要做,因为Spring默认是单实例,即容器启动后创建对象,并保存到容器中,使用时再从容器中获取。

若希望容器启动后不创建对象,而是在使用时再创建,继而保存到容器中,下次使用再从容器中获取,可以通过懒加载的方式实现,即使用Lazy注解修饰。

若希望容器启动后不创建对象,而是在每次使用时创建,则采用多实例的方式,即使用Scope注解,参数的值为prototype,即@Scope(“prototype”) 。

若希望容器启动后根据条件选择需要注入的Bean,可以使用注解Conditional判断,SpringBoot的底层打量使用了该注解。

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Controller; import com.itdragon.entity.ITDragonEntity; import com.itdragon.server.ITDragonServer; /** * 知识点二:配置自动扫描包路径 * 一、注解ComponentScan的value值设置自动扫描包的路径 * 二、注解ComponentScan的excludeFilters值设置扫描排除的规则 * 1)、通过注解@Filter设置排除的类型,type=ANNOTATION表示按照注解包含排除。classes是具体的注解,如Controller,Server,Repository * 三、注解ComponentScan的includeFilters值设置扫描加入的规则 * 1)、通过设置useDefaultFilters=false关闭Spring默认扫描全部的功能,使includeFilters生效 * * 知识点三:@Filter常用的拦截类型 * 一、FilterType.ANNOTATION:按照注解 * 二、FilterType.ASSIGNABLE_TYPE:按照给定的类型,包括其子类和实现类 * 三、FilterType.CUSTOM:使用自定义规则 * * 第一个ComponentScan注解表示在指定包下不扫描通过Controller注解修饰的类和ITDragonServer类及其子类和实现类 * 第二个ComponentScan注解表示在指定包下只扫描通过Controller注解修饰的类 * 第三个ComponentScan注解表示在指定包下根据自定义拦截规则,不扫描满足规则的类 / @Configuration @ComponentScan(value=“com.itdragon”,excludeFilters={@Filter(type=FilterType.ANNOTATION,classes={Controller.class}), @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={ITDragonServer.class})}) //@ComponentScan(value=“com.itdragon”,includeFilters={@Filter(type=FilterType.ANNOTATION,classes={Controller.class})},useDefaultFilters=false) //@ComponentScan(value=“com.itdragon”,excludeFilters={@Filter(type=FilterType.CUSTOM,classes={ITDragonCustomTypeFilter.class})}) public class ITDragonConfig { /* * 知识点一:配置bean * 一、注解Bean的value值表示bean的id * 二、注解Bean的value值未设置,则方法名表示bean的id / @Bean(value=“itdragonBean”) public ITDragonEntity itdragonEntity() { //方法名很重要,类似xml的id名,也可以通过@bean的value值重定义 return new ITDragonEntity(“itdragon”, “configuration-password”, 25); } /* * 知识点四:Scope属性 * @Scope,调整作用域,默认单实例 * singleton:单实例:ioc容器启动后创建对象放到ioc容器中,需要是从容器中获取。 * prototype:多实例:ioc容器启动后每次获取对象时都要创建对象。 * request:同一次请求创建一个实例 * session:同一个session创建一个实例 * * 知识点五:懒加载 * 针对单实例而言,在容器启动后不创建对象,在第一次使用Bean时创建对象。可以理解为单实例的一种补充。 * / // @Scope(“prototype”) @Lazy @Bean public ITDragonEntity scopeTopicBean() { System.out.println(“^^^^^^^^^^^^^^^^^^^^^Create Bean”); return new ITDragonEntity(“scopeBean”, “singleton-prototype-request-session”, 25); } /* * 知识点六:Conditional条件判断 * 满足条件才会注册bean,可以修饰在类上,管理整个类下的组件注入。 / @Bean @Conditional({ITDragonCustomCondition.class}) public ITDragonEntity conditionalBean() { return new ITDragonEntity(“conditionalBean”, “Conditional-Condition-CustomCondition”, 25); } /* * 知识点七:FactoryBean工厂Bean * FactoryBean默认通过调用getObject创建的对象,通过调用isSingleton设置单实例和多实例。 */ @Bean public ITDragonFactoryBean itdragonFactoryBean() { return new ITDragonFactoryBean(); } }

自定义的条件判断组件注入类

import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; /** * 自定义的条件判断组件注入 * @author itdragon * / public class ITDragonCustomCondition implements Condition{ /* * 判断注册的bean中是否含有指定的bean */ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // 获取bean的注册类 BeanDefinitionRegistry registry = context.getRegistry(); return registry.containsBeanDefinition(“scopeTopicBean”); // 有则加载conditionalBean } }

总结

本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!

MySQL50道高频面试题整理:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

/4f45ff00ff254613a03fab5e56a57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当面试涉及JavaKafka相关的问题时,以下是一些常见的Java Kafka面试题目: 1. Kafka是什么?它的主要特点是什么? - Kafka是一个分布式流处理平台,用于高吞吐量、低延迟的数据传输和处理。 - 它的主要特点包括高性能、可扩展性、持久性、容错性和可靠性。 2. Kafka的消息发布和订阅模型是怎样的? - Kafka的消息发布和订阅模型是基于主题(topic)的。生产者(producer)将消息发布到一个或多个主题,而消费者(consumer)则从一个或多个主题订阅消息。 3. 在Java中如何使用Kafka的生产者API发送消息? - 使用Kafka的生产者API,可以通过创建一个Producer实例,并使用send()方法发送消息到指定的主题。 4. 在Java中如何使用Kafka的消费者API接收消息? - 使用Kafka的消费者API,可以通过创建一个Consumer实例,并使用subscribe()方法订阅一个或多个主题。后使用poll()方法来获取消息。 5. 如何保证Kafka消息的可靠性? - Kafka通过将消息持久化到磁盘和复制到多个副本来保证消息的可靠性。生产者可以选择等待所有副本都写入成功后再认为消息发送成功。 6. Kafka的分区是什么?如何确定消息被发送到哪个分区? - Kafka的分区是物理上的概念,用于对消息进行水平拆分和并行处理。每个主题可以被分为多个分区。 - 消息被发送到哪个分区是根据生产者在发送消息时指定的键(key)来决定的。Kafka使用哈希算法来将键映射到特定的分区。 这些是一些Java Kafka面试题目,涵盖了Kafka的基本概念和使用方式。希望对您有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值