基本认识
IOC
即Inverse Of Control,控制反转。
区别于传统的java程序设计,用直接new对象的方法来创建对象,IOC思想是将我们设计好的对象交给Spring容器控制。
DI
即Dependency Injection,依赖注入。
由容器动态的将某个依赖关系注入到组件之中。
Spring的使用
1️⃣导包
Spring框架需要五个包
- spring-core
- spring-context
- spring-bean
- spring-aop
- spring-expression
只需要导入spring-contex
t即可,因为其他四个包都被它依赖。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
2️⃣创建容器
使用配置文件创建,配置文件名称:application(-xxx).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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- bean definitions here -->
bean标签的位置
</beans>
通过bean标签来完成对组件的注册,标签中一般有如下属性:
- id:组件在容器中的唯一标识
name:组件的名称,一般不写- class:返回类型的全类名
例如 :
<!-- bean definitions here -->
<bean id="userMapper" class="com.octavius.mapper.UserMapperImpl"/>
如果要建立组件之间的依赖关系,则需要使用property标签,该标签中有两个属性:
- name:依赖的组件中给被依赖组件设置值的set方法的名字
- ref:被依赖的组件的id
例如:
UserServiceImpl依赖UserMapperImpl:
public class UserServiceImpl implements UserService{
UserMapperImpl userMapper;
public void setUserMapper888(UserMapperImpl userMapper) {
this.userMapper = userMapper;
}
}
在配置文件中应作出如下配置:
<!-- bean definitions here -->
<bean id="userService" class="com.octavius.service.UserServiceImpl">
<property name="userMapper888" ref="userMapper"/>
</bean>
<bean id="userMapper" class="com.octavius.mapper.UserMapperImpl"/>
3️⃣取出容器中的组件
- 按照组件的id取
- 按照组件的Class类型取(仅当该组件的Class类型在容器中唯一的时候可用)
- 按照组件的id和Class类型一起取
@Test
public void test01(){
//ApplicationContext就是容器的具体存在
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
//方式一
UserMapper userMapper1 = (UserMapper) context.getBean("userMapper");
//方式二
UserMapper userMapper2 = context.getBean(UserMapper.class);
//方式三
UserMapper userMapper3 = context.getBean("userMapper", UserMapper.class);
}
BeanFactory
Spring的本质是一个bean工厂(beanFactory)或者说bean容器
提供容器具体存在的ApplicationContext接口有以下几个实例:
- ClassPathXmlApplicationContext
- FileSystemXmlApplicationContext
- AnnotationConfigApplicationContext
- AnnotationConfigWebApplicationContext
- XmlWebApplicationContext
Bean的实例化
1️⃣构造方法
①无参构造
默认的就是无参构造,例如:
<bean id="userService" class="com.octavius.service.UserServiceImpl">
<property name="userMapper888" ref="userMapper"/>
</bean>
<bean id="userMapper" class="com.octavius.mapper.UserMapperImpl"/>
②有参构造
需要添加constructor-arg
标签,标签中有两个属性:
- name:有参构造方法的形参名
- ref:容器中组件的id
- value:当参数为基本类型时,形参的值
<bean id="userService" class="com.octavius.service.UserServiceImpl">
<constructor-arg name="userMapper" ref="userMapper"/>
<property name="userMapper888" ref="userMapper"/>
</bean>
<bean id="userMapper" class="com.octavius.mapper.UserMapperImpl"/>
2️⃣工厂
①静态工厂
在bean标签中添加factory-method
属性,属性的值就是生产组件的方法名。
例如:
②实例工厂
在bean标签中添加两个属性:
- factory-bean:生产出的组件的id
- factory-method:生产组件的方法名
例如:
③FactoryBean
FactoryBean接口中定义了一个方法:getObject()(注册的组件类型和该方法的返回值相关)
BeanFactory和FactoryBean之间的区别:
- BeanFactory:生产全部组件
- XXXFactoryBean:生产特定的xxx组件的
组件的作用域
在bean标签中添加scope属性,有两种类型:
- singleton:组件在容器中以单例的形式存在
- prototype:每一次获得组件的时候都去获得一个新的