Spring3.0 – 学习笔记 – Bean装配
------转载请注明出处 作者:小魔头
1.Spring bean 配置:
a.自动化隐式装配
b.Java config 显示装配
c.XML 显示装配
2.自动化隐式装配:
a.@Component 添加于定义的类前,Spring根据此注解去创建该类实例并注册到spring容器中
i.默认beanID为首字母小写的类名
ii.显示配置beanID -- @Component(“beanID”)
b.@Autowired 添加于成员属性或者成员方法或构造方法前,spring会根据该注解从容器中配置bean并且注入到该属性或者方法的参数传入
i.Spring首先根据成员属性或者参数的类型名搜索匹配的bean,无匹配对应时根据beanID进行配置
例子:当成员属性或者参数是接口时,但是bean的实例化对象是接口的实现类,则无法进行名称匹配,转以beanID进行配置
ii.自动装配的配置不仅限于@Component生成的, javaconfig和xml生成的bean同样可以进行自动装配
iii.强依赖使用构造器注入,弱依赖使用属性注入
c.组件扫描 -- 通过XML 配置<context:component-scan base-package = “ ”/> 启动spring自动扫描功能,a和b 项才能正常加载
d.组件扫描 – 或者通过javaconfig 同样可以启动组件扫描功能,代码如下:
@Configuration
@ComponentScan
Public class beansConfig(){
}
e.设置基本扫描包
@ComponentScan(basePackages={“com.package1”, “com.package2”})
@ComponentScan(basePackageClasses={“Bullet.class”, “Gun.class”})//以类所在的包围基本包进行扫描
3.Javaconfig 显示装配:
a.创建一个beanConfig 配置类 如下:
@Configuration
Public class beansConfig(){
@Bean
Public Bullet setBullet(){
Return new Bullet();
}
@Bean
Public Gun getGun(){
Return new Gun(setBullet());//Gun必须有一个参数的构造方法
}
}
i.Config代码中通过new bean的实例对象 来达到 和(@Component&@ComponentScan)一样的作用,实例化bean到spring容器中,以上方式这两个有依赖关系的类必须在同一javaconfig类中,所以这种方式不推荐使用
ii.beanID默认是方法名, 可以使用@Bean(name=””)显示声明
iii.注入到容器中的bullet和gun的bean
b.创建另外另外一个javaconfig 如下:
@Configuration
Public class beansConfig(){
@Bean
Public Bullet setBullet(){
Return new Bullet();
}
@Bean
Public Gun getGun(Bullet bullet){
Return new Gun(bullet);//Gun必须有一个参数的构造方法
}
}
i.注入到Gun中bullet实例可以是javaconfig/@Component/XML 生产的bean, 甚至Gun 实例bean的装配都可以是在另外一个javaconfig 类中
4.XML 显示装配:
a.在xml文件中使用如下配置进行声明bean,spring会实例化并且加载到容器
<bean id=”bullet” class =”com.package1.Gun”/>
<bean id=”bullet” class =”com.package1.Bullet”/>
b.构造器注入依赖
i.构造器注入实例bean, class类必须有相应的构造器
<bean id=”gun” class =”com.package1.Gun”>
<constructor-arg ref=”bullet”/>
</bean>
使用<beans xmlns:c=”http:www.springframework.or/schema/c” 代替如下:
<bean id=”gun” class =”com.package1.Gun”>
<c:cd-ref=”bullet”/>
</bean>
ii.构造器注入字符
<bean id=”gun” class =”com.package1.Gun”>
<constructor-value=”shoot”/>
</bean>
iii.构造器注入集合
<bean id=”gun” class =”com.package1.Gun”>
<constructor-arg>
<list>
<ref bean=”bullet”/>
</list>
<constructor-arg/>
</bean>
c.属性注入
i.注入bean,class类中必须有对应的get和set方法(如果没有使用@autowired注入或者javaconfig)
<bean id=”gun” class =”com.package1.Gun”>
<property name=”bullet” ref=”bullet”/>
</bean>
ii.注入字符和集合
<bean id=”gun” class =”com.package1.Gun”>
<property name=”bullet” value=”shoot”>
<property name=”bulletList”>
<list><value>shoot you</value></list>
</property name=”bullet”>
</bean>
d.多个xmlbeans文件使用<import resource="config/beans.xml"/>引入依赖注入beans
5.混合装配
a.和上面多个xmlbeans 使用<import resource/>类似,
i.多个javaconfig 配置类时需要使用@Import(dependentcyConfig.class)
ii.或者创建一个总体配置类@Import({Config1.class,Config2.class})
b.如果需要在javaconfig配置类中注入在xml中配置的bean时,使用@ImportResource(“classpath:beans.xml”)
c.如果xml中配置的bean需要注入javaconfig配置类中bean,通过如下引用
<bean class=”dependentcyConfig.class”>