IOC(控制反转)和DI(依赖注入)其起的作用是管理一切注册到其中的依赖以及将这些依赖提供给请求依赖的依赖者。
Spring IOC容器对Bean的生命周期进行管理的过程:
-通过构造器或工厂方法创建Bean实例。
-为Bean的属性设置值和对其他Bean的引用。
-调用Bean的初始化方法。
-当容器关闭时,调用Bean的销毁方法。
基本使用流程:
首先创建两个javabean ,均省略了getter和setter方法。
public class Student {
private String name;
private String sex;
private Teacher teacher;
private List<String> list;
private Set<String> set;
private Map<String, String> map;}
public class Teacher {
private String name="王老师";}
接下来是一个bean.xml配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--set注入 value的两种方式-->
<bean name="teacher" class="bean.Teacher"></bean>
<bean id="student" class="bean.Student">
<property name="name" value="张三"></property>
<property name="sex">
<value>男</value>
</property>
<property name="teacher" ref="teacher"></property>
</bean>
<!--构造器注入 除了index还可以用name标签-->
<bean id="student1" class="bean.Student">
<constructor-arg value="李四" index="0"></constructor-arg>
<constructor-arg value="女 " index="1"></constructor-arg>
<constructor-arg ref="teacher" index="2"></constructor-arg>
</bean>
<!--还有一种P标签注入 -->
<!--第二部分:集合 -->
<bean id="student2" class="bean.Student">
<property name="list">
<list>
<value>A</value>
<value>B</value>
<value>C</value>
</list>
</property>
<property name="set">
<set>
<value>A</value>
<value>B</value>
<value>C</value>
</set>
</property>
<property name="map">
<map>
<entry>
<key><value>key1</value>
</key>
<value>value1</value>
</entry>
<entry>
<key><value>key2</value>
</key>
<value>value2</value>
</entry>
</map>
</property>
</bean>
<!--第三部分:自动装配 (会自动引用与对象类型一致的bean)-->
<bean id="student3" class="bean.Student" autowire="byName">
<property name="name" value="张三"></property>
<property name="sex" value="男"></property>
</bean>
</beans>
这个是测试文件。
public class Test {
public static void main(String[] args) {
//对应的映射文件
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
//对应的映射文件中bean的id,生成obj对象,后面的参数将其转化为Student类
Student student=context.getBean("student",Student.class);
System.out.println(student.getName()+"---"+student.getSex()+"---"+student.getTeacher().getName());
Student student1=(Student)context.getBean("student1");
System.out.println(student1.getName()+"---"+student1.getSex()+"---"+student1.getTeacher().getName());
Student student2=context.getBean("student2",Student.class);
System.out.println(student2.getList().size()+"---"+student2.getSet().size());
Map<String, String> map=student2.getMap();
Set<String> set=map.keySet();
Iterator<String> it=set.iterator();
while (it.hasNext()) {
System.out.println(map.get(it.next()));
}
Student student3=(Student)context.getBean("student3");
System.out.println(student3.getName()+"---"+student3.getSex()+"---"+student3.getTeacher().getName());
//作用域默认为singleton,单例模式
Student stu0=context.getBean("student",Student.class);
Student stu1=context.getBean("student",Student.class);
Student stu2=context.getBean("student3",Student.class);
System.out.println(stu0.equals(stu1));
System.out.println(stu0==stu1);
System.out.println(stu0.equals(stu2));
System.out.println(stu0==stu2);
}
}
结果为:
张三---男---王老师
李四---女 ---王老师
3---3
value1
value2
张三---男---王老师
true
true
false
false