Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】

前言

在写完Spring第二和第三篇后,去读了Spring In Action这本书…发现有知识点要补充,知识点跨越了第二和第三篇,所以专门再开一篇博文来写…java

经过java代码配置bean

因为Spring的自动装配并不能将第三方库组件装配到应用中,因而须要显式装配配置。显示装配有两种方式spring

  • 经过java代码装配bean
  • 经过XML装配bean

Spring In Action做者首推使用自动装配的功能,然后是经过java代码配置bean,最后才用XML文件配置的方式..markdown

那么怎么经过java代码来配置Bean呢??app

  • 编写一个java类,使用@Configuration修饰该类
  • 被@Configuration修饰的类就是配置类

编写配置类

@org.springframework.context.annotation.Configuration
    public class Configuration {

    }

使用配置类建立bean

  • 使用@Bean来修饰方法,该方法返回一个对象。
  • 无论方法体内的对象是怎么建立的,Spring能够获取获得对象就好了。
  • Spring内部会将该对象加入到Spring容器中
  • 容器中bean的ID默认为方法名
 @org.springframework.context.annotation.Configuration public class Configuration { @Bean public UserDao userDao() { UserDao userDao = new UserDao(); System.out.println("我是在configuration中的"+userDao); return userDao; } }
  • 测试代码:要使用@ContextConfiguration加载配置类的信息【引入test包】
package bb;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;

/** * Created by ozc on 2017/5/11. */
//加载配置类的信息
@ContextConfiguration(classes = Configuration.class)
public class Test2 {

    @Test
    public void test33() {

        ApplicationContext ac =
                new ClassPathXmlApplicationContext("bb/bean.xml");

        UserDao userDao = (UserDao) ac.getBean("userDao");

        System.out.println(userDao);
    }
}

这里写图片描述


使用配置类实现对象依赖

Spring in Action有两种方法(但我测试不出来,若是会的请在评论去告诉我.….)函数

  • 第一种(测试不出来)
import org.springframework.context.annotation.Bean;

@org.springframework.context.annotation.Configuration
public class Configuration {

    @Bean()
    public UserDao userDao() {

        return new UserDao();
    }

    @Bean
    public UserService userService() {

        //直接调用@bean的方法
        return new UserService(userDao());
    }

}

  • 第二种(测试不出来)
import org.springframework.context.annotation.Bean;

@org.springframework.context.annotation.Configuration
public class Configuration {

    @Bean()
    public UserDao userDao() {

        return new UserDao();
    }

    @Bean
    public UserService userService(UserDao userDao) {

        //经过构造函数依赖注入
        return new UserService(userDao);
    }

}

这里写图片描述


  • 若是我直接经过构造器传入的话,那么报错了
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.context.annotation.Bean;

@org.springframework.context.annotation.Configuration
public class Configuration {

    @Bean()
    public UserDao userDao() {

        return new UserDao();
    }

    @Bean(autowire = Autowire.BY_TYPE)
    public UserService userService(UserDao userDao) {

        return new UserService(userDao);
    }

}

这里写图片描述


  • 我测试中只有经过这种方法才能拿到userDao的引用。
public class Configuration {

    @Bean()
    public UserDao userDao() {

        return new UserDao();
    }

    @Bean(autowire = Autowire.BY_TYPE)
    public UserService userService() {

        return new UserService(userDao());
    }

}

这里写图片描述


固然了,最简单直观的方法还有一种:在UserService中加入setUser()方法,那么只要set进去就好了..测试

  • UserService
public class UserService {

    private UserDao userDao ;

    public UserService() {
    }

    public UserService(UserDao userDao) {


    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}
  • Config
import org.springframework.context.annotation.Bean;

@org.springframework.context.annotation.Configuration
public class Config1 {

    @Bean(name = "userDao")
    public UserDao userDao() {

        return new UserDao();
    }


    @Bean(name="userService")
    public UserService userService() {

        UserService userService = new UserService();

        userService.setUserDao(userDao());

        return userService;
    }

}

这里写图片描述


c名称空间

咱们在使用XML配置建立Bean的时候,若是该Bean有构造器,那么咱们使用<constructor-arg>这个节点来对构造器的参数进行赋值…this

<constructor-arg>未免有点太长了,为了简化配置,Spring来提供了c名称空间,其实和咱们以前讲到的p名称空间是同样的…spa

要想c名称空间是须要导入xmlns:c="http://www.springframework.org/schema/c"code

<bean id="userService" class="bb.UserService" c:userDao-ref="">

    </bean>

c名称空间有个缺点:不能装配集合,当咱们要装配集合的时候仍是须要<constructor-arg>这个节点xml

装载集合

若是对象上的属性或者构造函数拥有集合的时候,而咱们又须要为集合赋值,那么怎么办?

  • 在构造函数上,普通类型
<bean id="userService" class="bb.UserService" >
        <constructor-arg >
            <list>
                //普通类型
                <value></value>
            </list>
        </constructor-arg>
    </bean>
  • 在属性上,引用类型
<property name="userDao">

         <list>
             <ref></ref>
         </list>
     </property>

JavaConfig与XML组合

咱们有的时候可能会两种配置混合时候…

若是JavaConfig的配置类是分散的,咱们通常再建立一个更高级的配置类(root),而后使用@Import来将配置类进行组合

若是XML的配置文件是分散的,咱们也是建立一个更高级的配置文件(root),而后使用来将配置文件组合

在JavaConfig引用XML

  • 使用@ImportResource()

在XML引用JavaConfig

  • 使用<bean>节点就好了
相关文章
相关标签/搜索