Spring配置的可选方案

  Spring提供了如下三种装配机制:

  (1)在XML中显式配置

  (2)在Java中显式配置

  (3)隐式的bean发现机制和自动装配

  Spring有多种方式可以装配bean,建议的选择是(3)>(2)>(1)。因为与XML显式配置相比,Java的显式配置更加类型安全与强大。只有想要使用XML的比较便利的命名空间而Java配置没有同样的实现时,才应该使用XML。

装配Bean

Spring装配Bean从解决下面两个问题来实现:

1.如何生成bean?

  方式一、在类上加@Component注解,然后通过组件扫描(ComponentScan)就可以让spring扫描指定包下的的类,所有添加此注解的类将会实例化成bean然后放到Spring容器中。如果没有指定bean的名字(或者叫id,但名字似乎更好理解),默认就是类名的首字母小写,如Student类的bean名字(id)就是student。

  方式二、使用XML声明一个bean时,可以使用

  <bean class=”包名.类名” />

  如果没有明确给定id,会使用这个bean的全限类名来命名。如class.Student的类生成的bean的id会是”class.Student#0”。其中“#0”用来计数,区分相同类型的其他bean。如果后面我们需要注入这个bean,就需要指定id。

  <bean id=”student” class=”class.Student” />

  方式三、通过JavaConfig声明

  在配置类上添加@Configuration,然后将要生成的Bean声明为一个个函数,添加@Bean注解,函数返回这个bean的对象,如下:

  注:1.使用JavaConfig创建的bean的ID默认与方法名相同。

    2.当一个函数添加@Bean时,Spring将会拦截所有对它的调用,并确保返回该方法所创建的bean

  

2.如何自动注入bean?

  注:如果给一个类进行注入bean,前提是这个类也是一个bean。

  方式一、当需要给这个类的某个属性进行注入时,需要在属性上添加@Autowired或@Resourcce注解。当Spring发现某个bean的属性中有@Autowired注解时,Spring会在容器中匹配满足这个属性的bean然后注入(注入规则如下图)。

  @Autowired和@Resource的区别

  与@Autowired相比,@Resource可以指定bean的名字,如果@Resource存在value,Spring直接按value值寻找bean的id注入。

  

  方式二、通过XML注入。在<bean>标签中使用<constructor-arg>来进行构造函数注入或使用<property>进行属性注入,还可以使用c-命名空间或p-命名空间来代替上述的两种标签,达到标签简化的效果(注:c-和p-命名空间不能注入集合)。

  例:

  1. <!-- 使用p-命名空间实现引用注入 -->
  2. <bean id="student" class="riskGame.Student"
  3. p:name="xiaowang"
  4. p:parent-ref="parent">
  5. <!-- 使用<property>实现集合注入 -->
  6. <property name="books">
  7. <list>
  8. <ref bean="book1"></ref>
  9. <ref bean="book2"></ref>
  10. </list>
  11. </property>
  12. </bean>
  13.  
  14. <!-- 使用c-命名空间指定属性名实现构造注入 -->
  15. <bean id="book1" class="riskGame.Book"
  16. c:name="数学"
  17. c:price="50.00">
  18. </bean>
  19. <!-- 使用c-命名空间指定下标实现构造注入 -->
  20. <bean id="book2" class="riskGame.Book"
  21. c:_0="语文"
  22. c:_1="50.00">
  23. </bean>
  24. <!-- 使用p-命名空间指定属性名实现属性注入 -->
  25. <bean id="parent" class="riskGame.ParentInfo"
  26. p:name="laowang"
  27. p:addr="beijin">
  28. </bean>

  方式三、通过JavaConfig,实现函数注入:

  

  1. //说明此类是一个配置类
  2. @Configuration
  3. //通过组件扫描,自动生成Bean
  4. @ComponentScan(basePackages = {"riskGame","task"})
  5. public class RiskConfig2 {
  6. @Bean
  7. //如果函数有形参,Spring会自动根据形参注入对应的bean
  8. public Soldier soldier(Weapon sword,Task fightDrogon){
  9. Soldier soldier=new Soldier();
  10. //通过set方法注入
  11. soldier.setSword(sword);
  12. soldier.setTask(fightDrogon);
  13. return soldier;
  14. }
  15. @Bean//通过构造函数注入
  16. public Soldier soldier2(Weapon sword,Task fightDrogon){
  17. return new Soldier(sword,fightDrogon);
  18. }
  19. @Bean
  20. public Task fightDrogon(){
  21. return new FightDrogon();
  22. }
  23. @Bean
  24. public Weapon sword(){
  25. return new Sword();
  26. }
  27. }

