Java框架随笔

Maven面试题

Myabtis面试题

1、简述Spring Boot的启动流程

Spring Boot的启动流程可以分为以下几个步骤:

  1. 加载配置文件:在启动过程中,Spring Boot会首先加载并解析配置文件,包括application.properties或application.yml等。这些配置文件中包含了应用程序的配置信息,如数据库连接信息、端口号等。

  2. 创建Spring应用上下文:接下来,Spring Boot会根据加载的配置文件创建一个Spring应用上下文。Spring应用上下文是Spring框架的核心容器,负责管理和协调各个Bean的创建、依赖注入等工作。

  3. 扫描并注册Bean:Spring Boot会扫描应用程序中的所有类,查找带有特定注解的类,并将其注册为Bean。这些特定注解包括@Component、@Service、@Controller等,它们用于标识类是Spring的组件,需要由Spring容器来管理。

  4. 执行自动配置:Spring Boot会根据应用程序的依赖关系和配置文件的内容,自动配置各个模块和组件。它会根据类路径上的依赖自动配置数据库连接、Web服务器、消息队列等。

  5. 启动应用程序:在完成上述步骤后,Spring Boot会启动应用程序并监听指定的端口号。当接收到请求时,它将根据请求的URL和配置的路由规则,调用相应的Controller方法进行处理,并返回结果给客户端。

2、Spring Boot的自动配置

原理

是通过使用条件注解来实现的。条件注解是Spring框架中的一种特殊注解,用于根据一定的条件来决定是否生效某个配置。Spring Boot利用条件注解可以根据环境、类路径、属性等条件来自动配置应用程序。

具体流程

如下:

  1. Spring Boot启动时,会通过@ComponentScan注解扫描所有的组件,包括@Configuration、@Component、@Service等。
  2. 扫描到的组件会被注册到Spring容器中,成为Bean对象。
  3. Spring Boot会根据类路径中的配置文件和注解来判断是否需要进行自动配置。
  4. 自动配置类通过@Configuration注解进行标识,并使用@Conditional注解来指定配置的条件。
  5. 根据条件判断,如果满足条件,则自动配置类生效,会将相关的Bean注册到Spring容器中。
  6. 如果多个自动配置类存在相同的Bean,Spring Boot会根据优先级进行选择,保留优先级高的。
  7. 自动配置类可以通过@ConfigurationProperties注解来读取配置文件中的属性值,并将属性值注入到相应的Bean中。

通过自动配置,Spring Boot可以根据项目的需求自动加载相应的组件和配置,而不需要手动配置每个组件和属性。这大大简化了开发流程,提高了开发效率。同时,开发人员也可以根据自己的需求来自定义配置,覆盖默认的自动配置。

3、Bean的生命周期

当一个Bean被Spring容器创建和管理时,它会经历以下生命周期阶段:

  1. 实例化(Instantiation):当Spring容器启动时,根据配置信息和注解,实例化一个Bean对象。这可以通过构造函数实例化,或通过工厂方法实例化。

  2. 属性赋值(Populating properties):在实例化Bean后,Spring容器会通过依赖注入(Dependency Injection)或者属性赋值(Property Injection)将Bean所需的属性值设置进去。这可以通过@Autowired注解、@Resource注解或者直接在XML配置文件中进行属性配置来实现。

  3. 初始化前回调(Initialization Callback):在属性赋值完成后,Spring容器会调用Bean的初始化方法(如实现InitializingBean接口的afterPropertiesSet方法,或者在配置文件中使用init-method属性指定的方法)进行一些自定义的初始化操作。

  4. 初始化后回调(Initialization Callback):当Bean的初始化方法执行完毕后,Spring容器会调用BeanPostProcessor接口的postProcessBeforeInitialization方法和postProcessAfterInitialization方法,允许开发人员在Bean初始化前后进行一些自定义的处理。

  5. 使用(Bean Ready for Use):此时,Bean已经初始化完成,可以被其他组件使用。

  6. 销毁前回调(Destruction Callback):当Spring容器关闭时,或者通过调用容器的destroy方法来销毁Bean时,Spring容器会调用Bean的销毁方法(如实现DisposableBean接口的destroy方法,或者在配置文件中使用destroy-method属性指定的方法)进行一些自定义的销毁操作。

  7. 销毁后回调(Destruction Callback):在Bean的销毁方法执行完毕后,Spring容器会调用BeanPostProcessor接口的postProcessBeforeDestruction方法,允许开发人员在Bean销毁前进行一些自定义的处理。

