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容器中。关于元素的常用属性如下表所示:
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,容器并不管理 不持有
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