《Spring in Action》笔记(一)(转载)

本文介绍了Spring框架中Bean的装配方法及注意事项,包括使用不同标签进行属性注入、集合类型配置、特殊属性处理等,并探讨了AOP在Spring中的实现方式与应用技巧。
第二章:装配 Bean

  --------------------------------------------------------------------------------

  1. <ref>标签中的 bean, local, parent 三个属性的区别(P53)

  2. <list><value...</list>和<set><value...</set>可以换着用都可以为 List, Set 以及数组属性赋值(P55)

  3. <map>属性用 spring 进行装匹时 key 值只能是字符串类型,不过一般能满足要求(P55)

  4. 装配 map 属性要用 <entry key="key1"><value>foo</value></entry>, 而装匹 properties 属性可以写成 <prop key="key1">foo</prop>, 这是因为 properties 的值总是字符串,而 map 中很随意(P55)

  5. 用 <property name="foo"><null/></property> 形式设置属性为 null, 区别为字符串 "null"(P56)

  6. 通过构造函数注入依赖时,对多参数需要借助于 index 或 type 属性来指定对应哪个参数,index 属性能应付所有情况(P58)

  7. 可为 bean 设置 autowire为四个值, byName, byType, constructor, autodetect, 四种方式自动装匹;也可以在 <beans> 中设置 default-autowire 属性。手动和自动可以混合使用,手动优先。你应该清楚自己在做什么,所以不建议用自动装配(P61)

  8. BeanPostProcessor的方法 postProcessBeforeInitialization 在 bean 初始化之前调用,postProcessAfterInitialization 是在 bean 初始化之后调用,需要注册到 BeanFactory 上,如 factory.addBeanPostProcessor(new BeanPostProcessor(){...})。内置的 ApplicationContextAwareProcessor 注册在了 AbstractApplicationContext 上了(P64)
9. BeanFactoryPostProcessor 是在 Bean 工厂载入所有 Bean 定义后,实例化 Bean 之前作处理。如果是 AbstractApplicationContext ,那么只需要配置 <bean id="myBeanFactoryPostProcessor" class="com.unmi.MyBeanFactoryPostProcessor"/>, 则会自动注册这个,原有的 BeanFactoryPostProcessor 不可用了,不需要显示式的调用 addBeanFactoryPostProcessor 方法(P67)

  10. 可用 PropertyPlaceholderConfigurer 载入属性文件,然后在其他引用 value 的地方用 ${database.url} 的方式引用(P70)

  11. 用 CustomEditorConfigurer 注册自己的 PropertyEditorSupport 关联特定的 bean 属性的处理,可了解 Spring 有哪些内置的 PropertyEditorSupport(P72)

  12. Spring 用 ResourceBundleMessageSource 处理国际化,配置成

  <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
  <property name="basename"> 
   <value>trainingtext</value> 
  </property>  
  </bean> 
  <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basename">
   <value>trainingtext</value>
  </property>
  </bean>

  会读取 trainingtext.prperties, trainingtext_en_US.properties 等。

  用 Sring text = context.getMessage("button.submit", new Object[0],locale); 或 <sping:message code="button.submit"/> 读取(P73)

13. 监听事件,配置实现了ApplicationListener的Bean,容器会自动注册它,发布ApplicationEvent时由它处理,事件的处理是同步的(P74)

  14. Bean 实现了 BeanNameAware, BeanFactoryAware 或 ApplicationContextAware 可以感知它自己或所处环境的信息,但这样做却让 Bean 与 Spring 框架耦合起来了(P76)

  第三章:创建切面

  --------------------------------------------------------------------------------

  15. AOP: spring 有两种代理创建方式,对接口方法用JDK的java.lang.reflect.Proxy类创建代理,对于未实现接口的借助于 CGLIB 库生成目标对象的子类,标记为 final 的方法不能被通知,因为子类中不能覆写该方法(P83)

  16. Spring 只支持方法连接点,应该也是秉着够用就行的道理,直接用 AspectJ 将能做十分细致的活,Spring 2.x 用上了 AspectJ。(P84)

  17. MyEclipse 提供了一种快捷方式来写Bean的配置,从左树上把类拖到打开的 Spring 的配置文件中依提示行事即可,实际使用中看是否真正实用

  18. 在 MethodBeforeAdvice中可以抛异常(或System.exit(),这有点过份了) 阻止目标方法的执行,如果此时抛出的异常是 RuntimeException 或者目标方法申明的异常,将会被 Spring 框架捕获(P86)

  19. MethodInterceptor 能控制目标方法是否真的被调用,用 methodInvocation.proceed() 调用目标方法(P89)

  20. MethodInterceptor 可以返回一个与目标方法不同的对象,但也必须是兼容的,否则出现 ClassCastException 异常(P89)

  21. 实现接口 ThrowsAdvice 的类,必须至少有一个如下形式方法:

  1)void afterThrowing(Throwable throwable)

