Spring IoC 思想
Spring IoC 思想
-
spring 采用分层架构,根据不同的功能被划分为多个模块1)Data Access2) Web 模块3) Core Container (核心容器)
-
IoC 是指程序开发中,实例的创建不在由调用者管理,而是由 Spring 容器创建, Spring 会负责控制程序之间的关系,而不是有程序代码直接控制,因此,控制权由 程序代码转移到了 Spring 容器中,控制权发生了反转,这就是 Spring IoC 思想*
-
Spring 提供了两种 IoC 容器:* BeanFactory:* BeanFactory beanFactory = new XmlBeanBeanFactory(new FileSystemResource("XXX.xml"))** ApplicationContext ac = new ClassPathXmlApplicationContext(String configLocation);** 二者的区别在于,如果 Bean 的某一属性没有注入,使用 BeanFactory 加载后,getBean()会抛异常* 而 ApplicetionContext 会在初始化时自检,这样有利于检查所依赖的属性是否注入* 在实际开发中,通常使用 ApplicationContext
-
Spring 两种依赖注入方式:
-
当某个 Java 实例需要另一个 Java 实例时,传统的方法是由调用者创建被调用者的实例(例如,使用 new 关键字获得被调用者实例),而使用 Spring 框架后,被调用者的实例不再由调用者创建,而是由 Spring 容器创建,这称为控制反转。
-
spring 容器在创建被调用者的实例时,会自动将调用者需要的实例注入给调用者,这样,调用者通过 Spring 容器获得被调用者的实例,这称为依赖注入
-
属性 setter 注入
- 指 IoC 容器使用 setter 方法注入被依赖的实例,通过调用无参构造器或无参 static 工厂方法实例化bean后,调用该 bean 的 setter 方法,即可实现基于 setter 的 DI
-
构造方法注入
- 指 IoC 容器使用构造方法注入被依赖的实例,基于构造器的 DI 通过调用带参数的构造方法实现,每个参数代表一个依赖
-
-
Spring 实例化 Bean 的三种方式:
- 构造器实例化
- 静态工厂方式实例化
- 实例工厂方式实例化
-
Spring Bean 的作用域
-
spring 容器在创建一个 Bean 实例时,同时会指定该实例的作用域 1) singleton 单例模式,spring默认作用域 通常情况下: 这种单例模式对于在无回话状态的 Bean (如Dao、Service 层)来 说,是最理想的选择 2)prototype 原型模式,每次通过 Spring 容器获取 prototype 定义的 Bean 时,容器都将创建一个新的 Bean 实例 需要保持会话状态的 Bean 3)request 4)session 5)global session
-
-
Bean 的生命周期
- Spring 容器可以管理 singleton 作用域 Bean 的声明周期,在此作用域下,Spring 能够精确的知道 Bean 何时被创建,何时初始化完成、何时被销毁
- 对于 prototype 作用域的Bean 只负责创建,实例交给客户端代码管理
-
Spring 基于 XML 装配 Bean
-
Java 1.5 后,提供而注解 Annotation功能
-
Spring3 定义了一系列的 Annotation
-
常用的注解如下:
-
1、@Component
- 可以使用此注解描述 Spirng 中的bean,但它是一个泛华的概念,仅仅表示一个组件(Bean),并且可以作用在任何层次,使用时只需将该注解标注在相应的类上即可
-
2、Repository
- 用于标注 DAO 层
-
3、Service
- 通常作用于业务层
-
4、Controller
- 通常作用于控制层,用于将控制层表示为 Spring 中的 Bean,功能和 @Component相同
-
5、@Autowired
- 用于对 Bean 的属性变量,属性的 set 方法及构造函数进行标注,配合对应的注解处理器完成 Bean 的自动配置工作,默认按照 Bena 的类型进行装配
-
6、@Resource
-
其作用与 Autowired 一样,其区别在于 @Autowired 默认按照类型配置,而 @Resource 默认按照 Bean 实例名称进行装配
-
@Resource 中有两个重要属性:name 和 type。
Spring 将 name 属性解析为 Bean 实例名称,type 属性解析为 Bean 实例类型。如果指定 name 属性,则按实例名称进行装配;如果指定 type 属性,则按 Bean 类型进行装配。
如果都不指定,则先按 Bean 实例名称装配,如果不能匹配,则再按照 Bean 类型进行装配;如果都无法匹配,则抛出 NoSuchBeanDefinitionException 异常。
-
-
7、@Qualifler
- 与 @Autowired 注解配置使用,会默认的按 Bean 类型装配修改名称装配,Bean 的实例名称由@Qulifler 注解的参数指定
-
-
Spring 自动装配 Bean
-