基于xml自动装配
//使用设值注入方式装配Person实例
<bean id="person1" class="com.mengma.assembly.Person">
<property name="name" value="zhangsan" />
<property name="age" value="20" />
</bean>
//使用构造方法装配Person实例
<bean id="person2" class="com.mengma.assembly.Person">
<constructor-arg index="0" value="lisi" />
<constructor-arg index="1" value="21" />
</bean>
bean标签属性:
- autowire=“default/no”:不自动装配,不自动为bean赋值
- autowire=“byName”:按照名字自动装配,以属性名作为id去容器中找到这个组件,给他赋值,如果找不到就装配null
- autowire=“byType”:以属性的类型作为查找依据去容器中找这个组件,如果容器中有多个这种类型的组件会报错,找不到装配null
- autowire=“constructor”:按照构造器进行赋值
1.先按有参构造器的类型进行装配,没有直接装配null
2.如果按照类型找到了多个,参数的名作为id继续匹配,找不到装配null
3.不会报错
基于注解自动装配
- @Qualifier(“指定id名”):指定一个id名,让spring别使用变量名作为id
- @Autowired(request=false):request默认为true,装配不上会报错,设为false,若装配不到匹配的,则装配Null
注:方法上有@Autowire:这个方法也会在bean创建的时候自动运行 ,这个方法上的每一个参数都自动注入值
@Autowired、@Resource、@Inject都是自动装配,区别:
@Autowired最强大,是spring自己的注解
@Resource扩展性更强,如果换另一个容器框架,它也可以使用
@Inject是EJB的
Spring容器其实是一个map,这个map中保存所有创建好的bean,并提供外界获取功能【工厂模式是spring中最大的模式】
BeanFactory和ApplicationContext区别:
- ApplicationContext是BeanFactory的子接口
- BeanFactory:bean工厂接口,负责创建bean实例,容器里面保存的所有单例bean其实是一个Map
- ApplicationContext:是容器接口,更多的负责容器功能的实现(可以基于BeanFactory创建好的对象之上完成强大的容器)
- BeanFactory是最顶层的接口,ApplicationContext是留给程序员用的ioc接口