1、Spring IOC 的理解,其初始化过程
Spring IOC(控制反转)是一种设计模式,它将创建对象的责任从程序代码中移到配置文件中。在Spring中,这个配置文件通常是XML文件,但也可以是Java配置类。
Spring IOC的工作流程如下:
1. 读取配置文件:Spring容器从配置文件中读取Bean的定义,包括Bean的类名、属性等信息。
2. 创建Bean对象:Spring容器根据Bean的定义创建Bean对象。
3. 依赖注入:Spring容器将Bean的依赖关系注入到Bean对象中。这通常通过构造函数注入或setter方法注入实现。
4. 初始化和销毁Bean:Spring容器可以对Bean进行初始化和销毁操作。这通常在Bean的生命周期中进行,包括在创建Bean后和销毁Bean前。
Spring IOC的初始化过程如下:
1. 读取配置文件:Spring容器从配置文件中读取Bean的定义。
2. 创建Bean对象:Spring容器根据Bean的定义创建Bean对象。
3. 依赖注入:Spring容器将Bean的依赖关系注入到Bean对象中。
4. 初始化Bean:Spring容器调用Bean的初始化方法,对Bean进行初始化操作。
5. 提供Bean:Spring容器将Bean对象提供给其他对象使用。
这就是Spring IOC的基本初始化过程。
2、Spring AOP的理解, 各个术语,他们是怎么相互工作的?
Spring AOP(面向切面编程)是一种编程范式,它允许开发者将横切关注点(如日志记录、事务管理等)与核心业务逻辑分离。AOP通过在编译时、类加载时或运行时动态地将代码切入到现有代码中,从而实现对代码的增强。
在Spring AOP中,主要的术语包括:
1. **切面(Aspect)**:切面是一个封装了横切关注点的模块,它定义了一系列的切入点和通知。切入点定义了在何处执行通知,通知定义了在切入点处执行的操作。
2. **切入点(Pointcut)**:切入点定义了在何处执行通知。它是一个表达式,用于匹配方法、字段或类。
3. **通知(Advice)**:通知定义了在切入点处执行的操作。通知可以是前置通知、后置通知、环绕通知等。
4. **连接点(Join point)**:连接点是程序执行流程中的一个点,它可以是方法执行、异常抛出、字段访问等。
5. **织入(Weaving)**:织入是将切面代码插入到目标代码中的过程。Spring AOP有两种织入方式:编译时织入和类加载时织入。
这些术语是如何相互工作的呢?
1. 切面定义了切入点和通知。
2. 切入点定义了在何处执行通知。
3. 通知定义了在切入点处执行的操作。
4. 当程序执行到切入点时,Spring AOP会根据切面和通知的定义,在切入点处执行通知。
这就是Spring AOP的工作原理。通过使用切面和通知,开发者可以将横切关注点与核心业务逻辑分离,使得代码更易于维护和测试。
3、Spring 中用到了那些设计模式?
1. **单例模式**:Spring默认使用单例模式来管理Bean。每个Bean在Spring容器中都是单例的,这意味着Spring只会创建一个Bean实例,并在整个应用程序中重用。
2. **工厂模式**:Spring使用工厂模式来创建Bean。BeanFactory是Spring的核心接口,它负责创建和配置Bean。
3. **代理模式**:Spring AOP使用代理模式来实现对代码的增强。Spring AOP创建了一个代理对象,它在目标对象的方法执行前后执行额外的代码。
4. **模板方法模式**:Spring JDBC使用模板方法模式来执行数据库操作。JdbcTemplate类定义了一个模板方法,该方法包含了执行数据库操作的步骤。
5. **装饰者模式**:Spring MVC使用装饰者模式来处理HTTP请求和响应。HandlerInterceptor和HandlerExceptionResolver类都使用了装饰者模式。
6. **观察者模式**:Spring的事件发布和监听机制使用了观察者模式。ApplicationEventPublisher类发布事件,ApplicationListener接口监听事件。
这些设计模式使得Spring能够有效地管理Bean的生命周期,处理依赖关系,以及增强代码的功能。
4、Spring @ Resource和Autowired有什么区别?
`@Resource`和`@Autowired`都是Spring框架中的注解,它们都可以用来注入Bean的依赖。但是,它们之间存在一些关键的区别。
1. `@Autowired`:这是Spring的核心注解,用于自动装配Bean的依赖。当Spring启动时,它会自动查找并装配Bean的依赖。如果有多个匹配的Bean,那么Spring会根据Bean的类型、名称等信息来确定要装配哪个Bean。
2. `@Resource`:这是Java的标准注解,通常与JNDI(Java Naming and Directory Interface)一起使用。`@Resource`注解可以用于注入Bean的依赖,也可以用于查找Bean。如果使用`@Resource`注解,并且没有指定`name`属性,那么Spring会尝试使用Bean的名称作为JNDI名称来查找Bean。
总的来说,`@Autowired`和`@Resource`的主要区别在于,`@Autowired`是Spring的注解,而`@Resource`是Java的标准注解。`@Autowired`是Spring的注解,因此它在Spring环境中更常用。
在Spring 4.3及以后的版本中,`@Autowired`和`@Resource`是可以互用的。也就是说,你可以使用`@Autowired`来代替`@Resource`,反之亦然。