Inversion of Control 控制反转
配置文件
- 引入配置文件的方法的参数可以多个。
- 在一个总的配置文件中用
<import resource="xx.xml"/>进行引用。
IOC 注入
set 方法注入
P 标签注入
在 Spring 2.5 之后,为了 set 注入的方便,引入了这个方法。
<bean id="userService" class="org.example.service.UserService"
p:name="haha"
p:userDao-ref="userDao">
</bean>
对于其他类对象
package org.example.service;
import org.example.dao.UserDao;
public class UserService {
private UserDao UserDao;
public void setUserDao(UserDao userDao) {
UserDao = userDao;
}
public void test() {
System.out.println("UserService test()...");
UserDao.test();
}
}
<bean id="userService" class="org.example.service.UserService">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="org.example.dao.UserDao">
<!-- collaborators and configuration for this bean go here -->
</bean>
property 中的 name 指定的就是类中的属性名字。
对于内部属性
常用有String、Integer、Map、List
private String name;
public void setName(Stringname) {
this.name =name;
}
<bean id="userService" class="org.example.service.UserService">
<property name="userDao" ref="userDao"/>
<property name="name" value="haha"/>
</bean>
即可进行使用。
构造器注入
在构造的地方注入
<constructor-arg name="构造器中的参数" ref="那个参数的Bean id"/>
如果出现循环依赖,需要通过 set 注入解决。
自动注入
@Resource
<?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>
<http://www.springframework.org/schema/beans/spring-beans.xsd>
<http://www.springframework.org/schema/context>
<http://www.springframework.org/schema/context/spring-context.xsd>">
<!-- 自动化注入-->
<context:annotation-config/>
<!-- 配置bean-->
<bean id="userService" class="com.sundingyi.service.UserService"/>
<bean id="userDao" class="com.sundingyi.dao.UserDao"/>
</beans>
在配置文件中如此书写,另外,在需要的类中添加@Resource关键字
// 注入 UserDao
@Resource
private UserDao userDao;
//set
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
- 通过 bean 中的 id 进行查找。
- 如果没有找到,则由 class 进行检索。
- 需要属性的类,可以提供 set 方法,也可以不提供,以后一般都不需要提供。
- 注解也可以声明在 set 方法字段上。
- 可以设置注解的 name 属性,值要与 bean 标签的 id 属性值一致。它的优先级大于 class。
@Resource(name="userDao") - 同样可以为接口进行设置@Resource,如果这个接口只被实现了一次,那么就可以直接使用,如果这个接口被实现了多次,那么就必须指定
name="实现的类”
@Autowired
- 默认通过类型寻找。
- 可以提供 set 也可以不提供。
- 可声明在属性基本或 set 级别
- 可以添加@Qualifier ,选择 value 属性值查找 bean 对象(必须设置,且与 bean 中的 id 一致)
扫描器
bean 对象的统一管理,简化开发配置,提高开发效率。
-
设置自动化扫描范围。
-
在需要被自动化实例化的类上添加注解。
使用如下注解加在类上:
@Repository : 用在 Dao 层
@Service: 用在 Service 层
@Controller: 用在 Controller 层
@Component: 用在任意层
<?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>
<http://www.springframework.org/schema/beans/spring-beans.xsd>
<http://www.springframework.org/schema/context>
<http://www.springframework.org/schema/context/spring-context.xsd>">
<context:component-scan base-package="包名"/>
</beans>
bean 的作用域
scope 属性
有两个值 singleton 和 prototype.
singleton 单例作用域
IOC 容器在启动时,会自动将所有在单例作用域中的 bean 对象实例化,并设置到单例缓存池中。
当使用了lazy-init=“true” 时,那么就会变为只有被使用时才会被实例化。
默认会被设置成false ,优点如下。
- 可以提前发现潜在的配置问题。
- bean 对象在启动时就会被设置在单例缓冲池中,使用时不需要再去进行实例化,提高效率。
prototype 原型作用域
IOC 容器在启动时,不会把 prototype 设置到单例缓存池中。而是每次使用时都会实例化一个新的。
用的并不多。
什么对象适合作为单例对象?(交给 IOC 容器实例化)
无状态的对象。即不存在会改变当前对象状态的成员变量。一般是 Controller 层,Service 层,Dao层。实体类、工具类则不适合。
bean 的生命周期
共有四个阶段:
定义
在配置文件中定义 bean, 通过 bean 标签对应 bean 对象。
初始化
IOC 容器启动时,自动实例化 bean 对象。
使用
- 使用 BeanFactory
- 使用 ApplicationContext
销毁
ApplicationContext 的 close()
将对象实例化的控制过程,转交给一个外部容器产生。