一、配置bean
1.使用xml <bean>标签
2.使用注解
配置自动扫描组件:<context:component-scan base-package="" resource-pattern="" use-default-filters="">
(1)base-package扫描指定包,resource-pattern扫描该包下指定资源;
(2)component-scan下可以使用<context:include-filter type="annotation"expression=""/>指定包含哪些注解(如果指定只包含,其他不行,需要配合使用use-default-filters="false"),<context:exclude-filter type="annotation" expression=""/>排除哪些注解;
二、属性赋值
XML:
1.使用<property>:<bean>下面增加节点<property name="" value="" ref="">或者property下面可以增加<value>节点(如果赋值有特殊字符可以用<![cdata[ ]]>)
2.使用构造器<constructor-arg>:<bean>下面增加节点<constructor-arg>
3.级联赋值:为其引用对象的属性赋值<property name="id.name" value="" >(注意引用对象要先初始化)
4.赋值集合属性<property name="">下使用<list><map><set>
注解:
@Value
三、自动装配
1.xml中使用<bean autowire="byType"> byType或者byName
2.注解使用@Autowired或者@Resource、(使用注解在字段上这样就不用写setter方法了)
(1)@Autowired默认按类型装配
(2)@Resource属于javaee默认按照名字装配
3.缺点(对于xml配置):
Autowired配置在bean上,会使得这个bean的所有引用对象都自动装配,不够灵活;Autowired要么根据类型要么根据名字装配,不能两种兼容;对于xml配置方式来说,使用手动装配更明确清晰;
四、bean的作用域名
配置作用域方式可以使用xml的<bean scope="">和注解@scope,具体有以下几种:
singleton :默认是单例的,容器中只会存在一个共享的bean实例,加载配置时实例
prototype:原型,每一次从容器中获取bean,都会产生一个新的bean实例,使用时实例
request:表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
session:表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
global session:只有应用在基于porlet的web应用程序中才有意义,它映射到porlet的global范围的session,如果普通的servlet的web 应用中使用了这个scope,容器会把它作为普通的session的scope对待。
五、使用外部属性文件
主要是使用spring的PropertyPlaceholderConfigurer类,xml中配置
<context:property-placeholder location="classpath:jdbc.properties"/>,其他引用使用${}
六、SpEL
Spring 表达式语言,SpEL格式为#{ SpEL expression },支持文本表达式;布尔类和关系操作;正则表达式;访问属性、数组、集合和map;赋值操作;三元操作等等。
七、bean生命周期
Spring容器 生命周期管理过程
-通过构造器或者工厂方法创建bean实例
-为bean属性赋值和对其他bean引用
-调用bean的初始化方法(xml:init-method 注解:@PostConstruct)
-可以使用bean
-容器关闭调用bean的销毁方法(xml:destroy-method 注解:@PreDestroy)
八、新特性:泛型依赖注入
九、Sping IOC实例化流程
1.ResourceLoader从存储介质中加载Spring配置信息,并使用Resource表示这个配置文件的资源;
2.BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中的每一个解析成一个BeanDefinition对象,并保存到注册表BeanDefinitionRegistry中;
3.容器扫描注册表BeanDefinitionRegistry中的BeanDefinition,使用Java的反射机制自动识别出Bean工厂处理器(实现BeanFactoryPostProcessor接口)的Bean,然后调用这些Bean工厂后处理器对BeanDefinitionRegistry中的BeanDefinition进行加工处理;
4.Spring容器从BeanDefinitionRegistry中取出加工后的BeanDefinition,并调用InstantiationStrategy着手进行Bean实例化工作;
5.在实例化Bean时,Spring容器使用BeanWrapper对Bean进行封装,BeanWrapper提供了很多以Java反射机制操作Bean的方法,它将结合该Bean的BeanDefinition以及容器中属性编辑器,完成Bean属性的设置工作;
6.利用容器中注册的Bean后处理器(实现BeanPostProcessor接口的Bean)对已经完成属性设置工作的Bean进行后续加工,直接装配出一个准备就绪的Bean。