Spring IOC配置与应用

本文详细介绍了Spring框架中的XML配置方法,包括如何解决XML不给提示的问题、不同类型的依赖注入方式、简单属性及集合的注入,并展示了配置连接池的具体步骤。

1.FAQ:XML不给提示:
a) window – preferences – xml – xml catalog
b) User Specified Entries – add
i. Location: D:\share\0900_Spring\soft\spring-framework-2.5.6\dist\resources\spring-beans-2.5.xsd
ii. URI: file:///D:/share/0900_Spring/soft/spring-framework-2.5.6/dist/resources/spring-beans-2.5.xsd
iii. KeyType: Schema Location
iv. Key: http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
配置的是xml里的相关参数:

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

具体XML教程去看网盘下的《尚学堂马士兵视频教程_XML_AJAX_DOM4J_JavaDB_MetaData.rar》。

<?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-2.5.xsd">
<bean id="u" class="com.dao.impl.UserDaoImpl">
  </bean>
  <bean id="userService" class="com.service.UserService">
    <property name="userDao" ref="u"></property>
  </bean>
</beans>     

2.注入类型

在spring配置文件中,bean标签是创建一个对象,ref标签是参考一个对象。
a) setter(重要)
bean.xml文件中:

<bean id="userService" class="com.service.UserService">
    **<property name="userDao" ref="u"></property>**
  </bean>

类UserService中:

public class UserService {
    private UserDao userDao;

    public void add(User u){
        this.userDao.save(u);
    }

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

b) 构造方法(可以忘记)【具体参看Spring Framework 开发参考手册】
beans.xml中:

<bean id="userService" class="com.service.UserService">
        <!-- <property name="userDao" ref="u"></property> -->
        <constructor-arg>
            <ref bean="u"/>
        </constructor-arg>
      </bean>

UserService中建立UserDao的构造器:

public UserService(UserDao userDao) {
        super();
        this.userDao = userDao;
    }

报这个错java.lang.IllegalStateException: BeanFactory not initialized or already closed,是因为Spring实例化BeanFactory的时候是默认到classPath下面查找名为applicationContext.xml的文件。
c) 接口注入(可以忘记)

3. id vs. name
beans.xml中的bean标签的id可以用name代替,而且name可以用特殊字符。

4. 简单属性的注入
UserDaoImpl类中的两个简单属性

private int daoId;
private String daoStatus;

可以在beans.xml中设置值

<bean id="userDao" class="com.dao.impl.UserDaoImpl">
        <property name="daoId" value="0"></property>
        <property name="daoStatus" value="good"></property>
</bean>

元素通过人可以理解的字符串来指定属性或构造器参数的值。正如前面所提到的,JavaBean PropertyEditor将用于把字符串从java.lang.String类型转化为实际的属性或参数类型。

主要实现:配置连接池

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

  <!-- results in a setDriverClassName(String) call -->
  <property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property name="url">
    <value>jdbc:mysql://localhost:3306/mydb</value>
  </property>
  <property name="username">
    <value>root</value>
  </property>
  <property name="password">
    <value>masterkaoli</value>
  </property>
</bean>

和 元素中也可以使用’value’ 属性,这样会使我们的配置更简洁,比如下面的配置:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

  <!-- results in a setDriverClassName(String) call -->
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
  <property name="username" value="root"/>
  <property name="password" value="masterkaoli"/>
</bean>

Spring团队更倾向采用属性方式(使用value元素)来定义value值。

5.bean的生命范围scope

singleton:在每个Spring IoC容器中一个bean定义对应一个对象实例。
prototype:一个bean定义对应多个对象实例。

<bean id="u" class="com.dao.impl.UserDaoImpl" scope="prototype">
    <property name="daoId" value="0"></property>
    <property name="daoStatus" value="good"></property>
</bean>

6.集合装配(很少用,不重要)
对集合set、list、map进行装配。
beans.xml配置:

        <property name="sets">
            <set>
                 <value>1</value>
                 <value>2</value>
            </set>
        </property> 

        <property name="lists">
            <list>
                <value>3</value>
                <value>4</value>
                <value>5</value>
            </list>
        </property>

        <property name="map">
            <map>
                <entry>
                    <key>
                        <value>key</value>
                    </key>
                    <value>value</value>
                </entry>
                <entry>
                    <key>
                        <value>435345</value>
                    </key>
                    <value>983749</value>
                </entry>
            </map>
          </property>

UserDaoImpl中声明三个集合,生成对应set、get方法。

private Set<String> sets;
    private List<String> lists;
    private Map<String,String> map;

JUnit测试

public void testAdd() throws Exception {

        ApplicationContext factory = new ClassPathXmlApplicationContext("beans.xml");

        UserDao dao = (UserDao) factory.getBean("u");

        System.out.println(dao);
}

测试的时候屡次不成功,思前想后没有问题,复制了报错trace仔细看了一下,是beans.xml里的lists的L大写了。。。以后测试报错的时候最好复制trace仔细查看就好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值