Spring学习之装配
创建应用对象之间协作关系的行为通常称为装配(wiring),也是DI的本质。
三种装配机制
- 在XML中进行显式配置;
- 在Java中进行显式配置;
- 隐式的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>
不能装配数组