【Java面试题】框架篇——Spring

什么是Spring框架?Spring框架有哪些主要模块?

​ Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。

Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。

在这里插入图片描述

Spring有几种配置方式?

将Spring配置到应用开发中有以下三种方式:

  • 基于XML的配置
  • 基于注解的配置
  • 基于Java的配置

Spring框架中的单例Beans是线程安全的么?

​ Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Servie类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。

​ 最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。

Spring 框架中都用到了哪些设计模式?★★★

Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的:

  • 代理模式—在AOP和remoting中被用的比较多。

  • 单例模式—在spring配置文件中定义的bean默认为单例模式。

  • 模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。

  • 工厂模式—BeanFactory用来创建对象的实例。

Spring AOP在实际项目中的应用★★★

权限管理、表单验证、事务管理、信息过滤、拦截器、过滤器、页面转发等等。

阐述一下Bean的生命周期?

在Spring框架中,Bean的生命周期通常包括以下几个阶段:

1. 实例化Bean对象:当Spring容器需要一个Bean时,会调用Bean类的构造方法创建一个新的Bean实例。

2. Bean属性赋值:Spring容器会在创建Bean实例后,将Bean类中的属性值赋给实例变量。

3. Bean初始化:Spring容器会在Bean实例化后,调用@PostConstruct注解标注的方法对Bean进行初始化操作。这个方法可以有多个,并且是按照声明顺序执行的。

4. Bean使用:Spring容器会在需要使用Bean的时候,调用getBean方法获取Bean实例。此时,Bean已经被创建并初始化完毕,可以直接使用了。

5. Bean销毁:当Spring容器不再需要Bean时,会调用destroy方法销毁Bean实例。在销毁之前,Spring容器会先调用deallocate方法释放Bean占用的资源。如果在Bean中使用了ThreadLocal等线程本地变量,则会在线程结束时自动清理。

下面是一个简单的示例,展示了Spring中Bean的生命周期:

public class MyBean {
    private int count;

    public MyBean(int count) {
        this.count = count;
    }

    @PostConstruct
    public void init() {
        System.out.println("Initializing MyBean, count=" + count);
    }

    public void doSomething() {
        System.out.println("Doing something with MyBean, count=" + count);
    }
}

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean(int count) {
        return new MyBean(count);
    }
}

public class App {
    public static void main(String[] args) throws Exception {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        MyBean bean = (MyBean) context.getBean("myBean");
        bean.init(); // Initializing MyBean, count=0
        bean.doSomething(); // Doing something with MyBean, count=0
        context.close(); // 关闭应用程序上下文,销毁所有bean实例和资源
    }
}

// applicationContext.xml文件内容如下:
<bean id="myBean" class="com.example.MyBean">
    <property name="count">0</property>
</bean>


Spring 中有哪些方式可以把 Bean 注入到 IOC 容器?

在Spring中,有以下几种方式可以把Bean注入到IOC容器:

1. 构造函数注入:通过在Bean类的构造函数上使用@Autowired注解,将需要注入的Bean作为参数传递给构造函数。

2. Setter方法注入:通过在setter方法上使用@Autowired注解,将需要注入的Bean作为参数传递给setter方法。

3. 字段注入:通过在Bean类的属性上使用@Autowired注解,将需要注入的Bean作为属性值直接赋值。

4. @Resource注解:使用@Resource注解标注一个静态方法或类,该方法或类会自动装配一个指定类型的Bean实例。

5. @ComponentScan注解:使用@ComponentScan注解扫描指定包下的所有类,并将被扫描到的类自动装配到IOC容器中。

6. @Import注解:使用@Import注解导入其他配置文件中定义的Bean,这些Bean会被自动装配到IOC容器中。

7. @Qualifier注解:使用@Qualifier注解指定需要装配的具体Bean的名称,以便在多个相同类型的Bean之间进行选择。

SpringData有了解么吗?

1. Spring Data JPA Repositories:提供了一些高级功能,如查询构造器、分页、排序等,使得开发人员可以更加方便地进行JPA数据访问。

2. Spring Data REST Repositories:提供了一些高级功能,如RESTful风格的接口、JSON序列化和反序列化等,使得开发人员可以更加方便地进行RESTful数据访问。

3. Spring Data Elasticsearch Repositories:提供了一些高级功能,如支持Elasticsearch的索引和搜索、集成Elasticsearch模板等,使得开发人员可以更加方便地进行Elasticsearch数据访问。

