Spring第一天 IOC 控制反转JavaBean规范 Bean的作用域 生命周期 依赖注入
Spring:是软件框架,是软件半成品,包含了很多组件。
核心组件:ioc容器
IOC控制反转:
- 由代码自己控制对象的创建,称为:主动控制(自己new对象,自己炒番茄炒蛋)
- 有一个组件容器管理对象,应用从容器中获得对象,称为:控制反转(spring创建对象,厨师做酸菜鱼)
面试时问到什么是控制反转?—》由spring容器创建并管理对象,称为控制反转
Ioc容器就是Java Bean组件容器
1.用于创建管理JavaBean对象,
2.用于替代传统的工厂模式,
3.由于其提供了DI功能,可以实现组件的解耦
案例:
使用spring容器自动创建对象:
- 导包,导入spring核心组件ClassPathXmlApplicationContext
- 写一个类,里面什么都不做,输出一个helloword
- 写一个xml文件,做一个登记,写上类的全名,
相当于在饭馆吃饭写给厨师的菜单,而spring就是这个厨师
4.new一个xml:new ClassPathXmlApplicationContext(“beans.xml”)
其实就是spring容器在启动的时候根据xml文件创建了一个对象
如何使用这个对象 - Bean=ctx.getBean(“demo”);
- Println(bean);
新建项目:
- 新建一个maven项目,选择一个jar(桌面应用程序),之后用war(网页应用程序)
- 导包,在pom配置文件中添加如下代码
org.springframework
spring-context
4.3.9.RELEASE
3.创建一个类,里面写上hello,world
4.写配置文件:去下载一个spring的配置文件,复制到resouce文件夹下面,在配置文件后面加上
- 写一个类,在类中创建一个Spring容器,需要提供配置文件
ClassPathXmlApplicationContext ctx=
new ClassPathXmlApplicationContext(“beans.xml”);
spring启动的时候会自动加载配置文件beans.xml,并且根据配置文件的内容创建DemoBean对象,spring容器提供了getBean方法,用于获取IOC创建的对象
DemoBean obj=(DemoBean)ctx.getBean(“demo”);
System.out.println(obj);
缺少包:把m2文件夹删除,然后项目右键-》maven-》updateforce
@Override:告诉java编译器,检查后续方法是否是重写
Java默认在object上定义的方法是toString方法,toString默认方法返回值输出类名
Id不能重复,重复的时候会报错
###Java Bean规范
Java类的声明规范,是一套通行的规则,spring默认情况下采用java bean规范
- 有包package
- 有无参数构造器 e.g:public TestBean(){ a=80;}
- 需要实现序列化接口 e.g:public class Foo implements Serializable
- 包含由getxxx 和setxxx 方法声明的“Bean属性”XXX
Get set方法就是bean属性
–“Bean属性不是对象属性
–对象属性是指 在类中声明的实例变量
–一般情况下 对象属性和Bean属性同名
例子
Class Student{
Int age=5;//对象属性
Int getAge(){//Bean属性age
Return age;
}
Int getOld(){//包含只读的“Bean属性” old
Return age;
}
Int setOld(){//包含只写的“Bean”属性 old
Return age;
}
}”
@Before 之前,在测试案例之前执行的方法,一般用于初始化
@After//之后,在测试案例之后执行的方法,一般用于回收资源
@Test//测试案例方法
可以把不同的方法分别放在@test下面,当想调用哪个方法的时候就选中这个方法然后运行
Alias 别名 就是给Bean起了新的“绰号”
String可以使用id或name属性声明Bean
#Bean的作用域
- 默认情况下Spring管理的Bean对象是“单例”的(单例:指在一个应用软件中,对象永远唯一的现象称为“单例”)
1.在容器启动时候,创建Bean对象
2.在getBean调用时候,返回Spring容器中的Bean对象,多次调用getBean方法返回的是同一个对象的引用
2.在配置文件bean标签上scope属性,可以设置这种“多例”的Bean对象
1.<bean id=…class=…scope=”prototype”>prototype原型
2.Spring容器启动时候不创建对象
3.每次调用getBean创建新对象
#对象生命周期管理 - 单例对象的时候
- 创建对象时候执行 init-method属性指定的方法
- 关闭容器时候 执行deatroy-method属性指定的方法
- 多例对象时候
- 创建对象时候执行 init-method属性指定的方法,每个对象都会调用一次init方法
- 关闭容器时候,不会执行destroy-method属性指定的方法
#对象延迟实例化
当设置了lazy-init="true"以后,在容器初始化时候不会创建Bean对象,在第一次使用时候创建Bean对象
e.g:
#DI
全称Dependency Injection 依赖注入
基本原理是将一起工作具有关系的对象,通过构造方法参数或方法参数传入建立关联,因此容器的工作就是创建bean时注入那些依赖关系。
IOC是一种思想,而DI是实现IOC的主要技术途径
DI主要有两种注入方式,即Setter注入和构造器注入
把id为axe的对象注入给worker
Name=”axe”表示将使用Bean属性方法进行注入
Ref=”axe”表示将id为axe的Bean对象注入到Bean属性中
例子:光头强砍树的斧头,是李师傅做的斧子
用的时候就将斧子对象注入到光头强中