Spring框架–控制反转(IoC)
最近在学习Spring框架,分享一下写的笔记。
传统的程序开发中,需要调用对象时,通常由调用者来创建被调用的实例,对象时调用者new出来的。
Spring框架中创建对象时交给IoC容器创建再推送给调用者,整个流程完成反转,所以是控制反转。
使用控制反转
-
创建Maven工程,pom.xml添加依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>SpringTest</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.6.RELEASE</version> </dependency> </dependencies> </project>
-
通过IoC创建对象,在配置文件中添加需要管理的对象,XLM格式的配置文件,文件名自定义。
<beans>
<bean id="student" class="com.chen.Student">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="22"></property>
</bean>
</beans>
- 从IoC中获取对象
ApplicationContext appcontext = new ClssPathXmlApplicationContext("spring.xml");
Student stu = (Student)appcontext.getBean("student");
配置文件
- 通过配置
bean
标签来完成对对象的管理id
:对象名class
:对象的模板类。(所有交给IoC容器来管理的类必须有无参构造函数。)
- 对象的成员变量通过
property
标签完成赋值name
:成员变量名value
:成员变量值(基本数据类型,String可以直接赋值,如果是其他的引用类型,不能通过value来赋值ref
:将IoC中另外一个bean赋给当前的成员变量(DI)
<beans>
<bean id="student" class="com.chen.Student">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="22"></property>
<property name="address" ref="address"></property>
</bean>
<bean>
<bean id="address" class="com.chen.Address">
<property name="id" value="1"></property>
<property name="name" value="科技路"></property>
</bean>
</bean>
</beans>
通过运行时类获取bean
- 通过无参构造函数
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring");
Student student = (Student)applicationContext.getBean(Student.class);
System.out.println(student);
这种方法存在一个问题,配置文件中一个数据类型的实例,否则会抛出异常,因为没有唯一的bean
通过有参构造创建bean
- 在实体类中创建对应的有参构造函数
- 配置文件
<bean id="student" class="com.chen.Student">
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="age" value="22"></constructor-arg>
</bean>
给bean注入list
<property name="addresses">
<list>
<ref bean="address"></ref>
<ref bean="address2"></ref>
</list>
</property>
scope作用域
spring管理的bean时根据scope来生成的,表示bean的作用域
- singleton:单例,表示通过Spring容器获取的bean是唯一的。
- prototype:原型,表示通过Spring容器获取的bean是不同的。
- request:请求,表示在一次HTTP中有效。
- session:会话,表示在一个用户会话内有效。
request和session只适用与Web项目,大多数情况下,使用单例和原型较多。