SSM--容器
Spring
Spring:企业级 一站式 框架
框架:特定领域系统的一组约定、标准、代码库以及工具的集合
Spring 框架的介绍
一、组件和容器
组件:具有一定功能的对象
容器:管理组件(创建、获取、保存、销毁)
一个常见的容器: Servlet 容器 Servelet 组件
Tomcat:Servlet Container
在 Spring 中需要了解 IoC 和 DI
IoC:Inversion of Control (控制反转:一种思想 被动的 不需要自己主动的 类似于 婚介所 不需要自己去找 给提供)
控制:资源的控制权(资源的创建、获取、销毁等)
反转:和传统的方式不一样
DI:Dependency Injectioni(依赖注入)
依赖:组件的依赖关系,如 NewController 依赖 NewsService
注入:通过 setter 方法、构造器等方式自动的注入(赋值)
IoC 实现需要 通过 DI
获取容器中的组件对象;精确获取某个组件
组件的四大特性:(名字、类型)、对象、作用域
组件的名字全局唯一,如果组件名重复了,只会在容器中放最先声明的那个
小结:从容器中获取组件:1、组件不存在,抛异常 2、组件不唯一也会抛异常 3、组件唯一存在,返回正确值
组件创建的时机:容器启动过程中就会创建组件对象,对象是单实例特性的 每次获取从容器中拿取
配置类 分类管理 组件的配置; 配置类也是一个组件
Spring 为我们提供了快速的分层注解
1、@Controller 控制器
2、@Service 服务层
3、@Repository 持久层
4、@Component 组件
@ComponentScan(basePackages=“”) 组件批量扫描 “里面填写 路径”
第三方组件想要导入容器中,没办法分层注解:
1、@Bean:自己 new 注册给容器
2、import( )
Scope 调整组件的作用域
@Scope(“prototype”):非单实例
@Scope(“singleton”):单实例 (默认的)
@Scope(“request”):同一个请求单实例
@Scope(“session”):同一次会话单实例
@Lazy :懒加载 容器启动完成以前不会创建懒加载组件的对象
如果制造某些对象比较复杂的时候,利用工厂方法进行创建(factoryBean)
FactoryBean 在容器中放的组件的类型,是接口中泛型指定的类型,组件的名字是 工厂自己的名字
Conditional -条件注册
Autowired 自动装配 。 原理:Spring 调用容器.getBean
1、按照类型,找到这个组件
1.0、有且只找到一个,直接注入,名字无所谓
1.1、如果找到多个,再按照名称去找;变量名就是名字
1.1.1如果找到:注入
1.1.2 如果找不到,报错
@Qualifer :精确指定
@Primary :标为主要的
@Resource 也是自动注入
面试题:@Resource 和 @Autowired 的区别
1、两者都可以做自动注入,都可以放在属性上
2、@Resource 是 Java 规定的,具有更强的通用性 @Autowired 是 Spring 规定的
@Value
1、@Value(“字面值”):直接复制
2、@Value(“${}”):动态从配置文件中取出某一项的值
3、@Value(“#{SpEl}”):spring Express Language : Spring表达式
@Profile(“环境标识”) 多环境
组件生命周期
@Bean
@Autowired是如何实现的?
1、专门有一个处理@Autowired注解的 AutowiredAnnotationBeanPostProcessor
2、每个Bean创建之后,会调用BeanPostProcessor的postProcessorBeforeInitalization方法
3、postProcessBeforeInitialization里面就会利用反射,得到当前Bean的所有属性,利用反射得到Bean属性上标注的所有注解,看有没有@Autowired注解
4、如果有,去容器中找这个属性对应的组件(按类型、按名字)找到