前言

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

通过java代码配置bean

由于Spring的自动装配并不能将第三方库组件装配到应用中,于是需要显式装配配置。显示装配有两种方式

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

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

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

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

编写配置类


  1. @org.springframework.context.annotation.Configuration
  2. public class Configuration {
  3. }

使用配置类创建bean

  • 使用@Bean来修饰方法,该方法返回一个对象。
  • 不管方法体内的对象是怎么创建的,Spring可以获取得到对象就行了。
  • Spring内部会将该对象加入到Spring容器中
  • 容器中bean的ID默认为方法名
  1. @org.springframework.context.annotation.Configuration
  2. public class Configuration {
  3. @Bean
  4. public UserDao userDao() {
  5. UserDao userDao = new UserDao();
  6. System.out.println("我是在configuration中的"+userDao);
  7. return userDao;
  8. }
  9. }
  • 测试代码:要使用@ContextConfiguration加载配置类的信息【引入test包】

  1. package bb;
  2. import org.junit.Test;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. import org.springframework.test.context.ContextConfiguration;
  6. /**
  7. * Created by ozc on 2017/5/11.
  8. */
  9. //加载配置类的信息
  10. @ContextConfiguration(classes = Configuration.class)
  11. public class Test2 {
  12. @Test
  13. public void test33() {
  14. ApplicationContext ac =
  15. new ClassPathXmlApplicationContext("bb/bean.xml");
  16. UserDao userDao = (UserDao) ac.getBean("userDao");
  17. System.out.println(userDao);
  18. }
  19. }


使用配置类实现对象依赖

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

  • 第一种(测试不出来)

  1. import org.springframework.context.annotation.Bean;
  2. @org.springframework.context.annotation.Configuration
  3. public class Configuration {
  4. @Bean()
  5. public UserDao userDao() {
  6. return new UserDao();
  7. }
  8. @Bean
  9. public UserService userService() {
  10. //直接调用@bean的方法
  11. return new UserService(userDao());
  12. }
  13. }

  • 第二种(测试不出来)

  1. import org.springframework.context.annotation.Bean;
  2. @org.springframework.context.annotation.Configuration
  3. public class Configuration {
  4. @Bean()
  5. public UserDao userDao() {
  6. return new UserDao();
  7. }
  8. @Bean
  9. public UserService userService(UserDao userDao) {
  10. //通过构造函数依赖注入
  11. return new UserService(userDao);
  12. }
  13. }


  • 如果我直接通过构造器传入的话,那么报错了

  1. import org.springframework.beans.factory.annotation.Autowire;
  2. import org.springframework.context.annotation.Bean;
  3. @org.springframework.context.annotation.Configuration
  4. public class Configuration {
  5. @Bean()
  6. public UserDao userDao() {
  7. return new UserDao();
  8. }
  9. @Bean(autowire = Autowire.BY_TYPE)
  10. public UserService userService(UserDao userDao) {
  11. return new UserService(userDao);
  12. }
  13. }


  • 我测试中只有通过这种方法才能拿到userDao的引用。
  1. public class Configuration {
  2. @Bean()
  3. public UserDao userDao() {
  4. return new UserDao();
  5. }
  6. @Bean(autowire = Autowire.BY_TYPE)
  7. public UserService userService() {
  8. return new UserService(userDao());
  9. }
  10. }


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

  • UserService

  1. public class UserService {
  2. private UserDao userDao ;
  3. public UserService() {
  4. }
  5. public UserService(UserDao userDao) {
  6. }
  7. public void setUserDao(UserDao userDao) {
  8. this.userDao = userDao;
  9. }
  10. }
  • Config

  1. import org.springframework.context.annotation.Bean;
  2. @org.springframework.context.annotation.Configuration
  3. public class Config1 {
  4. @Bean(name = "userDao")
  5. public UserDao userDao() {
  6. return new UserDao();
  7. }
  8. @Bean(name="userService")
  9. public UserService userService() {
  10. UserService userService = new UserService();
  11. userService.setUserDao(userDao());
  12. return userService;
  13. }
  14. }


c名称空间

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

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

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


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

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

装载集合

如果对象上的属性或者构造函数拥有集合的时候,而我们又需要为集合赋值,那么怎么办?

  • 在构造函数上,普通类型

  1. <bean id="userService" class="bb.UserService" >
  2. <constructor-arg >
  3. <list>
  4. //普通类型
  5. <value></value>
  6. </list>
  7. </constructor-arg>
  8. </bean>
  • 在属性上,引用类型

  1. <property name="userDao">
  2. <list>
  3. <ref></ref>
  4. </list>
  5. </property>

JavaConfig与XML组合

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

如果JavaConfig的配置类是分散的,我们一般再创建一个更高级的配置类(root),然后使用@Import来将配置类进行组合

如果XML的配置文件是分散的,我们也是创建一个更高级的配置文件(root),然后使用来将配置文件组合

