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-命名空间不能注入集合)。

  例:

<!-- 使用p-命名空间实现引用注入 -->
<bean id="student" class="riskGame.Student"
p:name="xiaowang"
p:parent-ref="parent">
<!-- 使用<property>实现集合注入 -->
<property name="books">
<list>
<ref bean="book1"></ref>
<ref bean="book2"></ref>
</list>
</property>
</bean> <!-- 使用c-命名空间指定属性名实现构造注入 -->
<bean id="book1" class="riskGame.Book"
c:name="数学"
c:price="50.00">
</bean>
<!-- 使用c-命名空间指定下标实现构造注入 -->
<bean id="book2" class="riskGame.Book"
c:_0="语文"
c:_1="50.00">
</bean>
<!-- 使用p-命名空间指定属性名实现属性注入 -->
<bean id="parent" class="riskGame.ParentInfo"
p:name="laowang"
p:addr="beijin">
</bean>

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

  

//说明此类是一个配置类
@Configuration
//通过组件扫描,自动生成Bean
@ComponentScan(basePackages = {"riskGame","task"})
public class RiskConfig2 {
@Bean
//如果函数有形参,Spring会自动根据形参注入对应的bean
public Soldier soldier(Weapon sword,Task fightDrogon){
Soldier soldier=new Soldier();
//通过set方法注入
soldier.setSword(sword);
soldier.setTask(fightDrogon);
return soldier;
}
@Bean//通过构造函数注入
public Soldier soldier2(Weapon sword,Task fightDrogon){
return new Soldier(sword,fightDrogon);
}
@Bean
public Task fightDrogon(){
return new FightDrogon();
}
@Bean
public Weapon sword(){
return new Sword();
}
}

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. 201521123042 《java程序设计》 第八周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. ①泛型定义:泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展, ...

  2. 201521123007《Java程序设计》第2周学习总结

    1.本周学习总结 类名第一个字母大写,类名下的方法如main第一个字母要小写: Java有三种基本数据类型:整型(byte,short,int,long,char),浮点型(float,double) ...

  3. 201521123028《Java程序设计》第1周学习总结

    1. 本周学习总结 通过本周的学习: 1.了解了Java的发展史(从OAK转向Internet,并逐步发展至今的历程) 2.与C语言比较,Java语言的特点: ①将源程序编译成一种结构中立的中间文件格 ...

  4. 201521123050 《Java程序设计》第13周学习总结

    1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 对比可以看出 ...

  5. SpringMVC第五篇【方法返回值、数据回显、idea下配置虚拟目录、文件上传】

    Controller方法返回值 Controller方法的返回值其实就几种类型,我们来总结一下-. void String ModelAndView redirect重定向 forward转发 数据回 ...

  6. sql server 把数据 复制成脚本文件

    问题描述:想把一个数据库里的表和字段复制到另一个数据库里: 方法一:a.生成脚本文件 选择数据库右键->任务->生成脚本: b. 选择特定的数据库对象->下一步: c.高级-> ...

  7. 启动PHPstudy提醒80、3306端口被占用

    端口占用会出现如下提醒 解决办法: 进入dos窗口:快捷键win+R,然后输入cmd 在dos窗口中输入命令:netstat   -ano(查找各端口所在进程的PID) 找到80和3306的程序PID ...

  8. MySql Jar 包下载

    MySql JAR 包下载 我们要使用Spring 链接MySql  需要两个Jar 包   一个是C3p0   一个是MySql 的Connection Jar  包 C3p0: 进入下面的网址 h ...

  9. vue2.0 网页标题更新实现思路

    一.注册全局指令 1.注册一个全局指令 Vue.directive('title', { inserted: function (el, binding) { document.title = el. ...

  10. 在Storyboard中为UITableView添加Header和Footer

    我在这里所说的Header和Footer并不是sectionHeader和sectionFooter,而是指UITableView的tableHeaderView和tableFooterView,这两 ...