Spring框架
- 作用:解决了创建对象管理对象繁琐的问题
- 核心价值:开发人员可以通过Spring框架提供的机制将创建对象、管理对象的任务交给Spring来完成,不必关心这些过程,需要时通过Spring容器获取对象即可。
Spring框架也经常被称之为:Spring容器
Spring创建对象的方式
- 通过@Bean方法
- 获取Bean对象方法:getBean()方法
- 相关异常:
1. 容器中没有该Bean对象:NoSuchBeanDefinitionException
2. 有多个Bean对象:致NoUniqueBeanDefinitionException
- 通过组件扫描:添加注解
1. @Component //通用组件注解
2. @Configuration //配置类 Spring会通过CGLiB代理模式处理 需添加 @ComponentScan,且在注解参数指定包名
3. @Repository:用于实现数据访问的类
4. @Service:用于处理业务逻辑的类
5. @Controller:用于控制器类
Bean对象的作用域
- 默认情况下是单例的,可通过 @Scope 注解进行修改
- 默认情况下 Bean 是预加载的,可通过 @Lazy 注解进行懒加载
预加载: 优点:事先创建好对象,需要时直接获取 缺点:启动程序时,因为创建的对象比较多,启动过程比较慢,而且对象长时间处于内存中,是一种资源浪费 懒加载: 优点:需要时才会创建对象,不会形成资源浪费 缺点:如果当前系统已经处于负荷状态,会增加系统的负担,不利于高并发的场景 ```
自动装配机制 @Autowired @Resource
- 什么是自动装配机制?
当某个量需要被赋值时,可以使用特定的语法,使得Spring尝试从容器中找到合适的值,并自动完成赋值 - 不存在与属性名称匹配的Spring Bean:装配失败,启动项目时即抛出 NoUniqueBeanDefinitionException
- @Qualifier注解是在自动装配机制中,用于指定beanName的注解
@Autowired与@Resource的区别:
除了这2个注解所在的 包不同、装配机制不同以外,还存在以下区别:
– @Autowired可以添加在构造方法的声明之前,@Resource不可以
– @以Resource可以添加在类的声明之前(但不会装配属性的值),@Autowired不可
– 当存在多个同类型的Bean时 – 当装配属性时,@Autowired需要通过@Qualifier指定beanName,而@Resource可以 直接配置name属性以指定beanName
– 当装配方法的参数时(例如添加了@Autowired的构造方法的参数),
IoC (控制反转)
概念:在传统开发模式中,是由开发者创建对象,为对象的属性赋值、管理对象的作用域和生命周期等,相当于时开发者拥有 控制权 ,当使用了Spring之后,这些都交给了Spring框架去完成了,开发者不必关心这些操作的具体实现,所以称之为 控制反转
比如注解创建对象、自动装配等都是控制反转的体现,都可以称之为Spring IoC的过程
DI (依赖注入)
概念:是Spring IoC的核心实现,当某个类声明了另一个类的属性,则被称之为依赖,Spring框架会帮你完成依赖项(属性)的赋值,只是在你的代码中看不到赋值的过程或赋值符号,所以被称之为注入。