需要注意的是,并非所有的Bean都需要进行初始化和销毁的操作,只有在需要进行一些自定义的初始化和销毁操作时才需要配置相应的方法。大部分情况下,Spring容器会自动处理Bean的生命周期,无需开发人员手动干预。

4、Spring常用注解:

  1. @Component:用于将一个类标记为Spring容器的组件,通常用于自动扫描组件时使用。

  2. @Autowired:用于自动装配依赖关系,将一个类的实例注入到另一个类中。

  3. @Qualifier:用于指定具体的注入对象,当有多个同类型的依赖对象时,可通过该注解指定要注入的对象。

  4. @Configuration:用于标记一个类为Spring配置类,通常与@Bean注解一起使用。

  5. @Bean:用于定义一个Spring管理的Bean对象,通常在@Configuration类中使用。

  6. @Value:用于将外部配置文件中的值注入到类的属性中。

  7. @RequestMapping:用于将一个URL映射到处理器类或方法上,用于处理HTTP请求。

  8. @RestController:用于标记一个类为RESTful风格的控制器。

  9. @Service:用于标记一个类为服务层组件。

  10. @Repository:用于标记一个类为数据访问层组件。

5、Spring MVC常用注解:

  1. @Controller:用于标记一个类为控制器,处理用户请求并返回相应的视图。

  2. @RequestMapping:用于将一个URL映射到处理器类或方法上,用于处理HTTP请求。可以指定请求的HTTP方法、请求路径等。

  3. @RequestParam:用于将请求参数绑定到方法的参数上,可以指定参数的名称、是否必需、默认值等。

  4. @PathVariable:用于将URL路径变量绑定到方法的参数上,可以获取RESTful风格的URL中的参数值。

  5. @ResponseBody:用于将方法的返回值直接作为HTTP响应的内容,通常用于返回JSON或XML格式的数据。

  6. @ModelAttribute:用于将请求参数绑定到方法的参数上,并将其添加到模型中,供视图使用。

  7. @SessionAttributes:用于将指定的模型属性保存到会话中,供多个请求之间共享。

  8. @Valid:用于启用方法参数的数据验证,通常与JSR-303验证注解(如@NotBlank、@Max等)一起使用。

  9. @ExceptionHandler:用于定义处理异常的方法,当控制器中抛出指定类型的异常时,将会调用该方法进行处理。

  10. @InitBinder:用于初始化数据绑定器,可以自定义格式化、转换等操作。

6、JDBC

JDBC(Java Database Connectivity)是Java语言连接数据库的一种标准接口。它提供了一组用于访问和操作关系型数据库的API,使得开发人员能够使用Java编程语言与各种数据库进行交互。

使用流程

  1. 加载数据库驱动程序:首先,需要使用Class类的forName()方法来加载数据库驱动程序。不同的数据库有不同的驱动程序,需要根据所使用的数据库类型进行选择和加载。
Class.forName("com.mysql.cj.jdbc.Driver");
  1. 建立数据库连接:使用DriverManager类的getConnection()方法来建立与数据库的连接。需要提供数据库的连接信息,如URL、用户名和密码等。
