一、概要

Sping装配bean主要有三种装配机制:

  • 在XML中进行显式配置。
  • 在Java中进行显式配置。
  • 隐式的bean发现机制和自动装配。

原则:

建议尽可能地使用自动配置的机制,显式配置越少越好。当你必须要显式配置bean的时候(比如,有些源码不是由你来维护的,而当你需要为这些代码配置bean的时候),我推荐使用类型安全并且比XML更加强大的JavaConfig。最后,只有当你想要使用便利的XML命名空间,并且在JavaConfig中没有同样的实现时,才应该使用XML。

二、自动装配

Spring从两个角度来实现自动化装配:

  • 组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean。
  • 自动装配(autowiring):Spring自动满足bean之间的依赖

1.组件扫描

@Component注解:添加注解表明该类会作为组件类,并告知Spring要为这个类创建bean。

package bean;
import org.springframework.stereotype.Component;
@Component
public class Category {
private int cateId;
public int getCateId() {
return this.cateId;
} public void setCateId(int id) {
this.cateId = id;
} @Override
public String toString() {
return " 商品类型 id=" + this.cateId;
}
}

  

2.启用组件扫描两种方式:

①使用XML来启用组件扫描,在applicationContext.xml配置:

<context:component-scan base-package="autowire.bean"></context:component-scan>

  

单元测试:

@ContextConfiguration(locations = "classpath*:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class) public class testAutowireXml {
@Autowired
private Category category; @Test
public void TestXmlBean() {
Assert.assertNotNull(category);
}
}

  

②使用java配置

前面的bean类不做任何调整,通过@ComponentScan注解实现自动扫描。例如新建java配置文件BeanConfig.java

@Configuration
@ComponentScan(basePackageClasses = bean.Category.class)
public class BeanConfig {
}

  

单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = BeanConfig.class)
public class testAutowireJava { @Autowired
private Category category; @Test
public void categoryNotNull() {
Assert.assertNotNull(category);
}
}

  

三、JavaConfig装配bean

上面的BeanConfig就是用java config方式实现的。java Config也是一个java类,但它不应该包含任何业务逻辑,也不应该侵入到业务逻辑代码之中,通常会将JavaConfig放到单独的包中。

创建java config关键是使用@Configuration ,表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。

在JavaConfig中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解。

我们新建一个config文件JavaConfig.java,是在BeanConfig.java基础上去掉@ComponentScan注解,并添加category()返回Category实例。

@Configuration
public class JavaConfig { @Bean
public Category category(){
return new Category();
}
}

  

单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JavaConfig.class)
public class testJavaConfig { @Autowired
private Category category; @Test
public void testCategoryBean(){
Assert.assertNotNull(category);
}
}

  

四、XML方式装配bean

JAVA入门[3]—Spring依赖注入这篇笔记中包含了如何通过xml方式装配bean实例。

1.构造器传参

①首先为Category添加构造函数:

public class Category {
private int cateId;
public Category() {
} public Category(int id) {
cateId = id;
} public int getCateId() {
return this.cateId;
} public void setCateId(int id) {
this.cateId = id;
} @Override
public String toString() {
return " 商品类型 id=" + this.cateId;
}
}

  

②applicationContext添加bean节点,为constructor-arg设置Id或者index。

 <bean class="bean.Category">
<constructor-arg name="id" value="100"></constructor-arg>
</bean>

<bean class="bean.Category">
  <constructor-arg index="0" value="100"></constructor-arg>
</bean>

  

③单元测试:

@ContextConfiguration(locations = "classpath*:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class testAutowireXml { @Autowired
private Category category; …… @Test
public void testId(){
Assert.assertEquals(100,category.getCateId());
}
}

  

④c-命名空间

这种语法用起来简化一些。

调整②中的bean节点:

<bean class="bean.Category" c:_0="100"></bean>

<bean class="bean.Category" c:id="100"></bean>

2.设置属性 :

①通过为bean设置property实现属性

<bean class="bean.Category" >
<property name="cateId" value="100"></property>
</bean>

  

②p-命名空间

前面的bean配置可以简化为:

<bean class="bean.Category" p:cateId="100"></bean>

  

五、属性占位符

