Inversion of Control 控制反转
<import resource="xx.xml"/>
进行引用。在 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 注入解决。
<?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;
}
@Resource(name="userDao")
name="实现的类”
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>
有两个值 singleton 和 prototype.
IOC 容器在启动时,会自动将所有在单例作用域中的 bean 对象实例化,并设置到单例缓存池中。
当使用了lazy-init=“true”
时,那么就会变为只有被使用时才会被实例化。
默认会被设置成false
,优点如下。
IOC 容器在启动时,不会把 prototype 设置到单例缓存池中。而是每次使用时都会实例化一个新的。
用的并不多。
无状态的对象。即不存在会改变当前对象状态的成员变量。一般是 Controller 层,Service 层,Dao层。实体类、工具类则不适合。
共有四个阶段:
在配置文件中定义 bean, 通过 bean 标签对应 bean 对象。
IOC 容器启动时,自动实例化 bean 对象。
ApplicationContext 的 close()
将对象实例化的控制过程,转交给一个外部容器产生。