spring装配bean

spring配置的可选方案

  • xml
  • javaConfig
  • 自动扫描和自动装配

配置风格可以互相搭配,混合使用.

尽可能的使用自动配置机制.如果必须要显式配置(比如有些源代码不是由你来维护)推荐使用类型安全的javaConfig,只有需要xml命名空间并且javaConfig没有同样实现时使用xml

自动化装配

因为自动化装配最为强大和方便,所以首先介绍自动化装配

  • 组件扫描:自动发现应用上下文创建的bean
  • 自动装配:自动满足依赖

创建可发现的bean

  • @Component:表明被标注的类为组件类,告知spring创建bean
  • @ComponentScan:开启组件扫描
  • xml配置
<context:component-scan base-package="your package"/>

为组件扫描的bean命名

  • @Conponent("name")
  • @Named("name")

设置扫描基础包

  1. 使用@Configuration定义配置类
    • @ComponentScan("package")
    • @ComponentScan(basePackages={"1","2"})
    • @ComponentScan(basePackageClasses={1.class,2.class})

推荐使用basePackageClasses,因为类型安全.可以在包中创建用于扫描的空标记接口,避免引用实际的应用程序代码,保持对重构友好

自动装配

@AutoWired 可以使用在构造器,setter方法等,spring会尝试满足参数声明的依赖.

如果没有合适的bean将会抛出异常,可以将@AutoWired的required属性设置为false

也可以使用@Inject

通过java代码适配bean

比如要将第三方库中的组件装配到你的应用使用不了自动化装配,所以还是要显式配置

javaConfig是比xml更好的方案,因为强大,类型安全,对重构友好

创建配置类

@configuration:表明配置类

声明简单的bean

@Bean
public CompactDisc sgtPeppers(){
    return new SgtPeppers();
}

@Bean注解告诉spring该方法会返回一个对象,并且该对象需要注册为bean.

bean的name默认为方法名,可以通过重命名方法和对@Bean注解name属性赋值更改

@Bean(name="name")
public CompactDisc sgtPeppers(){
    return new SgtPeppers();
}

使用javaConfig实现注入

1 .装配bean的最简单方式是引用创建bean的方法

@Bean
public CDplayer cdPlayer(){
    return new CDPlayer(sgtPepper());
}

看起来CompactDisc是通过调用sgtPeppers()得到,但是实际上因为sgtPeppers方法有@Bean注解,spring会拦截调用并确保直接返回该方法创建的bean

  1. 方法请求一个CompactDisc作为参数
@Bean
public CDPlayer cdPlayer(COmpactDisc compactDisc){
    return new CDPlayer(compactDisc);
}

spring调用cdPlayer方法时会自动装配CompactDisc到配置方法中

这通常是最佳的方式,因为不需要COmpactDisc声明在同一个配置类或是需要在javaConfig中声明,也可以是组件扫描发现的组件类.

通过xml装配

创建xml配置规范

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
                     http://www.springframework.org/schema/context
                     http://www.springframework.org/schema/context/spring-context.xsd
                     http://www.springframework.org/schema/aop
                     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
</beans>

声明bean

<bean class="package.yourClass"/>

因为没有明确给定ID,所以这个bean将会根据全限定类名来进行命名并以#0作为后缀(0是编号区分多个同类bean)。为了便于记忆,用户往往需要自己设定bean的id,这可以通过id属性来指定,如下:

<bean id="person" class="package.yourClass">

构造器注入初始化bean

  • spring3引入的c-命名空间
<bean id="…" class="…">
    <constructor-arg ref="beanID"/>
</bean>
<bean id="…" class="…"
    c:cd-ref="beanID"/>
    <-- cd为构造器参数名 -->
    <-- 构造器参数还可以换成参数位置
    如 c:_0-ref 下划线是因为xml不允许使
    用数字作为第一个字符.如果只有一个参数可
    以省略位置信息如c:_-ref -->

注入字面量到构造器

  • <constructor-arg value="..."/>
  • c命名空间 同上但是去掉-ref后缀
    如:<bean id="..." class="..."
    c:cd="value"/>

装配集合

注入null可以使用<constructor-arg><null/></constructor-arg>

注入列表

<constructor-arg>
    <-- 可以使用list set等元素 -->
    <list>
        <-- 字面值注入使用value -->
        <value>your value</value>
        <-- bean装配使用ref -->
        <ref bean="beanID"/>
    </list>
</constructor-arg>

c命名空间无法装配列表,但是与其使用xml装配不如使用java配置.

设置属性

  1. <property name="" value=""(设置字面量使用value 装配bean需要使用ref)/>
  2. <bean id="" class="" p:propertyrname(-ref)=""/>

p命名空间也无法装配列表,但是可以使用util命名空间简化bean配置

使用util命名空间可以单独对集合创建bean

<util:list id="">
    <value>…</value>
    <ref>…</ref>
</util:list>

现在就可以将list使用p命名空间注入了

<bean id="" class=""
    p:..-ref="listID"/>

导入和和混合配置

javaConfig中引入xml配置

如果配置类中bean太多希望拆开而又存在依赖怎么办?

可以把bean放在不同的配置类中,然后创建一个更高级的配置类,在类中使用@Import将多个配置类组合

@configuration
@imporg({1.class,2.class})
public class config(){
}

而如果有bean在xml中配置了可以使用@ImportResource注解
@ImportResource("classPath:config.xml")

xml中引入java配置

元素

<import resoune="config.xml"/>

import只能导入xml配置

导入java配置可以使用bean`

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





原文地址:https://www.cnblogs.com/renluxiang/p/f4014554d42060ec5ab78e41fdc927f6.html