此文章是根据网上某某有关spring讲解的视频,做的笔记,讲的很好
Bean的创建规则
applicationContext.xml文件简单配置
在其中一个类中在空参构造中输出一句话
-
BeanFactory对象:
提供的是一种延迟加载的思想,bean对象什么时候使用,什么时候进行创建
断点打在19行,当加载完配置文件时候,并没有创建bean对象
只有在使用的时候,才创建了bean对象;继续下一步,执行到21行时
bean对象被创建
- ApplicationContext对象:
容器一加载就直接创建bean对象,采用的是立即加载思想
将断点打在第12行,进入断点调试,下一步看日志信息,在还没有使用到该对象的情况下,就已经被创建
ApplicationContext对象的两个实现类
ClassPathXmlApplicationContext:加载类路径下面的配置文件(一般我们使用这个类)
FileSystemXmlApplicationContext:可以加载磁盘路径任意位置的配置文件
Bean的创建方式
-
第一种:通过无参构造函数创建对象(开发常用)
该方式,如果没有无参构造的话,会创建失败,报异常
-
第二种:使用工厂创建对象
静态工厂创建对象:需要使用bean标签的factory-method属性,指定静态工厂的创建对象的方法
工厂类
applicationContext.xml配置
实例工厂创建对象
工厂类
apllicationContext.xml配置
Bean的作用范围
通过bean的scope属性进行配置
属性的取值:
singleton:单例(默认)
prototype:多例(当我们让spring接管struts2的action创建时,action必须配置)
request:作用范围是一次请求,和当前请求的转发
session:一次会话
globalsession:作用范围是一次全局会话
Bean的生命周期
涉及到的bean标签的两个属性:
init-method :初始化方法,需要在bean对象中 ,写一个 初始化的方法,进行配置验证
destroy-method :销毁方法,,需要在bean对象中 ,写一个 销毁的方法,进行配置验证
bean书写
单例:
创建:当容器一加载,就会创建
存在:只要容器存在,对象就会存在
销毁:容器销毁,对象就销亡
applicationContext.xml配置
运行结果
多例:
创建:每次使用时,创建对象
活着:只要对象在使用中,就一直存在
销毁:当对象长时间不使用,并且也没有其他的对象引用,将由垃圾回收器进行回收
applicationContext.xml配置
结果:
销毁方法没有执行,原因是因为spring不知道什么时候次对象不被使用
Spring的IOC思想
依赖注入的两种方式(非注解版):
- 通过set方式进行注入
涉及的标签:property
标签属性:
name:指定set方法的名称
===================上面指定给哪个参数赋值,下面两个是赋值的内容===================
value:指定基本数据类型或String类型的数据
ref:指定其他的bean类数据
标签出现的位置:
写在bean标签里面
2.通过构造函数注入
涉及的标签:constructor-arg
标签属性:
type:指定参数的类型
index:指定参数的索引位置,从0开始
name:指定参数的名称,(一般使用)
===================上面三个是给哪个参数赋值,下面两个是赋值的内容===================
value:指定基本数据类型或String类型的数据
ref:指定其他的bean类数据
标签出现的位置:
写在bean标签里面
通过set方法注入复杂类型(结构相同,标签可以互换)
list/set/array
map/props
基于注解的IOC
- 用于创建bean对象
@Component
作用:相当于在applicationContext.xml中配置了一个bean标签;
可以出现的位置:类上面
属性: value :指的是 bean的id,当不写的时候,默认是当前类名,首字母小写
由此注解衍生三个注解:
@Repository: 一般用在持久层
@Service: 一般用在业务层
@Controller: 一般用在表现层
- 注入数据类型
@Autowired:
作用:自动按照类型注入。只要有唯一的类型匹配就可以注入成功。如果注入的bean容器中符合的类型不唯一的时候,就会将变量名作为bean的id,在容器中查找,如果找到的话,也是可以注入成功,如果没有,就会抛出异常
原理:首先①根据类型去匹配,看是否有符合类型的bean对象;
如果存在,且存在多个,再根据变量的名字去跟符合类型的对象的bean的id名字是否相同,如果都不同,则抛出异常,
@Qualifier:
作用:在自动按照类型注入的基础上,按照bean的id进行注入;在跟类成员注入数据时,此注解需要和@Autowired配合使用,不可以独立使用;但是再给方法的形参注入数据时,可以独立使用;
属性:value:用于指定bean的id
@Resource(name= " "):
作用:直接按照bean的id注入
属性:name:用于指定bean的id
以上的注解适用于注入其他bean类型。用于注入基本类型和String类型,需要使用@Value注解===
@Value:
作用:用于注入基本类型和String类型数据,可以借助spring的el表达式读取properties文件的配置
属性:value:用于指定注入的数据的值
取消xml配置文件,编写配置类
视屏截图
spring整合Junit步骤
-
第一步:添加spring-test-4.2.4RELEASE依赖
-
第二步 :使用@RunWith注解;替换junit
使用SpringJunit4ClassRunner -
第三步:在测试类上面添加ContextConfiguration注解 纯注解的使用 ,使用class属性; class={字节码对象}
有xml配置的,使用locations属性; locations= {""}