码迷,mamicode.com
首页 > 编程语言 > 详细

Spring系列(二) Bean装配

时间:2018-09-07 23:53:12      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:packages   程序   自动装配   历史   注解   classname   component   上下文   业务   

创建应用对象之间协作关系的行为称为装配(wiring), 这也是DI的本质.

Spring中装配Bean的方式

Spring提供了三种装配Bean的方式.

  1. 隐式的Bean发现机制和自动装配
  2. Java Config
  3. Xml Config

Spring可以任意选择三种方式其中的一种或多种组合. 但建议尽量使用自动装配方式以避免产生繁杂的xml配置文件及java代码, 其次是使用类型安全的Java Config, 如果都满足不了需求则最后再考虑xml config.

自动配置

借助于下面两个方面Spring可以实现自动化Bean配置.

  1. 组件扫描(component scanning): 自动发现上下文种创建的bean
  2. 自动专配(autowiring) 自动创建对象间依赖

一. 组件扫描:

  • @Component 注解标记的java类会作为组件类. 带参的@Component("beanid"), 参数为bean的名称, 默认为首字母小写的类名. @Component 等同 @Named 注解;
    对应xml配置节点
  • @ComponentScan 用来启动组件扫描, 默认的扫描范围是该注解标记的类所在的包. 带参的 @ComponentScan(basePackages={"basePackage1","basePackage2"}) 可以指定扫描的包范围 ; 带参的 @ComponentScan(basePackageClasses={ClassNameA.class,InterfaceB.class})这些类或接口所在的包将作为扫描的基础包范围, 相比指定字符串的基础包, 这种方式提供了类型安全性(重构友好的);
    对应的xml配置节点是

二. 自动装配

  • @AutoWired 提供了自动装配能力. 构造器注入和setter注入均可以使用该注解, 事实上它可以在任何方法上发挥作用.@AutoWired(required=false) 设置为false在没有匹配到bean时不会抛出异常. @AutoWired等同于@Inject

Java Config

对于无法使用@Conmponent@Autowired注解的, 比如第三方类库的组件, 可以使用java config的方式装配. 同时, javaconfig也是java代码, 他们不应该包含任何业务代码, 实际上两者应该完全分开,所以一般会将java config代码放在单独的包中.

  • @Configuration 注解标识类是一个配置类.
  • @Bean 注解的方法声明为返回bean. @Bean(name=‘methodname‘) 参数标识bean的id名称, 默认为方法名称.
@Bean
public A getA(){
    return new A();
}

@Bean
public B getB(){
    return new B(getA());
}

@Bean
public C getC(){
    return new C(getA());
}

在上面代码中构建组件B,C使用的构造器注入了A的beangetA(), 在一般的java程序中B,C的Bean会分别持有A的不同实例, 但Spring中不是这样, 所有getA()会被拦截, 并返回同一个bean. 默认情况下Spring的bean都是单例的.

可以使用更为简单的方式创建B,C的bean, 代码如下:

@Bean
public B getB(){
    return new B(A a); // 也可以使用setter方式, 或者任何其他方式创建bean
}

@Bean
public C getC(){
    return new C(A a);
}
  • @Import({ClassnameA.class,ClassnameB.class}) 对于不同位置的bean, javaconfig可以使用此注解导入其他配置类.

XML Config

XML是Spring最原始的装配方式, 熟悉Xml config对了解历史项目, 以及渐进重构到java config或自动配置都是有帮助的.

xml配置构造器(setter)注入的方式有两种, 两种方式各有利弊:

  1. c-命名控制 或 p-命名空间 特点是简洁, 但不能注入集合; 使用时需要引入XSD.
  • 配置文件的顶部需要声明多个XSD.
  • <bean class="com.xlx.c02.MyClass"> 声明了一个bean, 默认id为com.xlx.c02.MyClass#0, 可以使用属性id为bean指定名称<bean id="myclass" class="com.xlx.c02.MyClass">.
  • <constructor-arg> 用来配置构造器注入的参数, 引用其他bean时使用<constructor-arg ref="otherBeanId">, 等同c-命名空间的属性c:otherBean-ref=‘otherBeanId‘, 或者参数数字索引c:_0-ref=‘otherBeanId‘(单参数可以省略数字); 也可以注入字面量值<constructor-arg value="this is value"> 等同c-命名空间的属性c:_name=‘jery‘,或 c:_0=‘jery‘(单参数可省略数字)
  • 装配集合
<constuctor-arg>
    <list>
        <value>first</value>
        <value>second</value>
    </list>
</constuctor-arg>
  • 设置属性: <property name="propertyName" ref="beanId">p:propertyName-ref="beanId"
  • util 命名空间的功能可以简化一些字面量属性设置, 同样,需要首先声明XSD.
<!--定义集合-->
<util:list id="trackList">
    <value>first</value>
    <value>second</value>
</util:list>

<!--p-命名的方式引用集合-->
p:tracks-ref="trackList"

混合配置

一. Java Config引用其他

  • @Import 可以导入java配置类
  • @ImportResource 可以导入xml配置, 如@ImportResource("classpath:my-config.xml")

二. XML Config 引用其他

  • <import resource=‘my-config.xml‘> 引用其他xml配置
  • <bean> 引用java config

不管如何引用, 创建一个根配置会使配置更具层次, 更易于阅读管理.

Spring系列(二) Bean装配

标签:packages   程序   自动装配   历史   注解   classname   component   上下文   业务   

原文地址:https://www.cnblogs.com/walkinhalo/p/9607524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!