spring基础知识-IOC
1 Spring概述
Spring 是轻量级的开源的 JavaEE 框架
Spring 有两个核心部分:IOC 和 AOP。
- IOC:控制反转,把创建对象过程交给 Spring 进行管理
- AOP:面向切面,不修改源代码进行功能增强
Spring 特点 :
- 方便解耦,简化开发
- Aop 编程支持
- 方便程序测试
- 方便和其他框架进行整合
- 方便进行事务操作
- 降低 API 开发难度
2 IOC
概念:控制反转,把对象创建和对象的调用过程交给spring进行管理。
目标:降低耦合度。
底层原理:xml,反射,工厂模式
2.1 两大接口
Spring提供IOC容器两种实现方式(两个接口)
BeanFactory:Spring内部使用的接口,不提倡开发人员使用。特点:加载配置文件时不会创建对象,获取对象时才会创建对象。
ApplicationContext:BeanFactory的子接口,提供了更多更强大的功能,一般由开发人员使用。特点:加载配置文件时会把配置文件里的对象进行创建。
- FileSystemXmlApplicationContext:绝对路径,从盘符开始算起
- ClassPathXmlApplicationContext:相对路径,从src开始算起
Bean管理是指两个操作:Spring创建对象 和 Spring注入属性。
- Bean管理有两种操作方式:基于xml配置文件方式实现 和 基于注解方式实现
2.2 基于XML操作Bean
在基于xml创建对象的时候需要做到:

- 在Spring配置文件中使用bean标签来创建对象
- bean标签有很多属性,常用属性:
- id:唯一标识
- class:类路径
- 创建对象时,默认执行无参构造函数
方法一:
为对应类提供set方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public class User {
private String userName;
private String userAge;
public void setUserName(String userName) {
this.userName = userName;
}
public void setUserAge(String userAge) {
this.userAge = userAge;
}
public String getUserName() {
return userName;
}
public String getUserAge() {
return userAge;
}
}在xml配置文件中通过property标签进行属性注入
1
2
3
4
5<!--配置User对象-->
<bean id="user" class="com.oymn.spring5.User">
<property name="userName" value="haha"></property>
<property name="userAge" value="18"></property>
</bean>创建对象
1
2
3ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml");
User user = applicationContext.getBean("user", User.class);
System.out.println(user.getUserName() + " " + user.getUserAge());
注入值
空值
1 | |
属性值含有特殊符号
假设现在userName属性需要赋值为 < haha >
如果像上面那样直接在value中声明的话会报错,因为包含特殊符号 <>

注入外部Bean
有两个类:UserService和UserDaoImpl,其中UserDaoImpl实现UserDao接口
1 | |
使用ref来指定外部bean
1 | |
注入内部bean
嵌套bean标签实现
1 | |
方法二:
提供有参构造
1
2
3
4
5
6
7
8
9
10
11public class User {
private String userName;
private String userAge;
public User(String userName, String userAge){
this.userName = userName;
this.userAge = userAge;
}
}xml中通过constructor-arg标签进行属性注入
1
2
3
4
5<!--配置User对象-->
<bean id="user" class="com.oymn.spring5.User">
<constructor-arg name="userName" value="haha"></constructor-arg>
<constructor-arg name="userAge" value="18"></constructor-arg>
</bean>
注入值
级联赋值
emp类中有ename和dept两个属性,其中dept有dname属性,写法二需要emp提供dept属性的get方法。
1 | |
注入属性集合-数组/List/Map/Set
1 | |
1 | |
如果是对象的话,写法:集合+外部bean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<!--创建多个 course 对象-->
<bean id="course1" class="com.atguigu.spring5.collectiontype.Course">
<property name="cname" value="Spring5 框架"></property>
</bean>
<bean id="course2" class="com.atguigu.spring5.collectiontype.Course">
<property name="cname" value="MyBatis 框架"></property>
</bean>
<!--注入 list 集合类型,值是对象-->
<property name="courseList">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
把集合注入部分提取出来
使用 util 标签,这样不同的bean都可以使用相同的集合注入部分了。
1
2
3
4
5
6
7
8
9<!--将集合注入部分提取出来-->
<util:list id="booklist">
<value>易筋经</value>
<value>九阳神功</value>
</util:list>
<bean id="book" class="com.oymn.spring5.Book">
<property name="list" ref="booklist"></property>
</bean>
Bean的作用域
在Spring中,默认Bean是单实例对象。但是可以通过修改Bean标签中的scope属性,让单例对象变为多实例对象。

Bean的生命周期
- 通过构造器创建 bean 实例(无参数构造)
- 为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
- 把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
- 调用 bean 的初始化的方法(需要进行配置初始化的方法)
- 把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
- bean 可以使用了(对象获取到了)
- 当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
示例
1 | |
后置处理器
1 | |
xml创建对象
1 | |
测试
1 | |
执行结果

XML自动装配
- 根据指定的装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入。
- 根据属性名称自动装配:要求 emp中属性的名称dept 和 bean标签的id值dept 一样,才能识别。
- 根据属性类型自动装配:要求同一个xml文件中不能有两个相同类型的bean,否则无法识别是哪一个
通过外部文件操作Bean
- 导入德鲁伊连接池jar包
- 创建外部属性文件,properties格式文件,写数据库信息

- 引入context名称空间,并通过context标签引入外部属性文件,使用“${}”来获取文件中对应的值

2.3 基于注解操作Bean
- 格式:@注解名称(属性名=属性值,属性名=属性值,……)
- 注解可以作用在类,属性,方法。
- 使用注解的目的:简化xml配置
创建对象
- @Component:将该类标记为一个组件,Spring会自动扫描该类,并将其实例化为一个Bean。
- @Service:一般用于Service层
- @Controller:一般用于web层
- @ Repository:一般用于Dao层
基于注解进行属性注入
@Autowired:根据属性类型自动装配
1
2
3
4public interface StuDao {
public void add();
}
1
2
3
4
5
6
7@Repository
public class StuDaoImpl implements StuDao {
@Override
public void add() {
System.out.println("StuDaoImpl");
}
}
1
2
3
4
5
6
7
8
9
10
11@Component(value="stuService")
public class StuService {
@Autowired
public StuDao stuDao;
public void add(){
System.out.println("addService");
stuDao.add();
}
}
@Qualifier:根据属性名称自动装配
当遇到一个接口有很多实现类时,只通过@Autowire是无法完成自动装配的,所以需要再使用@Qualifier通过名称来锁定某个类
1
2
3
4
5
6
7
8
9
10
11
12@Component(value="stuService")
public class StuService {
@Autowired
@Qualifier(value="stuDaoImpl") //这样就能显式指定stuDaoImpl这个实现类
public StuDao stuDao;
public void add(){
System.out.println("addService");
stuDao.add();
}
}
@Resource:可以根据类型注入,也可以根据名称注入
1
2
3
4
5
6
7
8
9
10
11
12@Component(value="stuService")
public class StuService {
//@Resource //根据类型进行注入
@Resource(name="stuDaoImpl") //根据名称进行注入
public StuDao stuDao;
public void add(){
System.out.println("addService");
stuDao.add();
}
}
@Value:注入普通类型属性
1
2@Value(value = "abc")
private String name;
完全基于注解开发
创建配置类替代XML文件
1 | |