- Ø 从大小与开销两方面而言是轻量级的
- Ø 通过控制反转IOC技术达到松耦合的目的
- Ø 提供面向切面编程的丰富支持,允许通过分离应用的业务逻辑和系统级服务记性内聚性的开发
- Ø 包含并管理应用独享的配置和声明周期,这个意义上是一种容器。
- Ø 将简单的组件配置、组合成为复杂的应用,这个意义上框架。
为甚么使用spring?
在Spring上开发应用简单:开发者可以将开发过程中对象的创建、使用、销毁等复杂的管理活动都交给spring来处理
方便:spring可管理各种对象、bean等,如果我们要使用这些对象,只需要对spring说一声即可,spring会自动给我们返回我们需要的实例,
快捷:因为spring管理各种bean,整个开发过程中我们都使用面向接口的思维来编程,开发非常方便快捷。
Spring带来了复杂Java EE开发的春天。
从官网上spring框架结构图可以看出
Spring的作用
- Ø -JMS
- Ø -MQ支持
- Ø -UnitTest
- Ø ……
3.AOP事物管理、日志
- Ø 提供了众多方便应用的辅助类(JDBC Template)
- Ø 对主流应用框架(Hibernate等)提供了良好的支持。
适用范围
什么是框架
百科解释:框架(framework)是一个基本概念上的结构,用于去解决或者处理复杂的问题。
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。
可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。
框架的特点
-半成品
-封装了特定的处理流程和控制逻辑
-成熟的/不断升级改进的软件
框架与类库的区别
-框架一般是封装了逻辑、高内聚的,类库则是松散的工具组合
--框架专注于某一领域,类库则是更加通用的。
为什么使用框架
软件系统日益复杂。
重用度高,开发效率和质量提高
软件设计人员要专注于对领域的里阿杰,使需求分析更加充分
易于上手,快速解决问题。
接口、面向接口编程
接口
用于沟通的中介物的抽象化,是一种规范和说明。
实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,使其能被修改内部而不被影响外界其他实体与其交互的方式
对应Java接口即声明,声明了哪些方法是对外公开提供的
在Java8中,接口可以拥有方法体,接口可以多重继承,类则不可以。
面向接口编程
屏蔽---在结构设计中,分清层次及调用关系,每层只向上层提供一组功能接口,各层仅依赖接口而非实现类
稳定---接口实现的变动不影响各层间的调用,也就是说保证接口稳定,具体变动根据业务需求或者其他需要来进行调整,这一点在公共服务中尤其重要。
隐藏---“面向接口编程”中的“接口”是用于隐藏具体实现和实现多态性的组件
什么是IOC
IOC-InversionOf Control,控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责完成创建和维护,即指的是获得依赖对象的过程被反转了。
DI-Dependency Injection,依赖注入,是控制反转的一种实现方式,在运行期间由IOC容器在运行期间,动态的将某种依赖关系注入到对象之中。
目的:是为了创建对象并且组装对象之间的关系。
如上图是Spring官网给出的一个Spring IOC容器说明,从上到下看,意思是业务对象在容器中通过配置原数据生成复合系统需要的备用对象,如果需要这些生成的对象,则可以直接到SpringCongtainer中去获取。
实际上整个过程就像是租房子一样,如果你想租房子,那么首先找房屋中介,然后由中介介绍房子,最后你选自己中意的房子租房入住。对于IOC来说,如果你使用对象,那么首先找IOC容器中介,由IOC容器返回对象,你选用自己需要的对象即可。
有了的IOC之后,我们不再管对象的实现了,可以抛弃new方法来实例化创建对象,而是通过配置来获取对象,因为对象的创建、实现、销毁都被IOC隐藏了,我们可采用面向接口的编程即可。
1) 下载junit.jar并加入项目工程
2) 创建UnitTestBase类,完成对Spring配置文件袋额加载、销毁
3) 所有的单元测试类都继承自UnitTestBase,通过它的getBean方法获取想要的对象
4) 子类(具体执行单元测试的类)加注解:@RunWith(BlockJUnit4ClassRunner.class)
5) 单元测试方法加注解:@Test
6) 右键选择要自行的单元测试方法执行或者执行一个类的全部单元测试方法。
Bean的初始化需要两个基础包:org.springframework.beans和org.springframework.context;其中,BeanFactory提供配置结构和基本功能,加载并初始化Bean,ApplicationContext保存了Bean对象并在Spring中被广泛使用。
方式:
1、对本地文件的操作:
FileSystemXmlApplicationContextcontext=new FileSystemXmlApplicationContext(“F:/workspace/application.xml”);
2、对Classpath的操作:
ClassPathXmlApplicationContextcontext=new ClassPathXmlApplicationContext(“classpath:spring-context”);
3、对Web的应用依赖Servlet或Listener;
org.springframework.web.context.ContextLoaderListener context org.springframework.web.context.ContextLoaderServlet 1
Spring注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为。
两种注入方式:设值注入和构造注入
--设值注入。即通过配置相应的xml配置文件,在加载的过程中自动调用set方法进行成员属性赋值:
上述配置的意思是指在InjectionServiceImpl实现类中有一个成员injectionDAO,这个成员的实现类是另一个类InjectionDAOImpl。
加载过程大意:要获取一个InjectionService实例化接口对象,需要利用"com.terence.ioc.injection.service包下的InjectionServiceImpl实现类实现InjectionService接口,实例化出一个对象injectionService(在配置文件中其标识Id为injectionService),这个对象下含有一个成员变量接口injectionDAO,通过此配置文件用com.terence.ioc.injection.dao下的InjectionDAOImpl实现类实例化接口injectionDAO,然后自动调用InjectionService的set方法属性,完成injectionService下成员injectionDAO的赋值。
--构造注入。和设置注入方式一样,唯一区别就是通过类的构造器来完成对成员变量的赋值。
可将上述设值注入的配置代码替换为如下的构造注入配置:
……
……
依赖包的引入:
Spring框架依赖包:
注解依赖:
Junit测试依赖包:CSDN下载地址
两个接口:
public interface InjectionDAO {
public void save(String arg);
}
public interface InjectionService {
public void save(String arg);
}
两个接口的实现类:
public class InjectionDAOImpl implements InjectionDAO {
public void save(String arg) { //模拟数据库保存操作
System.out.println("保存数据:"+arg);
}
}
public class InjectionServiceImpl implements InjectionService {
public void save(String arg) { //模拟业务操作
System.out.println("Service接受参数:"+arg);
arg=arg+":"+this.hashCode();
injectionDAO.save(arg);
}
}
测试类:
@RunWith(BlockJUnit4ClassRunner.class)
public class TestInjection extends UnitTestBase {
public TestInjection() {
super("classpath*:spring-beanannotation.xml");
}
@Test //通过配置文件里面的配置项扫描包下的所有类,自动装配对象
public void testInjection() {
InjectionService service=super.getBean("injectionServiceImpl");
service.save("This is test");
}
}
上述实例采用面向接口编程思想,利用接口隐藏实现功能细节,在项目开发过程中是常用到的,使用Junit测试类测试结果。
测试过程:通过双击测试类中的测试方法名称选中即可,Run AS-->Junit Test,即可在控制台看到测试结果。如果不选中测试方法,则执行的是测试类中自上而下所有的测试方法。
测试类执行方法分析:利用@RunWith(BlockJUnit4ClassRunner.class)注解给上下文声明这是一个Junit测试类,利用@Test注解给上下文声明测试方法。