Spring-ioc

Spring-ioc

IOC

  • IOC ( Inversion of Control IOC)控制反转

控制反转,其实就是将创建对象的权利交给spring容器,程序员不需要自己new 对象,只需要告诉容器,需要创建哪些对象

优点

通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

方便解耦,简化开发:spring 容器帮助我们创建bean(对象),并维护bean之间的依赖管理

Spring的核心容器

容器:是一个map 用来盛放Bean(对象)

容器作用:就是在启动时帮助我们创建bean,持有bean,并维护bean的生命周期

Spring容器会负责控制程序之间的关系,而不是由程序代码直接控制。Spring为我们提供了两种核心容器,分别为BeanFactory和ApplicationContext

1.BeanFactory

创建BeanFactory实例时,需要提供Spring所管理容器的详细配置信息,这些信息通常采用XML文件形式来管理,其加载配置信息的语法如下:

BeanFactory是一个接口,规定了所有的功能,但是具体实现必须有子类XmlBeanFactory完成

BeanFactory beanFactory = 
           new XmlBeanFactory(new FileSystemResource("F: /applicationContext.xml"));

2.ApplicationContext

ApplicationContext是BeanFactory的子接口,是另一种常用的Spring核心容器。它由org.springframework.context.ApplicationContext接口定义,不仅包含了BeanFactory的所有功能,还添加了对国际化、资源访问、事件传播等方面的支持。创建ApplicationContext接口实例,通常采用两种方法。

ApplicationContext & Beanfactory区别?

ApplicationContext 不但具有容器获取bean相关的功能,增加了 国际化、资源访问、事件传播 等功能

国际化:可以根据用户所在地区不同,返回对应地区的语言

​                中国-----相应中文

​                美国----相应英文

资源访问: 可以更加灵活的访问容器配置文件(来源本地磁盘,当前应用所在资源目录,网络地址)

事件传播:主要可以监听容器创建的整个生命周期的回调方法


1通过ClassPathXmlApplicationContext创建
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);

ClassPathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作

2.通过FileSystemXmlApplicationContext创建
 ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);

FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。

控制反转&依赖注入

控制反转IOC

控制反转, Inversion of Control IOC。在使用Spring框架之后,**对象的实例不再由调用者来创建,而是由Spring容器来创建,**Spring容器会负责控制bean之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是控制反转。

总结:控制反转就是是将创建对象的权利交给容器,容器帮助我们创建对象,而不是我们直接new 对象

依赖注入

DI的全称是Dependency Injection,中文称之为依赖注入

从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。

依赖注入,简称DI,是IOC控制反转的另外一种形式,更强调bean之间的依赖关系

Bean的配置

描述

Bean的配置使用xml配置,XML配置文件的根元素是,中包含了多个子元素,每一个子元素定义了一个Bean,并描述了该Bean如何被装配到Spring容器中。关于元素的常用属性如下表所示:

image-20200520230325929

name & id 区别?

id 是bean 的唯一标识,一个bean只能有一个id

name 也是bean 的标识,一个bean可以有多个 name ,也可以一个

id name的值 不能和容器中其他 bean的id 或者 name 重复,--------》id 和 name的值都具有唯一性

id 和 name 都是bean的名字,都可以通过BeanFactory中getBean(“id 或者name”) 获取

Bean的实例化

在Spring中,要想使用容器中的Bean,也需要实例化Bean。实例化Bean有三种方式,分别为

  • 构造器实例化、 我们前边使用的 都是构造器实例化,使用类的无惨构造方法创建对象
  • 静态工厂方式实例化
  • 实例工厂方式实例化

(其中最常用的是构造器实例化)。

ioc:容器帮助我们创建对象(new 对象),

静态工厂方式实例化,实例工厂方式实例化 作用:是为我们开了一个后门,允许我们自定义创建对象,但是最终调用还是容器调用,--------------》容器创建对象时,可以调用我们自定义的方式创建对象

Bean的作用域

bean的作用域,说就是bean的存活时间,生命周期(是否被容器持有和管理)

bean的作用域有7种,最常用的有单例和原型

单例:就是整个容器中,bean声明一次,容器中只有一个对应bean,而且被容器持有

