目录
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.测试