Spring中ApplicationContext和beanfactory区别
1.依赖注入
- 设值注入
//Person.java
public class Person{
private Address address;
//set方法
...
}
//Address.java
public class Address{
...
}
//配置文件
<bean id="address" class="***.Address"/>
<bean id="person" class="***.Person">
<property name="address" ref="address"/>
</bean>
- 构造注入
//Person.java
public class Person{
private Address address;
//构造方法
public Person(Address address){
this.address = address;
}
}
//Address.java
public class Address{
...
}
//配置文件
<bean id="address" class="***.Address"/>
<bean id="person" class="***.Person">
<constructor-arg ref="address"/>
</bean>
2. 注入集合值
Java类
public class Test{
//一系列集合
private List<String> schools;
private Map scores;
private Map<String, Axe> phaseAxes;
private Properties health;
private Set axes;
private String[] books;
...
}
配置文件
<bean id="test" class="***.Test">
<!-- List<String> -->
<property name="schools">
<list>
<value>小学</value>
<value>初中</value>
<value>高中</value>
</list>
</property>
<!-- Map -->
<property name="scores">
<map>
<entry key="语文" value="22"/>
<entry key="数学" value="33"/>
<entry key="英语" value="44"/>
</map>
</property>
<!-- Map<String,Axe> -->
<property name="phaseAxes">
<map>
<entry key="原始社会" value-ref="stoneAxe"/>
<entry key="农业社会" value-ref="stellAxe"/>
</map>
</property>
<!-- Properties -->
<property name="health">
<props>
<prop key="血压">正常</prop>
<prop key="身高">1.82</prop>
</props>
</property>
<!-- Set -->
<property name="axes">
<set>
<!-- 每个value,ref,bean..都配置一个set集合 -->
<value>普通的字符</value>
<bean class="***.SteelAxe"/>
<ref bean="stoneAxe"/>
<!-- 为set集合配置一个List集合作为元素 -->
<list>
<value>20</value>
<!-- 再次为List集合配置一个set集合作为元素 -->
<set>
<value type="int">30</value>
</set>
<list>
</set>
</property>
<!-- String[] -->
<property name="books">
<value>哈哈</value>
<value>嘻嘻</value>
<value>嘿嘿</value>
</property>
</bean>
3. Spring3.0注解配置
@Configuration
public class AppConfig{
//相当于定义一个personName的变量,值为“孙悟空”
@Value("孙悟空") String personName;
//配置一个bean:chinese
@Bean(name="chinese")
public Person person(){
Chinese p = new Chinese();
p.setAxe(stoneAxe());
p.setName(personName);
return p;
}
//配置bean:stoneAxe
@Bean(name="stoneAxe")
public Axe stoneAxe(){
return new StoneAxe();
}
}
- @Configuration:用于修饰一个Java配置类
- @Bean:用于修饰一个方法,将方法返回值定义成容器的一个Bean
- @Value:修饰一个Field。配置一个变量。
4. Spring容器中,Bean实例的生命周期
开始–>创建实例–>注入依赖关系–>调用afterPropertiesSet(实现InitializingBean接口)–>调用init-method方法–> …. –>调用destroy(实现DisposableBean接口)–>调用destroy_method方法–>结束
5.协调作用域不同步的Bean(lookup)
步骤:
- 将调用者Bean的实现类定义为抽象类,并定义一个抽象方法来获取被依赖的Bean
- 在