原型:在容器中,bean声明一次,容器启动并没有创建bean,但是每次获取bean,都会创建bean , bean可以有无数个,但是创建bean,容器并不管理 不持有

image-20200520232155741

bean的生命周期

bean的生命周期,就是bean的生老病死,他和bean作用域息息相关

构造方法
init 初始化方法
.....  bean 创建完成
destory 销毁方法    

Spring容器可以管理Bean部分作用域的生命周期。有关说明具体如下

singleton

Spring容器可以管理singleton作用域的Bean的生命周期,在此作用域下,Spring能够精确的知道该Bean何时被创建,何时初始化完成,以及何时被销毁。

单例bean的生命周期:

​ 容器创建

​ 单例的bean创建 (构造方法 ,init 初始化方法)

​ …

​ 容器销毁之前 单例bean 调用 destory 销毁

​ 容器销毁

单例的bean,容器不但负责bean的创建,并且持有 ,维护bean的整个生命周期

prototype(原型)

prototype作用域的Bean,Spring只负责创建,当容器创建了Bean实例后,Bean的实例就交给客户端代码来管理,Spring容器将不再跟踪其生命周期。

​ 原型bean的生命周期:

​ 容器创建

​ 原型bean 不会创建 (只有在我们 从容器中获取原型 bean时容器负责创建,不持有该bean==========》构造方法 ,init 初始化方法)

​ 。。。。。

​ 容器销毁之前 不会销原型的bean( 不调用bean 的 destroy 方法)

​ 容器销毁

总结

单例的bean: 容器又生又养

原型的bean:容器只生不养

Bean的装配

基于XML的装配

  • <property 装配

使用setter方法注入,必备条件:Bean类必须有一个无参构造方法,Bean类必须为属性提供setter方法

  • 构造方法注入

<constructor-arg 对应构造方法的每一参数,index为下标,从0开始,还可使用name装配

基于Annotation的装配

@Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作。

解释:主要是标记在属性变量上将容器中其他的bean的引用,赋值到当前变量

@Qualifier:与@Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。

解释:@Qualifier 不能单独使用,需要**@Autowired** 配合才能使用,完成bean 依赖注入

@Resource:其作用与Autowired一样。@Resource中有两个重要属性:name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实例类型。

@Resource == @Autowired + @Qualifier

//    @Autowired  // 根据类型进行注入若有,多个类型的实例,需要配合   @Qualifier("studentDaoImpl2")
//    @Qualifier("studentDaoImpl2")

    @Resource()  // 默认按照注解的字段名称进行装配,  若没有找到根据类型装配,如果对应类型的实例有多个需要限定
    private StudentDao studentDao ;
生成Bean的注解

相当于xml 中的 ,用于声明bean,后续进行创建

@Component:用于描述Spring中的Bean,它是一个泛化的概念,仅仅表示一个组件。

​ 声明一个bean,一个组件

@Repository:用于将数据访问层(DAO)的类标识为Spring中的Bean 。

​ 只用于 dao层(持久层) bean 的标记 ---------》声明bean

@Service:用于将业务层(Service)的类标识为Spring中的Bean。

​ 只用于 业务层(Service) 标记---------》声明bean

@Controller:用于将控制层(Controller)的类标识为Spring中的Bean 。

​ 只用于控制层 标记 ---------》声明bean

如果当前生成的bean 既不是 dao, service,controller ,都用@Component 进行声明

1.半自动注解装配 annotation-config

开启注解处理器 @Autowired @ Resource 、@ PostConstruct、@ PreDestroy 相关注解注入生效

2.自动注解 context:component-scan

Controller)的类标识为Spring中的Bean 。

​ 只用于控制层 标记 ---------》声明bean

如果当前生成的bean 既不是 dao, service,controller ,都用@Component 进行声明

1.半自动注解装配 annotation-config

开启注解处理器 @Autowired @ Resource 、@ PostConstruct、@ PreDestroy 相关注解注入生效

2.自动注解 context:component-scan

扫描 当前包下面的注解@Component @Controller @Service @Repository,生成实例,并装配 @Autowired @Resource

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值