天天看点

Spring学习之装配Spring学习之装配

Spring学习之装配

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

三种装配机制

  1. 在XML中进行显式配置;
  2. 在Java中进行显式配置;
  3. 隐式的bean发现机制和自动装配;

自动装配

  • 1. 组件扫描:

    @component 注解为组件(可以用@Named(“beanID”)替代,但是建议使用前者,更直观的表明是做什么的)

    @componentScan注解启用了组件扫描

    可以使用值设置扫描的基础包:

    #1. 直接给定包名:

    @componentScan(“system”)

    @componentScan(basePackages=“system”)

    @componentScan(basePackages=({“system”,‘video’})

    #2. 指定为包中所含的类或者接口(推荐建一个空的接口作为定位,避免因代码重构,移动了相关类而导致扫描出问题)

    @componentScan(basePackageClasses=({“position.class”,“test.class”})

    2. 自动装配:

    @Autowired(required=false)

    required=false表示如果没有匹配的bean就不装配,但是需要注意在代码中进行null 检查,否则抛出NullPointerException

通过Java代码装配

  • 尽管自动装配式最推荐的,但有时不得不用显示装配,例如引用第三方组件,

    JavaConfig_相较于XML更强大,类型安全,对重构友好。

    应与业务逻辑代码分开,避免侵入业务代码

  • @Configuration注解

    标注于类上,标明这个类是一个注解类

  • 声明bean

    @Bean注解

    标注于方法上,标明这个方法返回一个对象,该对象为sprin应用上下文中的bean,方法体返回最终产生bean实例的逻辑

    装配bean

    引用创建bean的方法

  • @Bean

    public A a()

    {return new A(b());}

    看起来是通过调用b()方法得到b,实际上spring会拦截调用,并直接返回该方法所创建的bean,而不是每次都调用。

    使用构造器方法装备

  • @Bean

    public A a(b)

    {return new A(b);}

XML装配

​​

  • ​​声明bean

    < bean id=“id” class=“package.A” />

    装配bean

    < constructor-arg>元素

    < bean id=“id” class=“package.A” >

    < constructor-arg ref=“b” />

    < /bean>

    构造器注入:

    非引用类型如String等值类型,使用value取代ref

    可以使用list和set装配数组,区别是set会去掉重复值

    属性注入:

    使用property

    使用Spring3.0所引入的c-命名空间

    < bean id=“id” class=“package.A” >

    < c:cd-ref=“b” />

    < /bean>

    不能装配数组