Spring配置Bean的方式有两种,第一种是配置xml文件,第二种是基于java注解的配置方式
基于XML配置bean
1、参数通过构造函数配置
<bean id="poeticDuke" class="com.meituan.rc.tuya">
<constructor-arg value="15"> //说明构造函数第一个参数是个基本类型
<constructor-arg ref="sonnet29"> //说明构造函数第二个参数是个对象,引用类型
</bean>
2、参数通过setter方法配置
相当于先调用无参构造函数,然后调用setter方法配置属性
<bean id="poeticDuke" class="com.meituan.rc.tuya">
<property name="age" value="15"> //调用setAge给age属性赋值
<property name="instrument" ref="saxophone"> //要先将Saxophone声明为一个bean此处才能调用
</bean>
内部bean
如果不想让bean与其他bean共享可以使用内部bean
<bean id="poeticDuke" class="com.meituan.rc.tuya">
<property name="age" value="15">
<property name="instrument">
<bean class="com.meituan.rc.Saxophone"/> //内部bean,对外不可见。property也可以替换成construcor-arg元素
</property>
</bean>
bean可以在初始化和销毁时调用某些方法
<bean id="poeticDuke" class="com.meituan.rc.tuya"
init-method="turnOnLights" //初始化前调用turnOnLights方法
destroy-method="turnOffLights"/> //销毁时调用turnOffLights方法
基于注解配置bean
可以让spring自动扫描指定的包,根据注解查找出能自动注册为spring的类。
<context:component-scan base-package="com.meituan.rc.prophet"></context:component-scan>
该配置会自动扫描com.meituan.rc.prophet的包,并查找使用如下注解标注的类
-
@Component
通用的构造型注解,标识该类为Spring组件 -
@Controller
标识该类定义为SpringMVC controller -
@Repository
标识该类定义为数据仓库 -
@Service
标识该类定义为服务
示例:
@Service("guitar") //声明bean的id为guitar
puclic class Instrument{
...
}
Instrument将会被自动注册为一个id为guitar的bean
基于java的配置
还可以使用@Bean将方法的返回对象注册为bean,示例
@Bean
public Performer duke(){
return new Juggler();
}
将返回的Juggler对象注册为bean,方法名作为bean的id
基于注解装配
Spring默认禁用注解装配,需要加入如下代码进行启动
<context:annotation-config>
可以使用@Autowired
直接标注属性,这样spring就是自动寻找同类型(Instrument)的bean进行装配。
@Autowired
也可以用于装配方法(写在方法前一行)或者构造器
//装配属性
@Autowired
private Instrument instrument
//装配方法参数
@Autowired
public void myInstrument(Instrument instrument){
}
如果spring中有多个同类型的bean则可以使用@Qualifier
注解来明确指定id为xxx的bean进行装配
@Autowired
@Qualifier("guitar")
private Instrument instrument
可以理解为@Qualifier
注解将ByType类型自动装配转换成了ByName