4. Spring Data MongoDB:提供了一些高级功能,如支持MongoDB的索引和搜索、集成MongoDB模板等,使得开发人员可以更加方便地进行MongoDB数据访问。

总之,Spring Data提供了多种数据访问技术的支持,可以根据不同的需求选择合适的技术进行数据访问。同时,Spring Data还提供了很多高级功能和扩展性,可以帮助开发人员更加方便地进行数据访问和管理。

Spring的IOC你了解哪些?★★★

Spring IoC (Inversion of Control) 是一种依赖注入(Dependency Injection,DI)的实现方式,它可以解决 Java 应用程序中组件之间的耦合问题。

在 Spring IoC 中,组件不再直接依赖于其他组件,而是通过容器(IoC Container)来管理它们的依赖关系。当需要使用一个组件时,容器会自动将该组件注入到调用它的代码中,从而实现了解耦和松散耦合。

Spring IoC 主要由以下几个部分组成:

  1. 容器(IoC Container):负责管理应用程序中的所有组件,并将它们组合在一起以创建完整的应用程序。Spring IoC 默认使用的是 Tomcat 作为 IoC Container。
  2. 配置文件(Configuration File):用于定义应用程序中所有组件的依赖关系。Spring IoC 通过 XML 或 Java 配置文件来实现配置。
  3. 注解(Annotation):用于描述组件之间的依赖关系。Spring IoC 支持多种注解,如 @Autowired、@Inject 等。
  4. 代理(Proxy):Spring IoC 在运行时动态地创建一个代理对象,用于管理组件之间的依赖关系。代理对象可以拦截方法调用,并在调用前或调用后执行一些额外的操作。

总之,Spring IoC 可以大大简化 Java 应用程序的开发过程,提高代码的可维护性和可测试性。

@Resource 和 @Autowired 的区别

@Resource@Autowired 都是Spring框架中用于自动装配Bean的注解,它们的作用是一样的,都是将一个或多个Bean注入到目标对象中。

不过,它们之间还是有一些区别的:

1. `@Resource` 是Java EE标准中的注解,而`@Autowired` 是Spring框架中的注解。因此,如果你使用的是Java EE标准规范,那么你可以使用`@Resource`注解;如果你使用的是Spring框架,那么你可以使用`@Autowired`注解。

2. `@Resource`注解可以同时指定多个Bean进行注入,而`@Autowired`注解只能指定一个Bean进行注入。例如:
@Resource
private UserService userService;

@Autowired
private UserService userService; // 只指定了一个UserService Bean
3. `@Resource`注解可以指定Bean的名称,而`@Autowired`注解不能直接指定Bean的名称。如果需要指定Bean的名称,可以通过`@Qualifier`注解来指定。例如:
@Resource(name="userService")
private UserService userService;

@Autowired
@Qualifier("userService")
private UserService userService; // 通过@Qualifier指定了bean的名称为"userService"


总之,@Resource@Autowired注解的主要区别在于它们的来源和使用方式。如果你使用的是Java EE标准规范,那么你可以使用@Resource注解;如果你使用的是Spring框架,那么你可以使用@Autowired注解。无论使用哪种注解,都需要根据实际情况选择合适的方式进行Bean的注入。

Spring的AOP你了解哪些?★★★

Spring AOP (Aspect-Oriented Programming) 是一种面向切面编程(Aspect-Oriented Programming,AOP)的实现方式,它可以解决 Java 应用程序中横切关注点(Cross-Cutting Concerns)的问题。

在 Spring AOP 中,我们可以将横切关注点从业务逻辑代码中分离出来,通过定义切面(Aspect)来统一处理。切面是一个包含一系列通知(Advice)的模块化单元,通知可以在程序执行的不同阶段执行,如方法调用前、方法调用后、异常处理等。

Spring AOP 主要由以下几个部分组成:

1. 切面(Aspect):定义一个或多个通知,用于描述横切关注点的处理逻辑。

2. 实现接口(Interface):定义切面接口,并实现其中的方法。

3. 织入(Weaving):将切面应用到目标对象中,使其具有横切关注点的处理能力。Spring AOP 支持两种织入方式,即基于代理的织入和基于 CGLIB 的织入。

4. AOP 配置文件(Aspect Configuration File):用于定义切面的声明和切点表达式等信息。Spring AOP 通过 XML 或注解方式来实现配置。

总之,Spring AOP 可以大大简化 Java 应用程序的开发过程,提高代码的可维护性和可测试性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Wei *

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

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

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

打赏作者

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

抵扣说明:

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

余额充值