Spring
Spring核心是控制反转(IOC),通过配置文件实现对象的注入,由Spring容器进行对象创建
Spring提供事务处理功能,为底层事务处理在技术上提供一个同意的编码模型
SpringAOP:面向切面编程,因其核心是控制反转,很容易使Spring依赖注入为AOP提供支持
控制反转
依赖注入
接口注入
Set注入
基于setter的依赖注入,是调用无参的构造函数或无参的静态工厂方法实例化配置文档中的定义的Bean之后,通过调用Bean上的setter方法实现
构造注入
<bean id = "唯一id" class = "类所在包名">
<constructor-arg index = "0">
<value>注入值</value>
</constructor-arg>
</bean>
constructor-arg:用来通过构造方法来注入参数
index = “0”:表示构造方法中第一个参数值,若只有一个参数,该值可不设置
基于构造函数的依赖注入,是通过调用带有许多参数的构造方法实现,每个参数表示一个对象或属性
核心容器
Bean的基本知识
一个Bean一般只有一个id,若一个Bean有超过一个的id,那么另外的id可以认为是这个Bean的别名
Bean可被定义为两种部署模式中的一种:singleton或non-singleton(prototype),其默认的部署模式为singleton
singleton:只有一个共享实例,对这个Bean的访问都会返回这个唯一实例,注:有些像单例模式
non-singleton(prototype):每次请求都会创建一个实例,相当于new,注:有些像工厂模式
使用依赖depends-on
depends-on属性可以用来在初始化Bean之前,强制执行一个或多个Bean的初始化
Bean的生命周期
Bean的定义 -> Bean的初始化 -> Bean的使用 -> Bean的销毁
Bean的定义
一个大应用中,可能需要很多的Bean在配置文件中定义,这样会造成代码的可读性变低,通常可以把相关Bean放在另一个配置文件中
Bean的初始化
实现方式
1.配置文件中使用init-method属性来完成(init-method = “对应Java文件Bean中赋值的方法”)
2.实现InitializingBean接口
Bean的使用
使用方式
1.BeanWrapper
2.XmlBeanFactory
3.ApplicationContext
Bean的销毁
销毁方式
1.配置文件中指定destroy-method属性来完成(destroy-method= “对应Java文件Bean中销毁的方法”)
2.实现DisposableBean接口
用ref属性指定依赖的方式(3种)
三种模式:local、Bean、parent
local方式
若被参考引用的Bean使用id命名,则使用local,会让XML更早的解析
<bean id ="XXX" class = "XXX.XXX.XXX">
<property name = "date">
<ref local = "date"/>
</property>
</bean>
<bean id = "date" class = "java.util.Date">
Bean属性指定
最常见的形式,允许指向的Bean不在同一XML中
<bean id ="XXX" class = "XXX.XXX.XXX">
<property name = "date">
<ref bean = "date"/>
</property>
</bean>
<bean id = "date" class = "java.util.Date">
parent属性指定
允许引用当前BeanFactory或ApplicationContext的父BeanFactory或ApplicationContext中的Bean
<bean id ="XXX" class = "XXX.XXX.XXX">
<property name = "date">
<!--允许引用当前BeanFactory或ApplicationContext的父BeanFactory或ApplicationContext中的Bean-->
<ref parent = "date"/>
</property>
</bean>
local属性指定和Bean属性指定依赖比较
相同:都可以用Bean的id来引用,都可对同一XML中Bean引用
不同:Bean属性依赖可以用Bean的name进行引用,还可以引用不用XML中的Bean
Bean的自动装配(5种)
自动装配可以使开发者减少指定属性的需要,节省一些属性设定工作
byName模式
通过指定Bean属性的名字进行自动装配,在配置的XML中找到一个将要装配的属性名字相同的Bean
<bean id ="XXX" class = "XXX.XXX.XXX" autowire = "byNname">
<property name = "msg">
<value>XXXXX</value>
</property>
</bean>
<bean id = "date" class = "java.util.Date">
因封装实体类中有Date的获取和赋值,autowire = "byNname"可以自动去寻找date相应的bean进行配置
byType模式
如果XML中正好有一个属性类型一样的Bean则自动装配,若有多个则抛出异常
<bean id ="XXX" class = "XXX.XXX.XXX" autowire = "byType">
<property name = "msg">
<value>XXXXX</value>
</property>
</bean>
<bean id = "date" class = "java.util.Date">
若没有匹配的Bean,则不会发生什么,属性同样不会被设置,可设置dependency-check = “objects”属性来抛出错误
construtor模式
根据构造函数的参数进行自动装配
public XXX(Date date){this.date = date}
<bean id ="XXX" class = "XXX.XXX.XXX" autowire = "construtor">
<property name = "msg">
<value>XXXXX</value>
</property>
</bean>
<bean id = "date" class = "java.util.Date">
autodetect模式
autodetect是通过对Bean检查类内部来选择construtor或byType,若先找到construtor则先进行装配,无则使用byType装配
<bean id ="XXX" class = "XXX.XXX.XXX" autowire = "autodetect">
<property name = "msg">
<value>XXXXX</value>
</property>
</bean>
<bean id = "date" class = "java.util.Date">
no模式
指的是不自动装配
<bean id ="XXX" class = "XXX.XXX.XXX" autowire = "no">
<property name = "msg">
<value>XXXXX</value>
</property>
<property name = "date">
<ref baen = "date">
</property>
</bean>
<bean id = "date" class = "java.util.Date">
总结
显式指定依赖,例如property和constructor-arg元素,总会覆盖自动依赖,大型应用建议使用
依赖检查(4种)
默认不检查,可使用Bean中元素dependency-check属性指定依赖检查(simple、object、all、none)
因自动装配是隐式的,不像ref比较直接,开发人员很难看清依赖,所以要借助检查来查看是否完成功能
simple模式
simp是对基本类型、字符串、和集合进行依赖检查
<bean id ="XXX" class = "XXX.XXX.XXX" autowire = "autodetect" dependency-check = "simple">
</bean>
<bean id = "date" class = "java.util.Date">
object模式
对依赖对象进行检查
<bean id ="XXX" class = "XXX.XXX.XXX" autowire = "autodetect" dependency-check = "object">
</bean>
<bean id = "date" class = "java.util.Date">
因依赖对象只有Date,所以只对Date进行检查
all模式
对全部属性进行检查
<bean id ="XXX" class = "XXX.XXX.XXX" autowire = "autodetect" dependency-check = "all">
</bean>
<bean id = "date" class = "java.util.Date">
none模式
不检查模式,即默认
<bean id ="XXX" class = "XXX.XXX.XXX" autowire = "autodetect" dependency-check = "none">
</bean>
<bean id = "date" class = "java.util.Date">
总结
一般情况自动装配和依赖检查都是配合使用的
集合的注入方式
List
<bean id ="XXX" class = "XXX.XXX.XXX">
<property name = "msg">
<list>
<value>XXXXX</value>
<value>XXXXX</value>
<value>XXXXX</value>
</list>
</property>
</bean>
Set
<bean id ="XXX" class = "XXX.XXX.XXX">
<property name = "msg">
<set>
<value>XXXXX</value>
<value>XXXXX</value>
<value>XXXXX</value>
</set>
</property>
</bean>
Map
<bean id ="XXX" class = "XXX.XXX.XXX">
<property name = "msg">
<map>
<entry key = "XXX">
<value>XXXXX</value>
</entry>
<entry key = "XXX">
<value>XXXXX</value>
</entry>
</map>
</property>
</bean>
Properties
<bean id ="XXX" class = "XXX.XXX.XXX">
<property name = "msg">
<props>
<prop key = "XXX">XXXX</prop>
<prop key = "XXX">XXXX</prop>
</props>
</property>
</bean>
管理Bean(3种)
BeanWrapper管理
Bean先提供一个无参构造,配置文件不需要改变,只修改测试程序
//通过反射获取该Bean的一个实例
//BeanWrapper利用多态实现实例化
BeanWrapper beanWrapper = new BeanWrapperImpl(通过反射获取的Bean实例);
//通过BeanWrapper来设定属性
beanWrapper.setPropertyValue("Bean相应属性","值");
//通过BeanWrapper来获取相应属性
beanWrapper.getPropertyValue("Bean相应属性");
XmlBeanFactory管理
XmlBeanFactory实际上是实例化,配置和管理众多Bean的容器
配置文件不变,只测试代码改变
//通过ClassPathResource获取配置文件
ClassPathResource classPathResource = new ClassPathResource("配置文件");
//通过XmlBeanFactory解析配置文件
XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(classPathResource);
//根据id获取Bean
Bean名 对象名 = (Bean名) xmlBeanFactory.getBean("Bean的id");
ApplicationContext管理
ApplicationContext是建立在XmlBeanFactory基础上,并增加了一些功能
//通过ApplicationContext获取配置文件
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("配置文件");
//根据配置id获取Bean
Bean名 对象名 = (Bean名) actx.getBean("Bean的id");
ApplicationContext经常用
ApplicationContext更强功能
国际化支持、资源访问、事件传递