2)void afterThrowing(Method method, Object[] args, Object target, Throwable throwable)

  在 ThrowsAdvice 并没有象 MethodBeforeAdvice, MethodAfterAdvice 和 MethodInterceptor 定义了要实现的方法,只是一个不成文的约定,不知作者是如何考虑的,怕定义了两个方法后实现类要实现两个方法(可能只需用到一个方法)而麻烦吗?那至少可以弄一个 ThrowsAdviceAdapter 的东西,Spring 中还确实有这玩艺,但不是那么回事。

  这种 ThrowsAdvice 对实现类不成文的规定,让在 IDE 中写代码不方便,也容易产生错误(P90)

  22. 当你的 ThrowsAdvice 同时实现了上面两个方法时,只有参数多的那个方法有效,只实现第一个方法也是可以的,所以在 ThrowsAdvice 的源代码中只提到要实现第二个方法,所以我就更想不能了,为什么在接口 ThrowsAdvice 中不定义这个方法呢?(P90)

  23. 记录几个书中错误:54页的java.awt应该是java.util。94页的maidService配置中的frequentCustomerAdvisor应该是 frequentCustomerPointcutAdvisor。108页,后面两个 proxyInterfaces 应该是 interceptorNames

  24. 用 NameMatchMethodPointAdvisor 能简单的用通配符控制切入点,但要细致的控制切入点就要用 RegexpMethodPointcutAdvisor 结合正则表达式了, 它可含有类名信息,而 NameMatchMethodPointAdvisor只需考虑方法名的匹配(P90)

  25. 动态切入点的配置方法与静态切入点略有不同,需要申明一个ControlFlowPointcut的Bean(Pointcut)作为DefaultPointcutAdvisor的pointcut属性,然后这个advisor配置到ProxyFactoryBean的interceptorNames,所以想,既然是叫做DefaultPointcutAdvisor,那么是不是别的Pointcut也可以通过这种方式来配置呢?动态切入点很损耗性能,非必要是不用,对JDK1.4会慢5位,对JDK1.3会慢10,对于JDK1.5恐怕也好不到哪儿去(P96)


  26. 觉得 Spring 的引用 IntroductionInterceptor 用起来特麻烦,远没有直接用 AspectJ 来的方便与简练(P100)

  27. 配置 ProxyFactoryBean 时不指定 proxyInterfaces 属性,直接指定 target 为Class,则会用CGLIB生成目标类的子类。即使指定的 proxyInterfaces 属性,设置 ProxyTargetClass 属性为 true,也会用 CGLIB 生成目标类的子类,而不是用JDK的动态代理(P106)

  28. 配置 ProxyFactoryBean 时可以把 target 目标对象配置为interceptorNames的最后一个属性(P108)

  29. 强大的自动代理:BeanNameAutoProxyCreator 和 DefaultAdvisorAutoProxyCreator。DefaultAdvisorAutoProxyCreator实现了 BeanPostProcessor 接口,它只能与 Advisor 配合使用,自动的处理所有的 Advisor (P109)

  30. 看到29条中的自动代理,让我回想起可以为一批 Bean 批量的增加 toString() 方法,只是那些 bean 必须通过 getBean()得来才能看到效果
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值