String url = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";
Connection connection = DriverManager.getConnection(url, username, password);
  1. 创建和执行SQL语句:使用Connection对象的createStatement()方法创建一个Statement对象,然后使用Statement对象的executeQuery()executeUpdate()方法执行SQL语句。
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM mytable");
  1. 处理查询结果:如果执行的是查询语句(SELECT),则可以通过ResultSet对象来获取查询结果。可以使用ResultSet对象的诸多方法来访问和操作查询结果。
while (resultSet.next()) {
    String name = resultSet.getString("name");
    int age = resultSet.getInt("age");
    System.out.println("Name: " + name + ", Age: " + age);
}
  1. 关闭数据库连接:在不再需要使用数据库连接时,应该显式地关闭连接,以释放资源。
resultSet.close();
statement.close();
connection.close();

7、JDBC和Mybatis的关系

  • JDBC和MyBatis是Java中两个常用的数据库操作框架。

JDBC(Java Database Connectivity)是Java语言连接数据库的标准接口,提供了访问和操作关系型数据库的API。它通过驱动程序与数据库进行交互,可以执行SQL语句、处理查询结果等。JDBC提供了一些核心接口和类,如Connection、Statement、ResultSet等,开发者可以根据这些接口进行数据库的增删改查操作。

MyBatis是一个优秀的持久层框架,它在JDBC的基础上进行了封装,简化了数据库操作的编码工作。MyBatis通过XML文件或注解的方式将SQL语句和Java代码进行映射,提供了更加灵活和方便的数据库操作方式。与JDBC相比,MyBatis可以自动处理数据库连接的获取和释放、参数的传递、结果集的封装等,大大简化了开发人员的工作量。

在使用MyBatis时,需要先配置数据库连接信息和SQL语句的映射关系,这些配置信息可以通过XML文件或注解的方式进行定义。然后,通过MyBatis提供的接口和方法,可以方便地执行SQL语句,获取结果集并进行相应的处理。

总的来说,JDBC是Java语言连接数据库的标准接口,而MyBatis是在JDBC基础上构建的一个持久层框架,提供了更加便捷和高效的数据库操作方式。使用MyBatis可以大大简化数据库操作的编码工作,提高开发效率。

8、在Spring Boot中使用MyBatis

可以分为以下几个步骤:

  1. 添加依赖:在pom.xml文件中添加MyBatis和数据库驱动的依赖,如下所示:
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>
  1. 配置数据库连接:在application.propertiesapplication.yml中配置数据库连接信息,如下所示:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  1. 创建实体类:创建与数据库表对应的实体类,例如:
public class User {
    private Long id;
    private String username;
    private String password;
    // getter and setter
}
  1. 创建Mapper接口:创建与数据库表对应的Mapper接口,定义SQL操作方法,例如:
@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User findById(Long id);
    
    @Insert("INSERT INTO user(username, password) VALUES(#{username}, #{password})")
    void save(User user);
}
  1. 创建Mapper XML文件:创建与Mapper接口对应的Mapper XML文件,定义SQL语句的映射关系,例如:
<!-- userMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
    <select id="findById" resultType="com.example.entity.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <insert id="save" parameterType="com.example.entity.User">
        INSERT INTO user(username, password) VALUES(#{username}, #{password})
    </insert>
</mapper>
  1. 注册Mapper接口:在Spring Boot的配置类中通过@MapperScan注解扫描Mapper接口,例如:
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
    // 配置其他MyBatis相关的配置
}
  1. 使用Mapper接口:在Service或Controller中注入Mapper接口,调用其方法进行数据库操作,例如:
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    
    public User getUserById(Long id) {
        return userMapper.findById(id);
    }
    
    public void saveUser(User user) {
        userMapper.save(user);
    }
}

以上就是在Spring Boot中使用MyBatis的基本流程,通过配置数据库连接、创建实体类、定义Mapper接口和XML文件、注册Mapper接口,然后在Service或Controller中使用Mapper接口进行数据库操作。这样可以方便地使用MyBatis进行持久化操作。

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白夜的月亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值