Spring 与 Bean
Spring 是什么 ?
spring 是包含了众多工具方法的 loC 容器
什么是 IoC 容器 ?
IoC = Inversion of Control 翻译成中⽂是“控制反转”的意思,也就是说 Spring 是⼀个“控制反转”的容器 .
- 控制权反转
对象的生命周期,不由程序员(或当前代码片段控制) , 而由 spring (ioc 容器)来控制
IoC 优点 : 实现解耦合
- DI依赖注入 :
指的是在程序运行期间 , 动态的将依赖对象获取到的过程 .
为解决传统开发中的缺陷
假如,我们现在构建⼀辆“⻋”的程序,我们的实现思路是这样的:
构建⼀辆⻋(Car Class),然⽽⻋需要依赖⻋身(FrameWork Class),⽽⻋身需要依赖底盘(Bottom Class),⽽底盘需要依赖轮胎(Tire Class)
而当最底层代码改动之后,整个调⽤链上的所有代码都需要修改
如果由⾃⼰创建的下级类,改为传递的⽅式 ,不在当前类中创建下级类,所以下级类即使发⽣变化(创建或减少参数),当前类本身也⽆需修改任何代码,这样就完成了程序的解耦。
改进之后的控制权发⽣的反转,不再是上级对象创建并控制下级对象了,⽽是将下级对象注⼊到当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。
创建 spring 项目
- 创建⼀个 Maven 项⽬ , 添加 Spring 框架⽀持
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
- 添加启动类
在创建好的项⽬ java ⽂件夹下创建⼀个启动类,包含 main ⽅法
- 创建 Bean
创建包 将 Bean 放入
- 将 Bean 注册到容器
在创建好的项⽬中添加 Spring 配置⽂件 spring-config.xml,将此⽂件放到 resources
将 User 对象注册到 Spring 中就可以,具体操作是在 中添加如下配置:
- 获取并使⽤ Bean 对象
-
得到 Spring 上下⽂对象,因为对象都交给 Spring 管理了,所以获取对象要从 Spring 中获取,那
么就得先得到 Spring 的上下⽂。 -
通过 Spring 上下⽂,获取某⼀个指定的 Bean 对象。
-
使⽤ Bean 对象。
更加简单的读取和存储对象
存储 Bean 对象
- 配置扫描路径: (在 spring-config.xml )
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:content="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<content:component-scan base-package="包名"></content:component-scan>
</beans>
- 五大类注解
让程序员看到类注解之后,就能直接了解当前类的⽤途
- Bean 命名规则
首字母和第二个字母大写 :使用原类名
否则 : 就使用首字母小写类名
- ⽅法注解 @ Bean
- 重命名 Bean
@ Bean 获取时注意 : @ Bean 的默认命名 = 方法名
可以通过设置 name 属性给 Bean 对象进⾏重命名操作
获取 Bean 对象(对象装配)
把对象取出来放到某个类中,有时候也叫 对象注⼊ 。
- 注⼊的关键字有:
a. @Autowired
b. @Resource
对象装配(对象注⼊)的实现⽅法以下 3 种:
- 属性注⼊ (依赖注入)
属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。
优点 : 使用简单
缺点 :
- 无法注入 final 修饰的变量
- 只适用于 ioc 容器
- 容易违背单一设计原则
- 构造⽅法注⼊
优点:
- 可注入不可变对象;
- 注入对象不会被修改;
- 注入对象会被完全初始化;
- 通用性更好。
-
- Setter 注⼊
优点 : 完全符合单一职责的设计原则
缺点 :
- 不能注入不可变对象(final 修饰的对象);
- 注入的对象可被修改。
- @ Resource:另⼀种注⼊关键字
@Controller
public class UserController {
// 注⼊
@Resource
private UserService userService;
public User getUser(Integer id) {
return userService.getUser(id);
}
}
- @Autowired 和 @Resource 的区别
- 出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
- 使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如
name 设置,根据名称获取 Bean。 - @Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊ ; ⽽ @Resource 不能⽤于构造函数注⼊。
- idea 兼容性支持不同 : 使用 @Autwired 在 idea 专业版下可能会存在误报 ; @ Resource 不会 .