IoC 容器
IoC容器是个装配工厂 给它图纸(xml各式的配置文件或者元数据配置信息)和零件(JavaBean),它就能生产出汽车(... 实现复杂功能的对象和应用) 当然了,最后。。。车还得你自己开
org.springframework.beans.factory.BeanFactory
BeanFactory 是基本的IoC容器,能够管理、操纵受管
bean org.springframework.context.ApplicationContext
ApplicationContext 扩展了BeanFactory的功能,是一个增强功能的IoC容器。
它还实现了几个其他的接口MessageSource, ApplicationEventPublisher,ResourcePatternResolver。分别用于国际化消息,事件发布,获取资源。
---------
零件
定义一个接口 Hello
spring\hello\Hello.java
...
public interface Hello {
String hello();
}
Hello 的一个实现
使用setX注入参数x
spring\hello\HelloBean.java
...
public class HelloBean implements Hello {
private String x;
public String getX() {
return x;
}
public void setX(String x) {
this.x = x;
}
@Override
public String sayHello() {
return "Hello " + x;
}
}
Hello 的另一个实现
使用spring的回调接口ApplicationContextAware注入ApplicationContext 以访问国际化消息
spring\hello\HelloBeanx.java
...
public class HelloBeanx implements Hello, ApplicationContextAware {
private ApplicationContext cxt;
@Override
public void setApplicationContext(ApplicationContext cxt)
throws BeansException {
this.cxt = cxt;
}
@Override
public String sayHello() {
return cxt.getMessage("hi", new String[] { "Fatina" }, Locale.CHINESE);
}
}
国际化消息
red.properties
hi = \u4f60\u597d {0}
red_en.properties
hi = hello {0}
图纸
beans.xml
配置消息源,id必须为messageSource,value的值指示了.properties文件的位置
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>red</value> </list> </property> </bean>
装配bean,下面两个bean 分别对应着两个不同的Hello实现,只要在beans.xml中替换他们,不需要修改HelloMain就可以改变输出结果
<bean id="hello" class="spring.hello.HelloBean"> <property name="x" value="Molly" /> </bean>
<bean id="hello" class="spring.hello.HelloBeanx"></bean>
汽车
spring\hello\HelloMain.java
从BeanFactory 获取bean
Resource res = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(res);
Hello hello = (Hello) factory.getBean("hello");
log.info(hello.hello());
从ApplicationContext 获取bean
ApplicationContext cxt = new FileSystemXmlApplicationContext("beans.xml");
Hello hello = (Hello) cxt.getBean("hello");
log.info(hello.hello());
对于HelloBean 上面两种方式的效果是一样一样一样的啊
对于HelloBeanx 因为它要获得一个ApplicationContext的引用 所以只能使用ApplicationContext