Spring是一个开源框架,为解决企业级应用程序开发复杂性而创建的。
Spring以IOC、AOP为主要思想构建JavaEE框架
IOC容器(Inversion of Control ):控制反转,控制权从应用程序转移到框架,是框架共有特性。
IOC容器的特点:
无需主动new对象;而是描述对象应该如何被创建即可,IoC容器帮你创建,即被动实例化;
不需要主动装配对象之间的依赖关系,而是描述需要哪个服务(组件),IoC容器会帮你装配(即负责将它们 关联在一起),被动接受装配;
迪米特法则(最少知识原则):不知道依赖的具体实现,只知道需要提供某类服务的对象(面向抽象编 程),松散耦合,一个对象应当对其它对象有尽可能少的了解;
IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。
DI( Dependency Injection ):依赖注入用一个单独的对象(装配器)来装配对象之间的依赖关系 。
DI优点:
帮你看清组件之间的依赖关系,只需要观察依赖注入的机制(setter/构造器),就可以掌握整个依赖(类与 类之间的关系)。
组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、 可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资 源,完成自身的业务逻辑,而不用关心具体的资源来自何处、由谁实现。
1.添加Spring依赖
2.编写一个简单的类
3.在配置文件中描述该类
4.启动容器,并从容器里拿到Bean。
5.拿到对象之后,调用方法的结果:
下图表示Spring容器,Bean的配置信息,Bean的实现类以及应用程序的关系
1.Bean的实例化
2.1构造方法实例化
上述helloSpring就是用构造方法实例化的Bean,默认有一个构造方法
2.2静态工厂方法实例化
利用了工厂设计模式,通过一个标识,创建一个实例对象。
2.3实例化工厂
容器再启动的时候就已经实例化好了对象
2.Bean的依赖配置
2.1依赖装配方式
按构造函数的参数类型以及构造方法的参数顺序自动装配。
这意味着,如果一个bean的数据类型与其它bean的构造器参数的数据类型是相同的,那么将自动装配。
当然 如果装配过程中构造方法的参数具有歧义的时候,就需要我们指定类型,位置或者参数名的方式来告知Spring如何装配。
通过Bean的引用
在Spring容器中有某个Bean的构造函数的参数类型,可以将其装配其中
通过参数类型
通过参数位置
通过参数名称
通过Setter方法装配
2.2依赖和配置详解
idref只将某个字符串配置到属性或者构造函数中
ref是将目标Bean定义的实例装配到属性或构造函数中
2.3Collection
2.4null和空字符串
2.5延迟初始化
Spring默认容器启动时将所有的Bean都初始化完成,设置延时初始化时告诉容器在第一次使用Bean的时候,完成初始化操作,而不是启动时。
3.Bean的作用域
singleton:该作用域下的Bean在IOC容器只存在一个实例,所有对象对其的引用都返回同一个
prototype:每次对该作用域下的Bean的请求都会创建新的实例
reuqest:每次Http请求会创建新的Bean实例
Session:在一个http Session中,定义一个Bean实例
application session :在一个http session Context 中,定义一个Bean实例。
4.基于注解配置
基于注解配置的时候需要在XML文件中配置:<context:component-scan/>来告诉Spring容器开启注解Bean的扫描
用来标识为一个Bean
@Component,@Repository(用户DAO实现了进行标识),@Serivce(用于Service实现类进行标识),@Controller(用于Controller实现类进行标识)
@Autowired自动装配:@Autowired默认是按类型 (byType)匹配的方式在容器中查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。,如果容器中没有找到和标注变量类型匹配的Bean,那么Spring容器启 动时将报 NoSuchBeanDefinitionException 异常。如果希望Spring即使找不到匹配的Bean完成注入时也不要抛 出异常,那么可以使用 @Autowired(required=false) 进行标注。
@Qualifier注入指定Bean
@Scope(作用域), @PostConstruct(创建好Bean后需要做的事儿), @PreDestroy(销毁Bean之前需要做的事儿)