第一部分:Spring的核心
一:简化java的开发
使用Spring 可以让简单的JavaBean实现只有EJB才能完成的事情,为了降低Java开发的复杂性,Spring采取了以下四种关键策略
1基于pojo(简单的java对象)的轻量级和最小侵入性编程
2通过依赖注入和面向接口实现松耦合
3基于切面和惯例进行声明式编程
4通过切面和模板减少样板式代码
1基于pojo(简单的java对象)的轻量级和最小侵入性编程:有很多框架会强迫应用继承他们的类或实现接口,这样会有很多没有用的代码,而Spring竭力避免因自身的API
而弄乱你的代码,在基于Spring 构建的应用中,他的类通常没有任何迹象表明你使用了Spring
举例
EJB强迫你实现你用不到的方法
public class Hello implements SessionBean{
public void ejbActivate(){
}
public void ejbPassivate(){
}
......还有很多就不写了,,这些方法都不是核心
public String say(){//say()方法才是这 Hello类的核心
return "hello "
}
}
Spring明显的就简洁多了
public class Hello{
public String say(){
return "hello "
}
}
此处体现了:“他的类通常没有任何迹象表明你使用了Spring”
虽然形式简单,但此pojo依然具有魔力,Spring通过依赖注入来赋予简单pojo的魔力
2通过依赖注入和面向接口实现松耦合:在项目中应用依赖注入你会发现代码会变的异常简单,更容易理解与测试
在任何一个实际应用中都会有很多的类组成,这些类相互协调来完成特定的逻辑功能,这样就会高耦合,难测试。
通过依赖注入,对象的依赖关系有第三方组建在创建对象时去管理,依赖关系将被自动注入到需要他们的对象中去
举例
不用Spring
public DamselRescuingKnight(){
quest = new RescueDamselQuest();
}
//耦合高,RescueDamselQuest和DamselRescuingKnight间存在依赖关系
用spring
private Quest quest
public BraveKnight( Quest quest){
this.quest=quest:
}
//耦合低,此处的Quest需要在xml文件里进行装配
(RescueDamselQuest是实现了Quest接口的类)
创建应用组件之间协作的行为通常称为装配,Spring有很多装配 Bean 的方式,采用XML配置是一种常见的方式。
3 基于切面和惯例进行声明式编程:AOP编程(切面编程)允许把遍布应用各处的功能分离出来形成可重要的组件
有些组件除了要有自身核心的代码,还要有比如日志,事务管理安全的代码,这些非核心但是又有必要的代码就会
让组件的代码变得繁琐,AOP以声明的方式将他们应用到需要的额组件中去,将核心代码和日志这种非核心代码分离
从而简化代码, 总之,AOP就是为了简化pojo
4通过切面和模板减少样板式代码:有很多样板式的代码,例如jdbc查询数据,要链接数据库,最后关闭数据库,还要捕获异常。
除此之外还有很多例如REST服务等也是如此,Spring通过模板封装来消除样板式代码。
二:Spring容器--Bean的容纳
1)Spring容器创建对象,装配他们,配置他们,管理他们的生命周期
2)Spring自带了两种类型的容器实现,Bean工厂和应用上下文(后者常用)
Bean的生命周
1)传统的:用new关键字去创建,一旦不会再被使用就有java的垃圾回收机制去回收
2)Spring:Bean的建立
1由BeanFactory读取Bean定义文件,并生成各个实例。
Setter注入
2执行Bean的属性依赖注入。
BeanNameAware的setBeanName()
3如果Bean类实现了org.springframework.beans.factory.BeanNameAware接口,则执行其setBeanName()方法。
BeanFactoryAware的setBeanFactory()
4如果Bean类实现了org.springframework.beans.factory.BeanFactoryAware接口,则执行其setBeanFactory()方法。
BeanPostProcessors的processBeforeInitialization()
5容器中如果有实现org.springframework.beans.factory.BeanPostProcessors接口的实例,则任何Bean在初始化之前都会执行这个实例的processBeforeInitialization()方法。
InitializingBean的afterPropertiesSet()
6如果Bean类实现了org.springframework.beans.factory.InitializingBean接口,则执行其afterPropertiesSet()方法。
Bean定义文件中定义init-method
7在Bean定义文件中使用“init-method”属性设定方法名称,如下:
<bean id="demoBean" class="com.yangsq.bean.DemoBean" init-method="initMethod">
.......
</bean>
8 这时会执行initMethod()方法,注意,这个方法是不带参数的。
BeanPostProcessors的processAfterInitialization()
9 容器中如果有实现org.springframework.beans.factory.BeanPostProcessors接口的实例,则任何Bean在初始化之前都会执行这个实例的processAfterInitialization()方法。
DisposableBean的destroy()
10在容器关闭时,如果Bean类实现了org.springframework.beans.factory.DisposableBean接口,则执行它的destroy()方法。
Bean定义文件中定义destroy-method
在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法
<bean id="demoBean" class="com.yangsq.bean.DemoBean" destory-method="destroyMethod">
.......
</bean>
这时会执行destroyMethod()方法,注意,这个方法是不带参数的。
三:Spring的构成———六大模块
1Data 2web 3AOP 4instrumentation 5Core Spring container 6test
总结:Spring致力于企业级Java开发,促进代码的解耦,成功的关键在与依赖注入和AOP
一:简化java的开发
使用Spring 可以让简单的JavaBean实现只有EJB才能完成的事情,为了降低Java开发的复杂性,Spring采取了以下四种关键策略
1基于pojo(简单的java对象)的轻量级和最小侵入性编程
2通过依赖注入和面向接口实现松耦合
3基于切面和惯例进行声明式编程
4通过切面和模板减少样板式代码
1基于pojo(简单的java对象)的轻量级和最小侵入性编程:有很多框架会强迫应用继承他们的类或实现接口,这样会有很多没有用的代码,而Spring竭力避免因自身的API
而弄乱你的代码,在基于Spring 构建的应用中,他的类通常没有任何迹象表明你使用了Spring
举例
EJB强迫你实现你用不到的方法
public class Hello implements SessionBean{
public void ejbActivate(){
}
public void ejbPassivate(){
}
......还有很多就不写了,,这些方法都不是核心
public String say(){//say()方法才是这 Hello类的核心
return "hello "
}
}
Spring明显的就简洁多了
public class Hello{
public String say(){
return "hello "
}
}
此处体现了:“他的类通常没有任何迹象表明你使用了Spring”
虽然形式简单,但此pojo依然具有魔力,Spring通过依赖注入来赋予简单pojo的魔力
2通过依赖注入和面向接口实现松耦合:在项目中应用依赖注入你会发现代码会变的异常简单,更容易理解与测试
在任何一个实际应用中都会有很多的类组成,这些类相互协调来完成特定的逻辑功能,这样就会高耦合,难测试。
通过依赖注入,对象的依赖关系有第三方组建在创建对象时去管理,依赖关系将被自动注入到需要他们的对象中去
举例
不用Spring
public DamselRescuingKnight(){
quest = new RescueDamselQuest();
}
//耦合高,RescueDamselQuest和DamselRescuingKnight间存在依赖关系
用spring
private Quest quest
public BraveKnight( Quest quest){
this.quest=quest:
}
//耦合低,此处的Quest需要在xml文件里进行装配
(RescueDamselQuest是实现了Quest接口的类)
创建应用组件之间协作的行为通常称为装配,Spring有很多装配 Bean 的方式,采用XML配置是一种常见的方式。
3 基于切面和惯例进行声明式编程:AOP编程(切面编程)允许把遍布应用各处的功能分离出来形成可重要的组件
有些组件除了要有自身核心的代码,还要有比如日志,事务管理安全的代码,这些非核心但是又有必要的代码就会
让组件的代码变得繁琐,AOP以声明的方式将他们应用到需要的额组件中去,将核心代码和日志这种非核心代码分离
从而简化代码, 总之,AOP就是为了简化pojo
4通过切面和模板减少样板式代码:有很多样板式的代码,例如jdbc查询数据,要链接数据库,最后关闭数据库,还要捕获异常。
除此之外还有很多例如REST服务等也是如此,Spring通过模板封装来消除样板式代码。
二:Spring容器--Bean的容纳
1)Spring容器创建对象,装配他们,配置他们,管理他们的生命周期
2)Spring自带了两种类型的容器实现,Bean工厂和应用上下文(后者常用)
Bean的生命周
1)传统的:用new关键字去创建,一旦不会再被使用就有java的垃圾回收机制去回收
2)Spring:Bean的建立
1由BeanFactory读取Bean定义文件,并生成各个实例。
Setter注入
2执行Bean的属性依赖注入。
BeanNameAware的setBeanName()
3如果Bean类实现了org.springframework.beans.factory.BeanNameAware接口,则执行其setBeanName()方法。
BeanFactoryAware的setBeanFactory()
4如果Bean类实现了org.springframework.beans.factory.BeanFactoryAware接口,则执行其setBeanFactory()方法。
BeanPostProcessors的processBeforeInitialization()
5容器中如果有实现org.springframework.beans.factory.BeanPostProcessors接口的实例,则任何Bean在初始化之前都会执行这个实例的processBeforeInitialization()方法。
InitializingBean的afterPropertiesSet()
6如果Bean类实现了org.springframework.beans.factory.InitializingBean接口,则执行其afterPropertiesSet()方法。
Bean定义文件中定义init-method
7在Bean定义文件中使用“init-method”属性设定方法名称,如下:
<bean id="demoBean" class="com.yangsq.bean.DemoBean" init-method="initMethod">
.......
</bean>
8 这时会执行initMethod()方法,注意,这个方法是不带参数的。
BeanPostProcessors的processAfterInitialization()
9 容器中如果有实现org.springframework.beans.factory.BeanPostProcessors接口的实例,则任何Bean在初始化之前都会执行这个实例的processAfterInitialization()方法。
DisposableBean的destroy()
10在容器关闭时,如果Bean类实现了org.springframework.beans.factory.DisposableBean接口,则执行它的destroy()方法。
Bean定义文件中定义destroy-method
在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法
<bean id="demoBean" class="com.yangsq.bean.DemoBean" destory-method="destroyMethod">
.......
</bean>
这时会执行destroyMethod()方法,注意,这个方法是不带参数的。
三:Spring的构成———六大模块
1Data 2web 3AOP 4instrumentation 5Core Spring container 6test
总结:Spring致力于企业级Java开发,促进代码的解耦,成功的关键在与依赖注入和AOP