spring笔记6 spring IOC的中级知识
1,spring ioc的整体流程,xml配置
步骤编号 | 完成的工作 |
1 | spring容器读取配置文件,解析称注册表 |
2 | 根据注册表,找到相应的bean实现类实例化bean |
3 | 把实例化之后的bean放到spring容器中 |
4 | spring开放准备好的bean供程序使用 |
配置方法:
常见的自定义命名空间:
增加自定义的命名空间很easy,如果所示,独家秘籍····
简称 | 说明 |
beans | 配置bean |
aop | aop的配置 |
tx | 声明式事物 |
mvc | mvc的配置 |
util | 简化某些标准配置 |
jee | java EE的EJB,jndi |
jdbc | 配置数据库提供的schema |
jms | jms配置 |
lang | 支持Jruby,Groovy的配置 |
oxm | xml映射的配置 |
task | 任务调度的配置 |
tool | 有用工具定义的配置 |
2,依赖注入,注入参数,方法注入
一般配置bean指定id,name不推荐使用;
依赖注入主要有两种,即属性注入和构造函数注入,工厂方法注入,具体选择视实际情况来;
属性注入:在xml中的bean节点中,通过<property name="xxx" value="xxx"/> 属性设置方法的前两个字符要全部大写或者小写;
构造函数注入:在xml中的bean节点中,通过<constructor-arg index="n" type="XXX" value="XXX"/>,对于构造函数的循环依赖,把其中一个改造成属性注入即可解决;
工厂方法注入:通过属性 factory-bean factory-method指定
注入参数:
字面值直接使用<value>来指定,特殊字符&xxx;来解决;比如大于 < 小于 > 连字符 & 单引号 '双引号 "
引用<ref bean="xxx"/> 引用存在于本配置文件或者父配置文件中;
内部引用可直接定义bean
特殊的null值通过<null>来指定
支持级联的属性赋值;
集合类型支持到List,Set,Map,Properties
强类型同map
集合还可通过 merge 属性指定合并,可通过util命名空间来简化集合配置,使用p空间来简化属性配置;
自动装配:在bean中指定 autowire 类型可以是 byName,byType,constructor,autodetect,不推荐自动装配
方法注入:
lookup,一般用在单例的属性是原型的实例,视情况需要是否引入CGLib依赖
<replace-method name="方法名" replacer="替换接口实现类"> 可以替换方法,接口是MethodReplacer;
3,bean之间的关系
bean之间的关系分三类,分别是继承,依赖,引用
继承通过在父bean中加个 abstract属性,子bean中加一个parent属性;
依赖通过增加属性 depends-on="xxx"
引用通过<idref bean="xxx">
4,整合配置文件,bean的作用域,FactoryBean
通过在主配置文件中增加<import resource="classpath:XXXX"/> 来整合
bean的作用域,如果是web应用,除了singleton和prototype之外还有request,session,globalSession
singleton是单例无状态的,spring的dao都可以采用单例的模式,spring放在了容器的缓存池里面;
prototype每次都会实例化一个对象;
要在web环境下使用其它的三种作用域,需要在web.xml中配置一个RequestContextListener;
如果单例的或者原型的实例依赖web作用域的某个实例,在web作用的bean里面增加<aop:scoped-proxy/>
如果实例化比较复杂,可以使用FactoryBean来定义实例;
5,基于注解的配置
四类注解来标识bean
@Component 标识一般的bean
@Repository 标识dao
@Service 标识service
@Controller 标识控制层
配置扫描:<context:compnent-scan base-package="xxx" resource-patter="xxx"> 它的过滤方式有多种,annotation,assignable,aspectj,regex,custom;
自动注入:
@Autowired 有required属性标识缺失是否报错,Qualifier标识名称;可对属性和方法进行标注;
其它的比如:@Inject @Resource功能一样,但是功能没它强大,可忽略;
生命周期的支持:通过@PostConstruct 来定义init-method ,通过@PreDestroy来定义 destroy-method
@Scope来定义作用域
@Value来引用其它的bean的属性
@Lazyl来定义是否延迟加载
6,基于java类的配置
这里省略,用的不多;
7,小结
最常用的是采用xml配置第三方的bean工具,本应用开发采用注解来配置;