Spring系列1–IOC

  • Post author:
  • Post category:其他



目录


1、spring简介


2、IOC


2.1 什么是IOC


2.2 IOC底层原理:


2.3 两个重要接口


2.4 Bean管理(XML)


2.4.1.创建对象


2.4.2.注入属性


2.4.3.xml注入其他类型的属性


2.4.4.xml注入集合属性


2.4.5.IOC操作Bean管理


2.4.6.bean的作用域


2.4.7.bean的生命周期


2.4.8.自动装配


2.4.9.外部属性文件


2.5 IOC的Bean管理(注解)


2.5.1创建对象


2.5.2 属性注入


2.5.3 纯注解开发


1、spring简介

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

2、IOC

2.1 什么是IOC

控制反转。把对象创建和对象之间的调用过程都交给spring管理,主要目的是减低代码的耦合度。

2.2 IOC底层原理:

(1)IOC的底层原理主要包括

xml解析

(注解解析),

工厂设计模式

以及

反射

(得到类的字节码文件)。

(2)IOC过程:

创建xml配置文件,配置要创建的对象,以及对象中间的引用关系;

创建工厂类;

解析xml文件;

通过反射创建对象。

2.3 两个重要接口

IOC的思想源于容器,使用容器来管理对象(对象的创建、获取、销毁等),底层基于工厂模式实现。Spring中提供IOC容器的两种实现方式,即两个接口。

(1)BeanFactory

IOC容器最基本的实现方式,Spring内部的使用接口,一般不提供给开发人员使用。特点是,加载配置文件时不会创建对象,在获取或使用对象时才会创建。

(2)ApplicationContext

是BeanFactory接口的子接口,提供了更加强大的功能,一般由开发人员使用。加载配置文件时会创建配置文件中的对象。

2.4 Bean管理(XML)

通俗的讲,当我们创建了一个容器(BeanFactory的实现类)后,spring会解析配置文件,然后跟据配置文件创建对象,并把这些对象放进容器中。使用时用户不需要自己再去创建对象,而是直接通过容器去获取,这便是spring的bean管理的核心。

2.4.1.创建对象

在spring的配置文件中,使用bean标签来创建对象,默认会调用类的无参构造方法

2.4.2.注入属性

使用set方法进行注入:实体类中必须有对应的set方法,动态代理生成对应的bean时会调用

使用构造方法注入:实体类中必须有对应的构造方法,动态代理生成对应的bean时会调用。

2.4.3.xml注入其他类型的属性

1. 特殊符号

转义:

使用CDATA:

<![CDATA[具体内容]]>

2. 外部bean

2.4.4.xml注入集合属性

1.注入数组

2.注入List

3.注入map

4.集合的元素设置为对象

2.4.5.FactoryBean

1. spring中包含两种bean,一种是普通bean,一种是工厂bean(FactoryBean)

2. 普通bean:

得到的对象类型就是在配置文件中定义的bean类型

定义:

获取:

3.工厂bean:

得到的对象类型可以和在配置文件中定义的bean类型不一样

(1)创建类,实现FactoryBean接口,覆写getObject()方法

(2)定义

(3)获取

FactoryBean的实现原理,在创建对象时,调用了getObject()方法,并将其返回值放入IOC容器中。

2.4.6.bean的作用域

单例(singleton)和多例(prototype),默认spring创建的对象为单例,可以设置为多例。

singleton和prototype的区别:scope设置为singleton,加载spring配置文件时创建对象;scope设置为prototype,调用getBean()时才会创建一个新的对象。

2.4.7.bean的生命周期

生命周期:对象创建->对象销毁的过程

(1)创建bean实例

(2)为bean里面的属性设置值和对其他bean的引用

(3)把bean的实例传递给bean的后置处理器,调用postProcessBeforeInitialization()。


将实现了BeanPostProcessor接口的类注入到容器中,生成后置处理器,这样容器会对所有的bean执行该后置处理器。

(4)调用bean里面的初始化方法

(5)把bean的实例传递给bean的后置处理器,调用postProcessAfterInitialization()。

(6)bean可以使用

(7)当容器关闭时,调用bean的销毁方法

2.4.8.自动装配

<bean>标签中有一个autowire属性,可以根据属性的类型(byType)和名称(byName)注入

byName:

byType:

2.4.9.外部属性文件

如数据库连接相关信息,将数据库信息写到database.properties文件中,然后在spring的配置文件中引用database.properties文件。

(1)加入context命名空间。

(2)编写database.properties文件

(3)<context:property-placeholder/>指定database.properties文件路径

(4)在spring配置文件中引用database.properties中的配置

2.5 IOC的Bean管理(注解)

2.5.1创建对象

@Component:普通bean

@Service:Service层

@Contoller:Web层

@Repository:dao层

(1)引入spring-aop依赖

(2)在spring配置文件中开启组件扫描

引入context命名空间

开启组件扫描<context:component-scan/>,告诉spring扫描哪些包里面的注解。

(3)在类上添加对应的注解 (默认生成的对象名称为该类名称的首字母小写)

(4)测试

2.5.2 属性注入

@AutoWired 根据属性类型进行自动注入

(1)创建dao对象,在对应的类上面加创建对象的注解(为验证确实是根据类型注入,这里将dao创建的对象名设置为dao)

(2)在Service类中属性上面加上注入属性的注解(

不需加属性的set方法

(3)测试

@Qualifier 根据属性名称进行注入

如果被注入的类型有多个对象,这时仅使用@AutoWired会抛异常NoUniqueBeanDefinitionException。

(1)创建类DemoDao1和DemoDao同时实现接口DemoDao

(2)在Service类中属性上面加上注解@AutoWired和@Qualifier

(3)测试

@Resource 可以根据类型也可以根据名称注入(javax自带的,不建议使用)

根据类型注入@Resource

根据名称注入@Resource(name = “被注入的对象名称”)

@Value 注入简单类型,@Value(value = “”)

2.5.3 纯注解开发

1.创建配置类ConfigClass,代替xml配置文件,@Configuration;@ComponentScan扫描包

2.new AnnotationConfigApplicationContext(ConfigClass.class)获取IOC容器

3.测试



版权声明:本文为weixin_40988088原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。