Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,怎么简化呢?通过IOC和AOP来实现的。程序的并通过POJO为基础的编程模型促进良好的编程习惯。
Spring IOC
Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。
Spring以Bean的方式管理所有的组件,J2EE的全部组件都被视为Bean管理,负责创建Bean的实例,并管理其生命周期,Bean在Spring的容器中运行,无须知道Spring容器的存在也可以使用Spring的一些特性
Spring配置文件
Bean标签中的属性:
id:Bean的唯一标识名,必须为合法的XML ID,在整个XML文档中唯一,如果没有特殊需要,我们在标识一个Bean的时候,一般推荐使用id。
name:用于为id创建一个或多个别名,可以是任意字母或者符号,多个别名之间以逗号或空格分隔
class:用于定义类的全限定名(包名加类名),Spring在创建对象的时候需要用到此属性,因此该属性不能指定接口。
parent:子类Bean定义其所引用的父类Bean,继承父类的所有属性。值得一提的是,在写代码的时候,即便是两个类之间没有继承关系,我们同样可以使用该属性。
abstract:用于定义Bean是否为抽象Bean,默认为false,表示此Bean将不会被实例化。一般用于父类Bean,可以在子类继承的时候使用。
scope:用于定义Bean的作用域,singleton表示在每个Spring IoC容器中一个bean定义对应一个对象实例,即Spring使用单例模式获取实例。prototype表示一个bean定义对应多个对象实例,即非单例模式
lazy-init:用于定义Bean是否实现初始化,默认为default。若为true,将在BeanFactory启动时初始化所有Singleton Bean;若为false,则在Bean请求时创建Singleton Bean
autowire:用于定义Bean的自动装配方式,默认为default,包括不使用自动装配功能、通过Bean的属性名实现自动装配、通过Bean的类型实现自动装配、通过Bean类的反省(Introspection)机制决定选择使用constructor或者byType。
IOC的优点
IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。
ApplicationContext
ApplicationContext是基于BeanFactory之上的,提供了应用程序框架服务,扩展的新功能如下
提供国际化的支持
资源访问,如URL和文件
事件传递
载入多个配置文件等
依赖注入
依赖注入有两种方式:
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
<bean id="computer2" class="com.zzzy.ch1.Computer">
<constructor-arg index="0" ref="mainFrame" />
<constructor-arg index="1" ref="samsung" />
</bean>
Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
<bean id="computer" class="com.zzzy.ch1.Computer" >
<property name="mainFrame" ref="mainFrame"/>
<property name="display" ref="lg" />
</bean>
设值注入的优点
如果依赖关系(或继承关系)较为复杂 ,设值注入模式往往更为简洁 有些地方有其局限性直观,更加自然
构造注入的优点
构造期即创建一个完整、合法的对象避免了繁琐的setter方法的编写无需担心在调用过程中执行setter方法对组件依赖关系产生破坏在构造函数中决定依赖关系的注入顺序
基于注解的容器配置
@Service 业务层bean(service层)
@Controller 视图层bean(控制器层)
@Component注解唯一的一个可选参数是value,用于指定bean的名称(即id值,所以必须是唯一的),若不指定,则bean默认的名称为类名首字母小写
2.使用 @Resource 注解注入依赖
@Autowired 默认按 byType 自动注入
@Resource 默认按 byName 自动注入