logo头像

一路过来,不过游牧自己。。

SSM之Spring(四)


这节主要讲bean的作用域和bean的自动装配,内容比较少,也比较简单!

1、bean的作用域

关于bean的作用域,主要有以下几种:
singleton单列 整个容器中只有一个对象实例,在一般情况下默认是单列
prototype原型 每次获取bean都产生一个新的对象
request 每次请求时创建一个新的对象
session 在会话的范围内时一个对象
global session 只在portlet下有用,表示是application
application 在应用范围中一个对象
注意:在整合Structs和Spring的时候,需要将action设为scope=”prototype”

2、bean的自动装配

(1)byName自动装配

我们说每次写程序都要写一大堆配置文件,是不是很烦,那有什么方法可以简化这种操作么?自动装配autowire就是这样一个东西,简化了Spring的一个配置!
我们采取前面那个userDao的例子
下面来看一个例子:

1
2
3
<bean id="userDao" class="cn.dao.impl.UserDaoMysqlimpl"/>
<bean id="service" class="cn.service.impl.UserServiceimpl" autowire="byName">
</bean>

如果将这个配置文件写成这样,那运行的结果就是:

1
Mysql获取用户数据

为什么会是这样呢?因为这里我们用了autowire的关键字!!autowire=“byName”这样我们就可以按照Name去自动装配!执行过程就是先在Test中中装载Service类,这样就会找到id=service的,然后找到UserServiceimpl;UserServiceimpl有什么呢?

1
2
3
4
5
6
7
8
9
public class UserServiceimpl implements UserService {
private UserDao userDao=null;
public void setUserDao(UserDao userdao){
this.userDao=userdao;
}
public void getuser(){
userDao.getuser();
}
}

可以看到,这时候我们就会去找userdao,找到userdao的bean时,我们找到的是UserDaoMysqlimpl,所以得到的是一个UserDaoMysqlimpl对象,这时候调用它的getuser输出的就是Mysql获取用户数据!
如果我们改一下:

1
2
3
<bean id="mysql" class="cn.dao.impl.UserDaoMysqlimpl"/>
<bean id="service" class="cn.service.impl.UserServiceimpl" autowire="byName">
</bean>

这样其实加载到那个UserServiceimpl的时候,那个userdao是找不到的!所以这个时候会报错!
autowire自动装配,简化Spring的操作:
byName根据名称(set方法去掉set后面的那个名字)去查找相应的bean,如果有则装配上!
但是如果每个都这么写,其实也是很麻烦的,那怎么办呢?很简单,在头文件最后的xsi:schemaLocation=最后写上
default-autowire=”byName”,就是

1
2
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">

这样全局看来就是全部设的是自动byName装配!

(2)byType自动装配

根据类型进行自动装配,不用去管bean的id,这什么意思呢?
下面看这个配置:

1
2
3
<bean class="cn.dao.impl.UserDaoMysqlimpl"/>
<bean id="service" class="cn.service.impl.UserServiceimpl" autowire="byType">
</bean>

这时候,可以看到,运行的结果还是:

1
Mysql获取用户数据

因为这个时候运行到userDao的时候,他会自动去找,然后找到UserDaoMysqlimpl,就会有这个结果
但是这种方法有很大的缺陷:

1
2
3
4
<bean class="cn.dao.impl.UserDaoMysqlimpl"/>
<bean class="cn.dao.impl.UserDaoOracleimpl"/>
<bean id="service" class="cn.service.impl.UserServiceimpl" autowire="byType">
</bean>

如果采用这种呢,同一种类型有两种bean,这时候程序就会报错!所以建议慎用byType!

(3)constructor自动装配

constructor当通过构造器实例注入bean时,适用byType的方式装配构造方法,其实于原理都是一样的,只不过换了一种方式,原来是set方法来装载bean,但也可以通过构造方法去构造!

1
2
3
4
public UserServiceimpl(UserDao userDao) {
super();
this.userDao = userDao;
}

然后在配置文件中修改:

1
2
3
<bean id="userDao" class="cn.dao.impl.UserDaoMysqlimpl"/>
<bean id="service" class="cn.service.impl.UserServiceimpl" autowire="constructor">
</bean>

这个时候也可以输出结果:

1
Mysql获取用户数据

这节基本结束,往下就要学习代理这一重要思想!

学习之路漫漫长,多走路,多思考!
——————YoungerFary

微信打赏

赞赏是不耍流氓的鼓励