Spring简介
Spring由Rod Johnson开发,2004年发布了Spring框架的第一版本,Spring是一个从实际开发中抽取出来的框架,他完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提供了企业应用开发的效率
Spring优点
低侵入式设计,代码的污染极低。
独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺。
Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦。
Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。
Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。
Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。
Spring框架的组成结构框架图:
Spring框架管理bean的核心机制
程序主要是通过Spring容器来访问容器中的Bean,ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类:
ClassPathXmlApplicationContext: 从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器。
FileSystemXmlApplicationContext: 从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件来创建Spring容器。
bean管理示例实现代码:
public class test{
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplication("bean.xml");
Person person = context.getBean("person",Person.class);
person.toString();
}
Spring的依赖注入DI
依赖注入用于为bean注入响应的属性值。通过使用依赖注入,不仅可以为bean注入简单的属性值,还可以注入其他bean的引用
依赖注入是一种优秀的解耦方式,其可以让bean以配置文件来组织在一起,而不是以硬编码的方式耦合在一起
依赖注入的别名:控制反转IOC
依赖注入分为两种方式:设值注入和构造注入,其中设值注入在4.0版本以前是通过setter方式进行属性值注入的,而在4.0版本后就是使用反射等进行属性值注入;而构造注入是通过bean类的构造器对属性进行注入
在大多数情况下,建议以设值注入为主,构造注入为辅的方式进行依赖注入。对于依赖关系无须变化的注入尽量采用构造注入
Spring中的bean的作用域
Spring中的bean支持五种作用域:
1.singlton单例模式:在整个SpringIOC容器(ApplicationContext)中,该作用域下的bean将只生成一个实例
2.prototype:每次通过容器的getBean()获取bean时,都会产生一个新的实例
3.request:对于每次http请求,容器都将产生一个新的实例。只有在web应用中使用Spring容器时该作用域才有效
4.session:对于一次会话,容器都将只产生一个实例。同样只有在web应用中使用Spring容器时该作用域才有效
5.global session: 每个全局的HTTP Session对应一个Bean实例。在典型的情况下,仅在使用portlet context的时候有效,同样只在Web应用中有效。
如果不指定Bean的作用域,Spring默认使用singleton作用域。prototype作用域的Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成果,就可以重复使用。因此,应该尽量避免将Bean设置成prototype作用域。
Spring的自动装配(主要用于bean之间ref)
Spring能自动装配Bean与Bean之间的依赖关系,即无须使用ref显式指定依赖Bean,而是由Spring容器检查XML配置文件内容,根据某种规则,为调用者Bean注入被依赖的Bean。
装配方式有如下五种:
1.no: 不使用自动装配。Bean依赖必须通过ref元素定义。这是默认配置,在较大的部署环境中不鼓励改变这个配置,显式配置合作者能够得到更清晰的依赖关系。
2.byName: 根据setter方法名进行自动装配。Spring容器查找容器中全部Bean,找出其id与setter方法名去掉set前缀,并小写首字母后同名的Bean来完成注入。如果没有找到匹配的Bean实例,则Spring不会进行任何注入。
3.byType: 根据setter方法的形参类型来自动装配。Spring容器查找容器中的全部Bean,如果正好有一个Bean类型与setter方法的形参类型匹配,就自动注入这个Bean;如果找到多个这样的Bean,就抛出一个异常;如果没有找到这样的Bean,则什么都不会发生,setter方法不会被调用。
4.constructor: 与byType类似,区别是用于自动匹配构造器的参数。如果容器不能恰好找到一个与构造器参数类型匹配的Bean,则会抛出一个异常。
5.autodetect: Spring容器根据Bean内部结构,自行决定使用constructor或byType策略。如果找到一个默认的构造函数,那么就会应用byType策略。
当一个Bean既使用自动装配依赖,又使用ref显式指定依赖时,则显式指定的依赖覆盖自动装配依赖;对于大型的应用,不鼓励使用自动装配。虽然使用自动装配可减少配置文件的工作量,但大大弱化了依赖关系的清晰性和透明性。依赖关系的装配依赖于源文件的属性名和属性类型,导致Bean与Bean之间的耦合降低到代码层次,不利于高层次解耦
1.全局默认bean装配方式设置:<beans default-autowire />;
2.指定的bean装配方式设置:<bean id="" autowire-candidate="false"/>;
3.全局指定beans不自动装配:<bean id="" autowire-candidate="false"/>;
4.指定的bean不自动装配:<bean id="" autowire-candidate="false"/>;</h5>