spring日记(三):在Ioc中装配Bean
循环依赖问题:如果两个Bean都通过构造函数注入,并且在构造函数中互相引用对方,那么会出现死锁情况,这种情况下,只能修改构造函数注入方法,改成属性输入。
注入参数详解:
一般来讲,基本数据类型及其封装类、String等类型可以采用字面值注入,就是<value>元素,Spring容器在内部为字面值提供了编辑器,可以将字符串表示的字面值转换为内部变量的相应类型。spring允许用户注册自定义的编辑器,以处理其他类型属性注入时的转换工作。
看到了那个brand属性的字面值没?那是一个特殊的XML符号,<![CDATA[....]]>的作用是让解析器将里面的东东当做普通文本对待,不要解析了,不过这个只能用在<value></value>元素中,如果是直接用简化方式,比如<property name="speed", value="aaa&bb">,只能用后面的转移字符了。或者使用特殊实体符号:<(<)、>(>)&(&)、"(")、'('),注意,value里面的空格会连带一起付给这个属性,所以最好不要加空格换行啥的。
现在最优雅的配置方式是使用p命名空间:
lookup方法注入(CGLib实现):
适用场景为希望通过一个singleton Bean 获取一个prototype Bean的时候,每次调用方法获取的对象都不一样:
》基于注解的配置:
@Component、@Repository(对DAO)、@Service、@Controller标注POJO类,然后在spring配置文件中引入context命名空间,pom中引入对于的jar包依赖,然后开始扫描:
所有这些过滤中,aspectj的过滤表达能力最强,它可以轻易实现其他类型所能表达的过滤规则。》使用@Autowired进行自动注入package com.baobaotao.anno; import org.springframework.beans.factory.BeanNameAware;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Service; @Servicepublic class LogonService implements BeanNameAware{ @Autowired(required=false) private LogDao logDao; @Autowired @Qualifier("userDao") private UserDao userDao;}一般原则:采用XML配置DataSource、SessionFactory等资源Bean,在XML中利用aop、context命名空间进行相关主题的配置。其他所有项目中开发的Bean,都通过基于注解配置的方式进行配置,即整个项目采用“基于XML+基于注解”的配置方式,很少采用基于Java类的配置方式。