Spring IoC容器和bean
Spring IoC容器
IoC也称为依赖注入(DI),可以帮我们创建对象 管理对象之间的依赖和管理对象的生命周期.
那么什么是依赖呢?
例如,在A类的方法中,实例化了B类的对象并调用其方法以完成特定功能,我们就说A类依赖于B类.
既然A类依赖于B类,那么Spring是怎么将B类注入进A类的呢?
Spring依赖注入有如下几种:
set注入
set注入也就是使用set方法进行注入,假设有一个SpringAction
,类中需要实例化一个SpringDao
对象,那么就可以定义一个private
的SpringDao
成员变量,然后创建SpringDao
的set
方法.
public class SpringAction {
//注入对象springDao
private SpringDao springDao;
//一定要写被注入对象的set方法
public void setSpringDao(SpringDao springDao) {
this.springDao = springDao;
}
public void ok(){
springDao.ok();
}
}
构造器注入
这种方式的注入是指带有参数的构造函数注入,看下面的例子,我创建了两个成员变量SpringDao和User,但是并未设置对象的set方法,所以就不能支持第一种注入方式,这里的注入方式是在SpringAction的构造函数中注入,也就是说在创建SpringAction对象时要将SpringDao和User两个参数值传进来:
public class SpringAction {
//注入对象springDao
private SpringDao springDao;
private User user;
public SpringAction(SpringDao springDao,User user){
this.springDao = springDao;
this.user = user;
System.out.println("构造方法调用springDao和user");
}
public void save(){
user.setName("卡卡");
springDao.save(user);
}
}
在XML文件中同样不用<property>的形式,而是使用<constructor-arg>标签,ref属性同样指向其它<bean>标签的name属性:
<!--配置bean,配置后该类由spring管理-->
<bean name="springAction" class="com.bless.springdemo.action.SpringAction">
<!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置-->
<constructor-arg ref="springDao"></constructor-arg>
<constructor-arg ref="user"></constructor-arg>
</bean>
<bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>
<bean name="user" class="com.bless.springdemo.vo.User"></bean>
解决构造方法参数的不确定性,你可能会遇到构造方法传入的两参数都是同类型的,为了分清哪个该赋对应值,则需要进行一些小处理:
下面是设置index,就是参数位置:
<bean name="springAction" class="com.bless.springdemo.action.SpringAction">
<constructor-arg index="0" ref="springDao"></constructor-arg>
<constructor-arg index="1" ref="user"></constructor-arg>
</bean>
这里推荐一个非常好的文章,写的非常好非常详细.
<context:annotation-config/> 标签是啥?
它的作用是隐式的向Spring容器注册
AutowiredAnnotationBeanPostProcessor,
CommonAnnotationBeanPostProcessor,
PersistenceAnnotationBeanPostProcessor,
RequiredAnnotationBeanPostProcessor
这4个BeanPostProcessor.注册这4个bean处理器主要的作用是为了你的系统能够识别相应的注解.
这里有一篇文章可以很好的解释
Bean
Bean是啥?
我们将类放到Spring IoC容器中,让IoC帮我们管理,这些就称为Bean.
例如:
<bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>
就是一个Bean.
Bean范围
Bean范围指的就是,Bean实例化的方式,单例还是多例.
singleton: 无论我们获取多少次都是获取的同一个对象.默认范围
prototype: 每次获取都会创建一个新的对象.
request: 在每次请求时会创建一个对象.
session: 每次会话的时候建立一个.