Spring支持将属性定义到外部的属性的文件中,并使用占位符值将其插入到Spring bean中。在Spring装配中,占位符的形式为使用“${ ... }”包装的属性名称。

config.properties:

cateid=100

  

spring-config.xml:

 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:properties/config.properties</value>
</list>
</property>
</bean> <bean class="bean.Category" p:cateId="${cateid}"></bean>

示例代码https://github.com/cathychen00/learnjava/tree/master/DemoBean

JAVA入门[13]-Spring装配Bean的更多相关文章

  1. Spring 装配Bean

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

  2. Spring装配bean

    Spring配置的可选方案 Spring提供了如下三种装配机制: (1)在XML中显式配置 (2)在Java中显式配置 (3)隐式的bean发现机制和自动装配 Spring有多种方式可以装配bean, ...

  3. Spring装配Bean之XML装配bean

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

  4. Spring 装配Bean入门级

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

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

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

  6. spring装配bean的三种方式及其混合装配

    在spring容器中装配bean有三种基本方式和混合装配方式: 隐式的bean自动发现机制和自动装配 在java中进行显式配置 在xml中配置 混合装配(在多个java文件中配置.在JavaConfi ...

  7. Spring装配Bean的三种方式+导入和混合配置

    目录 Spring IoC与bean 基于XML的显式装配 xml配置的基本结构 bean实例的三种创建方式 依赖注入的两种方式 构造器注入方式 setter方法注入方式 利用命名空间简化xml 基于 ...

  8. Spring装配Bean的过程补充

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

  9. Spring装配Bean的过程

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

随机推荐

  1. rewirte 规则

    Nginx Rewrite Rewirte 规则也称为规则重写,主要功能是实现浏览器访问 HTTP URL 的跳转,其正则 表达式是基于 Perl 语言.通常而言,几乎所有的 WEB 服务器均可以支持 ...

  2. TFS在项目中Devops落地进程(上)

    经过近2年折腾,基于TFS的Devops主线工程大体落地完毕.在此大体回忆下中间的各种历程. 开始之前简单说下什么是TFS(Team Foundation Server). TFS是微软推出的一款AL ...

  3. C#实现中国身份证验证问题

    C#中国身份证验证,包括省份验证和校验码验证,符合GB11643-1999标准...   今天写的 C#中国身份证验证,包括省份验证和校验码验证,符合GB11643-1999标准... 理论部分: 1 ...

  4. 基础拾遗-----mongoDB操作

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  5. 在windows上搭建镜像yum站的方法(附bat脚本)

    方法一:支持rsync的网站 对于常用的centos.Ubuntu.等使用官方yum源在 http://mirrors.ustc.edu.cn 都存在镜像. 同时 http://mirrors.ust ...

  6. P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

    题目描述 约翰家有N头奶牛,第i头奶牛的编号是Si,每头奶牛的编号都是唯一的.这些奶牛最近 在闹脾气,为表达不满的情绪,她们在挤奶的时候一定要排成混乱的队伍.在一只混乱的队 伍中,相邻奶牛的编号之差均 ...

  7. 《java.util.concurrent 包源码阅读》27 Phaser 第一部分

    Phaser是JDK7新添加的线程同步辅助类,作用同CyclicBarrier,CountDownLatch类似,但是使用起来更加灵活: 1. Parties是动态的. 2. Phaser支持树状结构 ...

  8. 《java.util.concurrent 包源码阅读》05 BlockingQueue

    想必大家都很熟悉生产者-消费者队列,生产者负责添加元素到队列,如果队列已满则会进入阻塞状态直到有消费者拿走元素.相反,消费者负责从队列中拿走元素,如果队列为空则会进入阻塞状态直到有生产者添加元素到队列 ...

  9. 《java.util.concurrent 包源码阅读》22 Fork/Join框架的初体验

    JDK7引入了Fork/Join框架,所谓Fork/Join框架,个人解释:Fork分解任务成独立的子任务,用多线程去执行这些子任务,Join合并子任务的结果.这样就能使用多线程的方式来执行一个任务. ...

  10. C语言之最大公约数与最小公倍数

    #include<stdio.h>int main(){ int num1, num2,temp; scanf("%d%d",&num1,&num2); ...