Spring学习笔记(一)bean的配置
1.IOC与DI
- IOC(Inversion of Control):其思想是 反 转 资 源 获 取 的 方 向 \color{blue}{反转资源获取的方向} 反转资源获取的方向。传统的资源查找方式要求组件向容器发起请求查找资源。作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动地将资源推送给它所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源。这种行为也被称为查找的被动形式。
- DI(Dependency injection)-IOC的另一种表述方式:即 组 件 以 一 些 预 先 定 义 好 的 方 式 ( 例 如 : s e t t e r 方 法 ) 接 受 来 自 如 容 器 的 资 源 注 入 \color{blue}{组件以一些预先定义好的方式(例如:setter方法)接受来自如容器的资源注入} 组件以一些预先定义好的方式(例如:setter方法)接受来自如容器的资源注入。
2.配置bean
2.1基于xml文件配置bean
- 基于xml配置bean
<!-- 配置bean:
class:bean的全类名,通过反射的方式在IOC容器中创建bean。所以要求bean中必须有无参构造的构造器。
id:标识容器中的bean。id唯一。
-->
<bean id="user" class="com.nl.spring.bean.User">
<property name="name" value="abc"></property>
</bean>
-
Spring容器
Spring提供了两种类型的IOC容器实现
-
BeanFactory:IOC容器的基本实现
-
ApplicationContext:是BeanFactory的子接口
-
几乎所有的应用场合都直接使用ApplicationContext而非底层的BeanFactory
-
-
ApplicationContext
ApplicationContext的主要实现类:
- ClassPathXmlApplicationContext:从类路径下加载配置文件
- FileSystemXmlApplicationContext:从文件系统中加载配置文件
ConfigurableApplicationContext扩展与ApplicationContext,新增两个主要方法:refresh()和close(),让ApplicationContext具有启动、刷新和关闭上下文的能力。
ApplicationContext在初始化上下文时就实例化所有单例的bean。
-
获取bean
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//1.利用id查找到容器中的bean
User user = context.getBean("user", User.class);
//2.通过类型返回容器中的bean。若有多个相同类型时会报错。
context.getBean(User.class);
2.2依赖注入的方式:属性注入、构造器注入
User类:
package com.nl.spring.bean;
public class User {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
-
属性输入
- 属性注入即通过setter方法注入Bean的属性值或依赖的对象。
- 属性注入使用
<property>
元素,使用name属性指定bean的属性名称,value属性或<value>
子节点指定属性值。
<bean id="user" class="com.nl.spring.bean.User"> <property name="name" value="abc"></property> </bean>
-
构造方法注入
- 通过构造方法注入bean的属性值或依赖对象,它保证了Bean实例在实例化后就可以使用。
- 构造器注入在
<constructor-arg>
元素里声明属性,<constructor-arg>
中没有name属性。
Student类:
package com.nl.spring.bean;
public class Student {
private String id;
private String name;
private Double avgScore;
public Student() {
}
public Student(String id, String name, Double avgScore) {
this.id = id;
this.name = name;
this.avgScore = avgScore;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAvgScore(Double avgScore) {
this.avgScore = avgScore;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", avgScore=" + avgScore +
'}';
}
}
- 普通属性赋值
配置:
<bean id="student" class="com.nl.spring.bean.Student">
<!--通过构造器参数索引-->
<constructor-arg value="0001" index="0"></constructor-arg>
<constructor-arg value="Andy" index="1"></constructor-arg>
<constructor-arg value="89.5" index="2"></constructor-arg>
</bean>
<bean id="student1" class="com.nl.spring.bean.Student">
<!--通过构造器参数类型-->
<constructor-arg type="java.lang.String" value=