在JavaConfig引用XML

  • 使用@ImportResource()

在XML引用JavaConfig

  • 使用<bean>节点就行了

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

  1. WEBBASE篇: 第三篇, CSS知识1

    第三篇, CSS知识1 一,CSS 介绍 CSS: Cascading Style Sheets ---样式表 HTML: 搭建网页结构: CSS: 在网页结构基础上进行网页的美化: 二,CSS的使用 ...

  2. python学习之路网络编程篇(第三篇)

    python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...

  3. Spring Cloud第三篇 | 搭建高可用Eureka注册中心

    ​ ​本文是Spring Cloud专栏的第三篇文章,了解前两篇文章内容有助于更好的理解后面文章: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring ...

  4. 第三篇——第二部分——第一文 SQL Server镜像简介

    原文:第三篇--第二部分--第一文 SQL Server镜像简介 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26951563 镜像是什 ...

  5. 第三篇——第二部分——第一文 SQL Server镜像简单介绍

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/DBA_Huangzj/article/details/26951563 原文出处:http://bl ...

  6. Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇

    Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇 本文主要内容: 1:spring cloud整合Eureka总结 本文是由凯哥(凯哥Java:kagejava ...

  7. 三篇文章了解 TiDB 技术内幕 - 说存储(转)

    引言 数据库.操作系统和编译器并称为三大系统,可以说是整个计算机软件的基石.其中数据库更靠近应用层,是很多业务的支撑.这一领域经过了几十年的发展,不断的有新的进展. 很多人用过数据库,但是很少有人实现 ...

  8. spring第三篇

    在昨天下午更新sprin第二篇中,叙述了将对象交给spring创建和管理,今天在spring第三篇中,主要写两个点一是spring的思想 二是spring中bean元素的属性配置. 1 spring思 ...

  9. 第三篇——第二部分——第五文 配置SQL Server镜像——域环境SQL Server镜像日常维护

    本文接上面两篇搭建镜像的文章: 第三篇--第二部分--第三文 配置SQL Server镜像--域环境:http://blog.csdn.net/dba_huangzj/article/details/ ...

随机推荐

  1. Linux学习总结(十一)—— Linux常用命令:版本信息查看(RedHat、CentOS、Debian、Ubuntu、Fedora、Oracle)

    这篇文章收集了CentOS.Oracle.RedHat等系统查看发行版本.内核版本.位数的方法,欢迎补充. 系统 发行版本 -- 内核版本.位数 RedHat cat /etc/issue cat / ...

  2. RabbitMQ --- Routing(路由)

    目录 RabbitMQ --- Hello Mr.Tua RabbitMQ --- Work Queues(工作队列) RabbitMQ --- Publish/Subscribe(发布/订阅) 前言 ...

  3. Action和Fuc的区别

    Action和Fuc的区别,参数和具体用法

  4. Joda-Time 简介

    既然无法摆脱时间,为何不设法简化时间处理? 任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径.使用 JDK 完成这项任务将非常痛 ...

  5. Spring Date Jpa on update current_timestamp 自动维护创建时间和更新时间

    在数据库里设置默认值current_timestamp可以维护创建时间,设置on update current_timestamp 可以维护更新时间.在JPA中应该如何去做呢?这里还是以上篇Topic ...

  6. JavaScript笔记之第六天

    JavaScript 库 JavaScript 库 - jQuery.Prototype.MooTools. jQuery jQuery 是目前最受欢迎的 JavaScript 框架. 它使用 CSS ...

  7. [2017-08-16]ABP系列——QuickStartB:正确理解Abp解决方案的代码组织方式、分层和命名空间

    本系列目录:Abp介绍和经验分享-目录 介绍ABP的文章,大多会提到ABP框架吸收了很多最佳实践,比如: 1.N层 (复用一下上篇的图) 展现层(Personball.Demo.Web):asp.ne ...

  8. live事件的替代方法on的使用注意事项

    根据jQuery的官方描述,live方法在1.7中已经不建议使用,在1.9中删除了这个方法.并建议在以后的代码中使用on方法来替代. on方法可以接受三个参数:事件名.触发选择器.事件函数. 需要特别 ...

  9. 关于wamp服务器文件的配置

    有的前端朋友想在手机端看PC端开发的html5页面,这时候会在本地PC下载一个wamp,这时候在PC端输入电脑的IP地址或者是直接输入localhost,可以访问www目录下的文件(开发项目必须放置在 ...

  10. UWP 手绘视频创作工具技术分享系列 - SVG 的解析和绘制

    本篇作为技术分享系列的第一篇,详细讲一下 SVG 的解析和绘制,这部分功能的研究和最终实现由团队的 @黄超超 同学负责,感谢提供技术文档和支持. 首先我们来看一下 SVG 的文件结构和组成 SVG ( ...