上一篇文章中,简单实现和介绍了ssh开发环境的搭建和spring IOC(控制反转)的xml方式配置实现,这里要根据bean标签的一些属性来写一下spring IOC的一些细节
applicationContext.xml文件中配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="mydao"
class="net.xinqushi.dao.impl.UserDAOMySqlImpl" >
</bean>
<bean id="service" class="net.xinqushi.service.impl.UserServiceImpl"
>
<property name="dao" ref="mydao"></property>
</bean>
</beans>
我们看到spring ioc主要作用是:自动创建对象实例初始化属性,而且还可以组织装配对象。下面bean标签中的属性可以让装配、注入、加载的功能更强大。
1.自动装配 autowire
不同于上面在配置文件中,为action装配service,为service装配dao。这里可以自动进行装配。最常用的有两种方式:
(1)byName
顾名思义,这里是找和名字一样的对象类进行自动装配。这里以service中的dao变量为例(这里详见上一篇博客文章http://blog.csdn.net/zlj1217/article/details/59015498)。
要根据在service中定义变量的名字在配置文件中找到id值相同的bean标签进行实例化。 这里就不用在service的bean标签之下配置property标签,因为service需要的是为名字为dao的变量初始化对象,会自动找在配置文件中 id为dao的配置生成类对象。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dao"
class="net.xinqushi.dao.impl.UserDAOMySqlImpl" >
</bean>
<bean id="service" class="net.xinqushi.service.impl.UserServiceImpl"
autowire="byName">
</bean>
</beans>
根据相同类型自动装配,这里的type 是在service中找到与定义dao一样,类型是UserDAO的类。这里UserDAOFileImpl和UserDAOMySqlImpl 是实现了UserDAO接口,所以也是相同类。这里的名字和dao不相同也是可以的
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dao"
class="net.xinqushi.dao.impl.UserDAOMySqlImpl" >
</bean>
<bean id="service" class="net.xinqushi.service.impl.UserServiceImpl"
autowire="byType">
</bean>
</beans>
但是这样当有两个同样Type的配置时,会产生冲突。所以一般是使用ByName方式进行自动装配。
(3)可以在beans标签中设置default-autowise 为byName的方式
2.注入方式:
有两种注入属性的方式
(1)setter方式注入 对应着配置文件中 对应设置 property 标签(这里是手动装配)
setter方式注入:例如注入service中的dao。就要在实现UserService接口的类中定义dao 生成其setter
其中设置byName自动装配 只适合setter这种方式注入
(2)构造方法注入 对应设置 construction-arg标签
构造方法注入:这时不需要setter和getter ,而是生成参数是dao的 构造函数
在配置文件applicationContext.xml中配置这个构造方法注入 标签为constrauctor-arg 属性为 name 和 ref
示例:构造器注入
package net.xinqushi.service.impl;
import net.xinqushi.dao.UserDAO;
import net.xinqushi.model.User;
import net.xinqushi.service.UserService;
public class UserServiceImpl implements UserService {
private UserDAO dao;//在spring的配置中初始化dao层的实现
//通过setter方式注入dao
// public UserDAO getDao() {
// return dao;
// }
// public void setDao(UserDAO dao) {
// this.dao = dao;
// }
//通过构造器方式注入dao
public UserServiceImpl(UserDAO dao) {
super();
this.dao = dao;
}
@Override
public void add(User user) {
// TODO Auto-generated method stub
dao.addUser(user);
}
}
对应着的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="mydao"
class="net.xinqushi.dao.impl.UserDAOMySqlImpl" >
</bean>
<bean id="service" class="net.xinqushi.service.impl.UserServiceImpl"
>
<constructor-arg name="dao" ref="mydao"></constructor-arg>
</bean>
</beans>
3.不同属性的输入方式,只做了解 就是不只是能在配置文件中注入对象
简单属性注入:int,String,float
集合属性注入:Map,List,Set
4.scope属性的4.单实例和多实例
在bean标签的属性中有scope属性,可取值有singleton(单例),prototype(原型,模板),request,session,global session 默认是singleton。
单实例对象的意思就是:在使用该类实例时,都是同一个实例。比如像对数据进行操作的类DAO中没有定义成员属性,只是定义了一些对数据操作的方法,这样就可以设置为单实例类。