先贴出一个常用的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" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="userDAO" class="cn.wqy.DAO.UserDAOImpl">
</bean>
<bean id="userService" class="cn.wqy.biz.UserServiceImpl">
<property name="userDAO" ref="userDAO"></property>
</bean>
</beans>
DI:动态注入,即我们不需要在类中去new一个或者利用JNDI去新建立一个对象,而是将这个权利交给Spring容器,我们告诉容器我们需要什么对象,容器就自动将对象注入。注入的方式有三种:
①setter方法注入(最常用)
UserService.java:
package cn.wqy.biz;
import cn.wqy.DAO.UserDAO;
import cn.wqy.model.User;
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
@Override
public void addUser(User user) {
// TODO Auto-generated method stub
userDAO.add(user);
}
}
如果初始化一个UserService对象,就必须要先初始化一个UserDAO对象,在类中我们写了UserDAO对象的setter方法,然后在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" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="userDAO" class="cn.wqy.DAO.UserDAOImpl">
</bean>
<bean id="userService" class="cn.wqy.biz.UserServiceImpl">
<property name="userDAO" ref="userDAO"></property>
</bean>
</beans>
利用property标签,初始化一个名为userDAO的对象,参考的是上面已经初始化的bean对象userDAO,找到了这个对象之后,注入
,完成初始化。
②构造方式注入:
在UserService.java中加入有参构造方法:
public UserServiceImpl(UserDAO userDAO) {
super();
this.userDAO = userDAO;
}
之后在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" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="userDAO" class="cn.wqy.DAO.UserDAOImpl">
</bean>
<bean id="userService" class="cn.wqy.biz.UserServiceImpl">
<!-- <property name="userDAO" ref="userDAO"></property> -->
<constructor-arg>
<ref bean="userDAO"/>
</constructor-arg></span>
</bean>
</beans>
调用构造方法,将对象注入了需要实例化的对象中。
如果在这个构造方法中不止有一个对象需要初始化,比如说在本例中有两个userDAO对象需要传递,或者有一个userDAO对象和一
个其他类对象,怎么办呢?可以利用根据类型和根据索引传参。
根据索引:
<constructor-arg index="0" ref="userDAO1"></constructor-arg>
<constructor-arg index="1" ref="userDAO2"></constructor-arg>
根据类型:
<constructor-arg type="cn.wqy.DAO" ref="userDAO1"></constructor-arg>
<constructor-arg type="int" value="1"></constructor-arg>
③接口注入,在IoC中实用性远不如以上两种,因此在此不做介绍。
除了注入对象,Spring的IoC机制同样可以实现简单属性(int、String etc.)的注入。首先,写好属性对应的setter方法,之后,在对
应bean标签下作如下配置:
<property name="id" value="1"></property>
<property name="name" value="233wqy"></property>
不过在自己的开发中,这样的写法很少,基本不会在xml中做对基础属性的配置。但是Spring会提供一些写好的bean,可以帮助我们
实现特定功能(比如数据源的创建),其中会包含对基础属性的配置。
如果需要注入的是一个集合(set、list、map),就需要用到集合装配。在类中写好对应的setter方法后:
<property name="set">
<set>
<value>1</value>
<value>2</value>
</set>
</property>
<property name="list">
<list>
<value>1</value>
<value>2</value>
</list>
</property>
<property name="map">
<map>
<entry key="a" value="1"></entry>
<entry key="b" value="2"></entry>
</map>
</property>
同样,可以利用容器完成自动装配的功能,利用bean标签下的autowire属性。常用的有byName、byType、default、no。
no:不采用自动装配
default:采用beans标签下default-autowire所设置的装配模式
byName:根据名字进行装配,当找到和实体类中所写的属性名相同的bean后将其装配。
byType:根据类型进行装配,当找到和实体类中所要装配的属性类型相同的bean后将其装配。
一般来说,自动装配我们都是不用的,因为很容易导致注入的问题。
Bean的作用范围:
在<bean>标签中有一个scope属性,可以控制该bean的范围,其取值有以下几个:
其中,request、session、global session都是涉及到web,是在spring MVC经常用到的,然而我们往往会用其他的框架代替spring
的MVC,所以着重关注前两个。
取scope=”singleton“时,不管你取多少个该bean,都取的是同一个bean,也是spring的默认值。
取scope="prototype"时,每一次取一个bean,都是一个全新的bean。
Bean的生命周期:
①lazy-init属性:这是bean标签的一个属性,默认为false。当设置为true时,容器初始化时其不被初始化,被用到时才初始化。在
Beans标签下有default-lazy-init属性,可以为所有bean设置默认的初始化选项。
②init-method、destroy-method:bean标签的属性,可以设置当对象被初始化以及被销毁时执行的函数,函数实体在该类中。
IoC:Inversion of Control,控制反转,不是一种技术,而是一种设计思想,它以为着将你设计好的对象交给容器控制,而不是传统
的在对象内部直接控制。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容
器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测
试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
有一个讲解IoC很棒的blog:http://www.cnblogs.com/xdp-gacl/p/4249939.html