您的位置:首页 > 编程语言 > Java开发

Spring学习——(二)IOC、DI以及常用xml配置

2016-03-27 21:19 405 查看
先贴出一个常用的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: