
本文共 3085 字,大约阅读时间需要 10 分钟。
Spring的IOC(Inversion of Control,控制反转)是一种将对象的创建和管理权交给Spring容器的技术,让程序员不需要关心对象的生命周期,具体流程如下:
IOC的核心理念是通过注解或配置文件将对象的依赖关系明确化,随后由Spring自动生成并管理这些对象。以下是IOC的实现步骤和原理,更详细地解释了每个概念的作用和重要性。
IOC的步骤 IOC的步骤通常包含以下几个环节:
导入Spring的必要依赖包。这些依赖包通常包含Spring的核心组件和相关的框架配置,确保整个项目能够正常使用Spring功能。
编写实体类。在编写业务逻辑类时,需要注明这个类需要由Spring管理。通常使用Spring的注解或通过配置文件指定标识。
编写Spring的核心配置文件。这个配置文件(如applicationContext.xml)是Spring容器的 Entry Point,负责初始化各个Bean及其依赖关系。
启动Spring容器。在项目启动时,读取配置文件,创建Spring容器并初始化各Bean。
获取对象并进行调用。通过调用容器获取需要的对象,然后调用其相关方法完成业务逻辑。
IOC的原理 Spring的IOC通过动态代理技术实现控制反转,核心流程如下:
Spring容器启动后,尝试加载核心配置文件(如applicationContext.xml)。
配置文件中的Bean标签被逐行解析,提取出Bean的ID和类属性。
使用反射机制创建指定类型的对象,并管理对象的创建过程。
将创建好的对象存储在一个Map<String, Object>中,后续获取时通过Bean的ID进行二级获取。
关于两个相同类属性的Bean出现错误:
这种错误通常发生在Map中无法找到唯一的class属性值时。事实上,Spring会在创建过程中进行检查,如果多个Bean标签指向相同的class属性值且没有指定unique属性,会抛出错误提示,提示找不到唯一的class值。这可以防止配置文件中出现歧义的情况。
Spring获取对象的方式 Spring提供了多种方式获取控制反转后的对象:
通过Bean的ID(@id)明确指定。
通过Bean的class属性进行获取,但这通常不常见,因为class属性主要用于创建对象而不是获取对象。
Spring容器创建对象的方式 Spring支持多种方式来创建对象,具体如下:
默认方式:使用无参数构造。如果目标类有无参数构造方法,Spring会自动使用这个方法来创建对象。这也是最常用的方式。
静态工厂方法:配置文件中指定一个工厂类并注明该工厂的静态方法。通过调用static方法获取对象。
非静态工厂方法:通过工厂类中定义的非静态方法获取对象,需要注意工厂方法必须没有参数。
FactoryBean接口:定义一个实现FactoryBean接口的工厂类,可以有参数化的构造方法,方法获取方式为factoryBean.getBean().
Spring中的单例与多例 单例的配置方式: default singleton="true":保证同一个bean在整个容器中只存在一个实例。
单例的优缺点: 优:减少内存占用,提高性能。 缺:如果需要多个独立的对象,可能导致数据同步的问题。
多例配置: Actually in Spring, unless explicitly configured as prototype, the default scope is singleton. Thus, if your bean should be created once per request, it requires "request" or "prototype" scope.
关于懒加载: lazy-initialized beans are created on first demand. 标签配置方式:
默认懒初始化配置: bean default-lazy-init="true"。
Spring对象的生命周期 Spring对象的生命周期包括:
对象的创建:通过反射机制构造。
初始化过程:通过@PreDestroy等注解指定的初始化策略执行。
逥次调用:执行该对象的相应业务方法。
4.销毁阶段:通过@PreDestroy等注解指定的销毁策略执行或默认关闭。
Spring的依赖注入 依赖注入涉及两个方面:
a. 项目需要依赖的其他对象或属性。
b. Annotation或配置文件中指定将依赖的属性注入到目标对象中。
5种属性介绍:
index: 参数列表的起始位置,从0开始。
name: 参数名,类似于变量名。
type: 参数类型,Spring会自动转换,不需要手动指定。
value: 输入的值,添加到被注入的参数中。
ref: 引用类型参数的唯一标识符。
两种方式:set方法注入和构造器注入.
属性的自动装配 在属性注入时,可以使用autowire属性进行注入,注解方式为@Autowire注解。
类的注解 @Component注解可以加在需要管理的类上,供Spring自动识别。
为简单类型赋值 @Value注解可以用于赋值,例如@Value("固定值")或@Value("#{普通属性}")。
复杂类型的注入 @Value注解允许引用命名bean,如@Value("#{myBean}")。
Spring注解的高级用法 常见注解如下:
@Repository:通常用于DAO层,负责数据库操作。
@Service:用于业务逻辑层,建议用于服务层。
@Controller:用于控制器层,负责接收请求并返回响应。
@Component:可作用于任意类,作为统一注解。
@Lazy:控制懒加载,默认情况下懒加载已开启。
@Scope:配置Bean的生命周期,如多例模式设置为"prototype"。
面向接口编程 面向接口编程是一种设计模式,主要用于分离业务逻辑和实现类。它的核心目的是让项目更具有可.functionaltestability和可扩展性。
Spring的AOP面向切面编程 AOP的核心总幅理念是将与业务逻辑无关的代码独立出来,用以实现代码的重复使用。
代理模式的实现:
JDK动态代理的实现步骤:
使用Proxy.newProxyInstance获取动态代理对象。
内部处理方法调用,通过InvocationHandler拦截方法。
Cglib动态代理的实现方式:使用生成代理类,实现更高效的动态代理。
动态代理的优点:
最小化了静态代理的代码重复问题。
可以在运行时生成代理类和代理对象,减少了开发时间。
Spring AOP面向切面编程 在AOP切面编程中,核心关注点包括:
回顾面向切面的定义及应用场景。
使用切面注解显著简化核心配置文件。
在配置文件中添加aop:aspectj-autoproxy"s和切面类上添加@Aspect注解。
在切面类中添加@Around注解,结合正则表达式指定切入点,以实现动态代理和核心业务逻辑的切面控制.
Spring的五大通知类型:
环绕通知:在方法执行前和后进行操作。
前置通知:在方法执行前进行
后置通知:在方法执行后对结果进行处理.
异常通知:捕获和处理异常信息.
最终通知:无论执行结果如何,都会执行一次。
Spring AOP的实现原理 基于JDK动态代理和Cglib动态代理,根据被切面的接口类型选择相应的实现方式.
发表评论
最新留言
关于作者
