1.Spring基本概念
Spring是分层的Java SE/EE的full-stack轻量级开源框架,以IOC(Inverse of Controll,反转控制)和AOP(Aspect Oriented Programming,面向切面编程)为内核,提供了表示层和持久层以及业务层事务管理等众多企业级开发技术,还能整合开源界诸多著名的第三方框架和类库,逐渐成为使用最多的企业级Java EE开发的首选开源框架。
Spring是一个开放源代码的设计层面的框架,他解决的是业务逻辑和其它各层的松耦合问题,它将面向接口的编程思想贯穿整个应用系统。它是2003年开始流行的一个Java EE轻量级开发框架。
Spring架构图如下:
2.Spring的优点:
(1) 方便解耦,简化开发
通过Spring提供的IOC容器(其实就是一个工厂),可以将对象及其依赖关系交给Spring管理,避免硬编码所造成的过度程序耦合,用户也不必再为单例设计模式、读取配置文件等这些底层的操作编写代码,可以更专注上层应用的实现。
(2) AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
这些功能用传统的OOP实现起来比较困难。
(3) 声明式事务管理
可以将我们从单调烦闷的事务管理代码中解脱出来,只需要通过简单的配置就可以完成对事务的管理,无需手动编程,提高了开发效率和质量。
(4) 方便程序的测试
Spring支持JUnit4,可以通过注解方式测试Spring程序。
(5)方便集成各种优秀框架
Spring不排斥各种优秀的开源框架(Struts、Hibernate、MyBatis、Quartz等),能够实现对这些框架的集成。
(6)降低API的使用难度
Spring对Java EE API(例如JDBC、远程方法调用、JavaMail等)进行了更简单的封装,降低了使用这些API的使用难度。
(7) Spring可进行一站式开发
Spring可以是一个大的容器,里面什么都可以装。
(8)Spring源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独具、处处体现大师对设计模式灵活应用以及对Java技术的高深造诣。它的源代码是Java学习的最佳范例。
3.Spring中的几个核心概念:
(1) IoC(控制反转)
控制反转(Inversion of Control,缩写为IoC),它是一个重要的面向对象编程的法则,用来消弱计算机中的耦合问题。它是轻量级框架-Spring的核心内容之一。
对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。
使用了Spring之后,对象的创建以及依赖关系由Spring完成创建和注入。
控制反转即反转对象的创建方式,程序员的创建交给了Spring来完成。
(2) DI(Dependency Injection,依赖注入)
实现IoC的思想就需要DI的支持
注入的实现方式:
setter注入
构造器注入
属性值直接注入(即在定义属性的时候就赋初值)
注入类型:
值类型注入(8大基本数据类型)
引用类型注入(将依赖的对象注入)
(3) BeanFactory
BeanFactory创建对象的工厂(它是一个接口),该工厂采用了延迟加载的思想来创建对象即每次获取对象时才创建一个对象。
(4)ApplicationContext容器(IoC容器)
作用:Spring在启动时会自动创建配置的相关对象,也就是解析完XML文件后就会创建对象。
两大实现类:
1) ClassPathXmlApplicationContext:从类路径下查找加载配置文件(只能从类路径下查找加载配置文件)
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
2) FileSystemXmlApplicationContext:从硬盘绝对路径下查找加载配置文件
FileSystemXmlApplicationContext context=new FileSystem
XmlApplicationContext("D:\\....");
4.配置文件详解
1)bean标签:表示需要交给Spring容器管理并可通过容器所获取的对象
2)name属性:表示给被管理的对象所起的名字,名字不唯一,而且可以包含特殊符号,例如$。同时还可以给对象起多个名字,多个名字之间可以使用逗号/分号/空白字符进行分隔。
3)id属性:和name的作用一样,但是不能使用特殊符号。
4)class属性:表示被管理的对象所对应的类(完整的包名.类名)
5)alias标签:表示给被管理的对象起别名
6)name属性:指向的是bean的name值
7)alias属性:表示别名
5. 对象的3种创建方式
1). 通过无参构造方法创建对象
<bean id="s1" name="$student,s2 s3" class="edu.xync.spring.domain.Student">
</bean>
<alias name="s2" alias="sssss"/>
上述创建对象的方法,我们称为无参构造方法创建对象。也就是POJO对象必须有无参数的构造方法。
注意:如果该类没有无参数的构造方法,则对象创建失败从而抛出异常。
2) 通过静态工厂方式创建对象。
创建一个静态工厂类,例如:
public class StudentFactory
{
public static Student getStudent()
{
System.out.println("通过静态工厂来创建对象");
return new Student();
}
}
通过bean配置这个静态工厂对象,
<bean name="studentFactory" class="edu.xync.spring.domain.StudentFactory"
factory-method="getStudent">
</bean>
注意:需要<bean>标签中的factory-method属性指定工厂方法名称
在测试方法中,编写如下代码
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Student s=(Student)context.getBean("studentFactory");
System.out.println("------"+s);
3) 通过实例工厂方式创建对象
- 创建一个实例工厂
public class StudentFactory
{
public Student getStudent()
{
System.out.println("通过实例工厂来创建对象");
return new Student();
}
}
通过bean配置这个实例工厂对象
先通过<bean>把工厂对象创建出来 (这里需要使用两个bean标签)
<bean name="studentFactory" class="edu.xync.spring.domain.StudentFactory">
</bean>
<bean name="studentFactory1" factory-bean="studentFactory"
factory-method="getStudent">
</bean>
在测试方法中编写如下代码:
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Student s=(Student)context.getBean("studentFactory1");
System.out.println("------"+s);