杰表技术论坛 's Archiver

admin 发表于 2011-11-2 13:03

spring装配

参考: 《spring in action》
1. DI依赖注入,也称ioc,是一个对象a要用到另一个对象b时,b已经存在了。就象一个人(a)当需要shopping时,钱包(b)已经被放在a的口袋里了,多好:)。
2. 管理对象的整个生命周期(从new 到finalize),都在容器的控制之下。
3. 两类容器,beanfactory,和applicationfactory,后者可以进行事件管理。后者继承自前者。
4. xmlbeanfactory是一种beanfactory,需要一个配置文件Resource,作为参数。
5. beanfactory单实例,是延迟加载,而applicationfactory则一次加载完成。
6. beanfactory对bean创建的介入次序:
    a. beannameaware.setBeanName
    b. beanfactoryaware.setBeanFactory
    c. applicationcontextaware.setapplicationcontext. 只对 ApplicationBeanFactory
    d. beanpostprocessor.postProcessBeforeInitialization ?经测试,没调用
    e. initializingbean.afterPropertiesSet
    f. bean.init-method,在配置文件里,设置 init-method属性。
    g. beanpostprocessor.postProcessAfterInitialization,同样没调用
    ok!可用。
7. 可以配置 constructor-arg属性,让工厂调用带参数构造函数创建bean.
8. 可使用匿名bean作为参数,注入另一个bean中,如:
   <bean ...><property name="car"><bean class='xxx.Car' ></property>..
9. 可以给集合赋值的元素有 <ref>,<value>,<null/>,<bean>.
10. 集合元素
    a. <list><ref(value/null/bean)>...
    b. <set><ref(value/null/bean)>...
    c. <map><entry key=? value-ref=?>
    d. <props><prop key=?>?</prop>
11. 赋空值为 <null/>, 如: <property name='words'><null/></..>
12. 按属性自动装配
    a. 将 bean的autowire="byName"
    b. 需要装配的对象,必须有 setXXX方法 ,光有xxx的field还不行,这跟annotation有区别?
    原理是,factory创建一个bean后,如果发现是autowire,则查找所有可能的setXXX方法,如果方法找到,类型匹配,则自动设置之。
13. autowire可取值是 byName,byType,constructor,autodetect,我感觉byName最有用,其他三个,太灵活,没有啥实际价值。
14. 可以使用scope来控制,每次请求bean时,生成一个bean实例。
15. scope取值可以是 singleton、prototype、request、session、global-session,默认是 singleton
16. 可以使用 factory-method ,配置一个创建bean的工厂方法。
17. 可以使用 init-method,来定义bean初始方法。
18. 可以使用 destroy-method,来定义bean的销毁方法。
19. 可以使用 default-init-method,default-destroy-method来定义全局的默认初始化,销毁方法。
20. 可以使用initializingBean(afterPropertiesSet),和 disposablebean控制bean生成。

admin 发表于 2011-11-2 14:38

spring高级装配
1. 可以使用 abstract,和 parent 来简化重复的 bean配置。
2. 可以用一个 MethodReplacer的实例,对bean的方法进行替换,如:
   <bean>
     <replace-method name="getContents()" replacer="xx">
   </bean>
   <bean id=xx class="com.MyMethodReplacer"/>
   public class MyMethodReplacer implements MethodReplacer
   {
   ...
   }

   这种替换,很象方法监听器,方法执行时,自动移化接木,要实现这个,proxy化bean是必须的。

3. 有返回值的方法注入:
   <bean class='Test'>
      <lookup-method name="getXXX" bean="guitar">
   <bean>

   class abstract Test
   {
       ...
       public abstract Object getXXX();
   }
   既然是 abstract,factory也能初始化?
4. 非工厂创建的对象,进行DI:
   <aop:spring-configured>
   <bean id='animal' abstract='true' class='com.Animal'/>

   @Configurable("animal")
   class Animal{}

5. BeanFactoryPostProcessor.postProcessBeanFactory只对上下文工作起作用。
6. 使用?.properties文件
  <bean class='... PropertyPlaceHolderConfigure'>
    <list>
       <value>jdbc.properties</value>
    </list>
  </bean>
  <bean>
     ...
     <property name="url" value="{jdbc.url}"/>


7. 事件监听:
   class MyEvent extends ApplicationEvent{...}
   class Dog implements ApplicationContextAware{
         context
         setcontext(){}
         firechange()
   }

   class Cat implements ApplicationListener
   {
       onApplicationEvent(e)
       {
         if(e instanceof MyEvent)
         ...
       }
   }

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.