Spring装配bean的更多相关文章

  1. Spring 装配Bean

    Spring 装配Bean 装配解释: 创建应用对象之间协作关系的的行为通常称为装配(wiring),这也是依赖注入的本质 依赖注入是Spring的基础要素 一 : 使用spring装配Bean基础介 ...

  2. Spring装配Bean之XML装配bean

    在Spring刚出现的时候,XML是描述配置的主要方式,在Spring的名义下,我们创建了无数行XML代码.在一定程度上,Spring成为了XML的同义词. 现在随着强大的自动化配置和Java代码的配 ...

  3. Spring装配Bean的过程补充

    对上一篇的<Spring装配Bean的过程>的过程说一下,不然真产生了误区. 误区在哪里呢?那就是spring bean的作用域问题. 说哈常用的两种作用域:默认是scope = sing ...

  4. Spring装配Bean的过程

    首先说一个概念:“懒加载” 懒加载:就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中. spring配置文件中be ...

  5. Spring 装配Bean入门级

    装配解释: 创建应用对象之间协作关系的的行为通常称为装配(wiring),这也是依赖注入的本质 依赖注入是Spring的基础要素 一 : 使用spring装配Bean基础介绍 1 :声明Bean  B ...

  6. 【转】spring 装配Bean中构造参数的注入

    转载自:http://www.bianceng.cn/Programming/Java/201307/37027.htm spring 装配Bean中构造参数的注入 spring装配bean中还有一种 ...

  7. Spring装配Bean之组件扫描和自动装配

    Spring从两个角度来实现自动化装配: 组件扫描:Spring会自动发现应用上下文中所创建的bean. 自动装配:Spring自动满足bean之间的依赖. 案例:音响系统的组件.首先为CD创建Com ...

  8. Spring装配Bean之Java代码装配bean

    尽管通过组件扫描和自动装配实现Spring的自动化配置很方便也推荐,但是有时候自动配置的方式实现不了,就需要明确显示的配置Spring.比如说,想要将第三方库中的组件装配到自己的应用中,这样的情况下, ...

  9. spring装配Bean过程

    主要流程: 1.读取配置文件 2.实例化bean和填充bean属性 这个粗略的流程感觉更像是一个需求,有了这个需求,那么spring内部是怎么处理的呢? 我们知道spring的两个核心接口BeanFa ...

随机推荐

  1. 201521123044 《Java程序设计》第5周学习总结

    1. 本章学习总结 2. 书面作业 1. 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 答: ...

  2. Ubuntu下PHP MySQL环境搭建-upcoming-ChinaUnix博客

    编程语言选择php5 , web服务器选择Apache2 ,后台数据库选择MySQL首先安装编译工具, 打开终端 sudo apt-get install build-essential autoco ...

  3. 201521123025《java程序设计》第14周学习总结

    1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 1.1建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 1.2在自己建立的数据库上执行常见SQL语句 ...

  4. 201521123027 <java程序设计>第13周学习总结

    1.本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2.书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.e ...

  5. Activiti常见问题解决

    1,工作流activiti eclipse 插件不自动生成png window ——> preferences——>activiti——>save——>选中create pro ...

  6. 鸟哥Linux学习笔记05

    1,          文件系统通常会将 权限与属性放置到inode中,至于实际数据则放置到data block块中.另外还有一个超级块(superblock)会记录整个文件系统的整体内容,包括ino ...

  7. JavaScript自动化构建工具入门----grunt、gulp、webpack

    蛮荒时代的程序员: 做项目的时候,会有大量的js 大量的css   需要合并压缩,大量时间需要用到合并压缩 在前端开发中会出现很多重复性无意义的劳动  自动化时代的程序员: 希望一切都可以自动完成  ...

  8. APPScan安装与使用教程

    一.安装 1.右键安装文件,以管理员身份运行,如下图所示: 2.点击[确定] 3.点击[安装] 4.选择:我接受许可协议中单位全部条款,点击[下一步] 5.点击[安装]到该目录 6.如果需求扫描Web ...

  9. 【】小技巧】CSS文字两端对齐

    需求如下,红框所在的文字有四个字的.三个字的.两个字的,如果不两端对齐可以选择居中对齐,或者右对齐.但是如果要像下面这样两端对齐呢? 我相信以前很多人都这么干过:两个字中间使用 来隔开达到四个字的宽度 ...

  10. 利用PN532读取二代证UID

    准备工作 芯片选择 NFC芯片,需要支持ISO14443 Type B协议,比如PN532 阅读ISO 14443 重点阅读如下内容: 7.3.4.1 状态转换图 7.3.5 ~ 7.3.7 REQB ...