本博文参考传智播客、黑马程序员视频讲座
IoC(控制反转)
Inverse of Control
控制反转,把本来由程序员创建对象和依赖注入的工作转交给spring完成。
DI(依赖注入)
Dependency Injection
注入方式:set方法注入+构造方法注入+字段注入(相当于类成员是public,可以直接调用赋值)
注入类型:值类型注入(8种基本数据类型)+引用类型注入
spring容器
BeanFactory接口(每次获取对象时才会创建对象)
ApplicationContext接口:(每次容器启动时就会创建容器中配置的所有对象),一般从类路径下加载配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
也可以从硬盘绝对路径加载配置文件ApplicationContext ac = new FileSystemXmlApplicationContext("硬盘上的绝对路径");
由于BeanFactory接口是在获取对象的时候才创建对象,而ApplicationContext在容器启动的时候就把配置文件中配置的对象都创建出来了,那就比较耗费资源了,又由于硬件发展的比较好了,一般直接用ApplicationContext容器,因为其功能比原始的BeanFactory强大的多。除非是硬件资源非常匮乏的情况下,才会考虑用BeanFactory。
spring配置详解—Bean元素
<!-- 把User对象交给spring容器管理 -->
<!-- Bean元素:spring容器所管理的对象的信息
class属性:被管理对象的全限定名
name属性:被管理对象的名字,可重复,可使用特殊字符,(建议用name而不是id)
id属性:与name属性类似,不可重复,不可使用特殊字符
-->
<bean name="user" class="cn.ccnuacmhdu.bean.User"></bean>
Bean的scope属性
常用的两个值:singleton(默认)和prototype
singleton:在spring容器中只有一个对象实例
prototype:多例,每次获得都会创建一个新的实例
另外还有request属性值和session属性值,在web环境下,对象与request或session生命周期一致。
Bean的生命周期属性
init-method方法:spring在创建对象之后立即调用
destroy-method方法:spring在销毁所有容器对象之前调用
<bean name="user" class="cn.ccnuacmhdu.bean.User" init-method="init" destroy-method="destroy"></bean>
spring配置详解—创建对象的方式
工程依旧使用原来的工程:https://blog.csdn.net/ccnuacmhdu/article/details/84988785
空参构造
为User对象提供空参构造方法,证明spring默认使用空参构造创建对象。
public User() {
System.out.println("空参构造方法。。。");
}
其他方式还有静态工厂方式(调用静态工厂的某个静态方法创建对象)和实例工厂模式(调用实例工厂中的某个非静态方法创建对象),了解下即可,具体配置方式略。
spring配置详解—模块化配置
主配置文件中引入其他spring配置文件:
<import resource="去掉src之前的路径后剩下的路径/applicationContext.xml"/>
spring配置详解—属性注入方式
set方法注入
<bean name="user" class="cn.ccnuacmhdu.bean.User">
<!-- 为User对象的属性注入值 -->
<property name="name" value="Tom"></property>
<property name="age" value="19"></property>
</bean>
构造方法注入
提供构造方法:
public User(String name, Car car) {
super();
this.name = name;
this.car = car;
}
书写配置文件:
<bean name="car" class="cn.ccnuacmhdu.bean.Car">
<property name="name" value="大众"></property>
<property name="price" value="120"></property>
</bean>
<!-- 构造方法注入 -->
<bean name="user2" class="cn.ccnuacmhdu.bean.User">
<constructor-arg name="name" value="Lucy"></constructor-arg>
<constructor-arg name="car" ref="car"></constructor-arg>
</bean>
注意:如果配置文件中还存在刚才的user配置,并且user仅仅提供了一个构造方法,没有提供空参构造。由于只要在配置文件中配置了user,spring容器就会去创建他,必定要通过空参构造,但是找不到空参构造,报错!!!
变态情况1
user有下面两个构造方法
public User(String name, Car car) {
super();
this.name = name;
this.car = car;
}
public User(Car car, String name) {
super();
this.name = name;
this.car = car;
}
用index属性指定形参顺序,确定使用哪个构造方法:
变态情况2
指定每个参数的类型:
复杂类型注入
package cn.ccnuacmhdu.bean;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class Collection {
private Object[] arr;
private List list;
private Map map;
private Properties props;
public Object[] getArr() {
return arr;
}
public void setArr(Object[] arr) {
this.arr = arr;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Properties getProps() {
return props;
}
public void setProps(Properties props) {
this.props = props;
}
@Override
public String toString() {
return "Collection [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", props=" + props + "]";
}
}
<!-- 复杂类型注入 -->
<!-- 数组 -->
<bean name="collection" class="cn.ccnuacmhdu.bean.Collection">
<!-- 数组只有一个元素的时候可以用下面这一句代码 -->
<!-- <property name="arr" value="Tom"></property> -->
<!-- 多个元素注入 -->
<property name="arr">
<array>
<value>lucy</value>
<value>jack</value>
<ref bean="car" />
</array>
</property>
<!-- list只有一个元素的时候可以用下面这一句代码 -->
<!-- <property name="list" value="jack"></property> -->
<property name="list">
<list>
<value>lucy</value>
<value>jack</value>
<ref bean="car" />
</list>
</property>
<property name="map">
<map>
<entry key="key1" value="value1"></entry>
<entry key="key1" value-ref="car"></entry>
<entry key-ref="car" value-ref="car"></entry>
</map>
</property>
<property name="props">
<props>
<prop key="name">name</prop>
<prop key="password">password</prop>
</props>
</property>
</bean>
另外还有p名称空间注入和spel方式注入,具体略。
注解配置代替XML
略。