Spring IoC

控制反转、依赖注入

IoC 控制反转

控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责
DI(依赖注入)是其的一种实现方式,目的是创建对象且组装对象之间的关系

Bean容器的初始化

BeanFactroy提供配置结构和基本功能,加载并初始化Bean、ApplicationContext保存了Bean对象并在Spring中使用
ClassPathXmlApplicationContext 用于加载classpath下的xml、FileSystemXmlApplicationContext用于加载指定目录下的xml

初始化常通过加载配置文件方式,配置文件applicationContext.xml放在src根目录下

1
2
3
4
5
//加载配置文件
String xmlPath = "applicationContext.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
//获得bean对象像
UserService userService = (UserService) applicationContext.getBean("userService");

xml文件配置

1
2
3
4
5
6
<!-- dao -->
<bean id="userDao" class="com.ljc.dao.impl.UserDaoImpl"></bean>
<!-- service -->
<bean id="userService" class="com.ljc.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>

装配Bean

默认构造

1
2
<!-- 必须提供默认构造 -->
<bean id="" class="">

静态工厂

1
2
<!-- 用于生成实例对象,所有的方法必须是static -->
<bean id="" class="" factory-method="静态方法">

实例工厂

1
2
3
4
5
<!-- 必须先有工厂实例对象,通过实例对象创建对象,提供所有的方法都是"非静态"的 -->
<!-- 创建工厂实例 -->
<bean id="myBeanFactory" class="com.ljc.MyBeanFactory"></bean>
<!-- factory-bean与工厂实例id对应-->
<bean id="userService" factory-bean="myBeanFactory" factory-method="普通方法"></bean>

Scope Bean作用域

  1. singleton 单例,默认值
  2. prototype 每次请求时创建新的实例,destroy方式不生效
  3. request 每次http请求时创建实例且仅在当前requset内有效
  4. session 同上,当前session有效

Bean生命周期

1
2
<!-- 目标方法执行前后执行后,将进行初始化或销毁 -->
<bean id="" class="" init-method="初始化方法名称" destroy-method="销毁的方法名称">

Spring属性注入方式

设值注入

1
2
3
<bean id="userService" class="com.ljc.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>

构造方法注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<constructor-arg> 用于配置构造方法一个参数argument
name :参数的名称
value:设置普通数据
ref:引用数据,一般是另一个bean的id值
index :参数的索引号.从0开始,如果只有索引,匹配到了多个构造方法时,默认使用第一个
type :确定参数类型
<bean id="user" class="com.ljc.bean.User" >
<!-- 方式一 -->
<constructor-arg name="username" value="jack"></constructor-arg>
<!-- 方式二 -->
<constructor-arg index="1" type="java.lang.Integer" value="2"></constructor-arg>
</bean>

setter方法注入

1
2
3
4
5
6
7
8
9
10
<!-- 普通数据 -->
<property name="" value="值">
<property name="">
<value></value>
<!-- 引用数据 -->
<property name="" ref="另一个bean">
<property name="">
<ref bean="另一个bean"/>

集合注入

1
2
3
4
5
6
7
8
<property>添加子标签
数组:<array>
List:<list>
Set:<set>
Map:<map> map存放k/v 键值对,使用<entry>描述
Properties:<props> <prop key=""></prop>
普通数据:<value>
引用数据:<ref>

基于注解装配Bean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Component取代<bean class=""> @Component("id") 取代 <bean id="" class="">
@Component衍生注解(功能一样,方便标识)
@Repository //dao层
@Service://service层
@Controller //web层
依赖注入 //给私有字段设置,也可以给setter方法设置
普通值:@Value("")
引用值:
方式1:按照类型注入
@Autowired
方式2:按照名称
@Autowired
@Qualifier("名称")
@Resource("名称")
生命周期
初始化:@PostConstruct
销毁:@PreDestroy
作用域
@Scope("prototype")
<!-- 注解使用前提,添加命名空间,让spring扫描含有注解类 -->
<!-- 组件扫描,扫描含有注解的类 -->
<context:component-scan base-package="含有注解的类的包名"></context:component-scan>