1.什么是spring?
简单来说,spring是一个轻量级的容器框架,容器内放置的都是java 对象(java bean),当容器启动时,容器为我们创建对象,容器销毁时,对象也会销毁。
1.1spirng的优点
1方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
2AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
3.声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
4.方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
5.方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
6.降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
2.spring核心容器
BeanFactory
通过子类XmlBeanFactory 去读取配置 文件
ApplicationContext
继承了BeanFactory,不但实现了的功能,并且能够增加国际化,资源访问,事件传播等常用实现类
1通过ClassPathXmlApplicationContext创建
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);
注:
ClassPathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作
2.通过FileSystemXmlApplicationContext创建
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);
注:
FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。
3.获取Bean实例
创建Spring容器后,就可以获取Spring容器中的Bean。Spring获取Bean的实例通常采用以下两种方法:
Object getBean(String name);根据容器中Bean的id或name来获取指定的Bean,获取之后需要进行强制类型转换。
T getBean(Class requiredType);
根据类的类型来获取Bean的实例。由于此方法为泛型方法,因此在获取Bean之后不需要进行强制类型转换。
3.控制反转&依赖注入
控制反转IOC
控制反转,IOC。在使用Spring框架之后,**对象的实例不再由调用者来创建,而是由Spring容器来创建,**Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是控制反转。
·
写一个student实体类,属性有id和name用于测试。
通过new关键字来创建对象
Student student = new Student();
·
通过spring容器创建
// spring容器获取对象步骤:
// 1.bean.xml 声明要创建的对象
// 2.使用BeanFactory 的子类 去加载 bean.xml 配置 ,按照配置文件创建 bean对象,并且放置在容器中
// 3. getBean(Student.class); 使用getBean 根据类型获取
依赖注入,
DI的全称是Dependency Injection,中文称之为依赖注入
从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。
依赖注入主要用来控制容器中对象之间的依赖关系
<!-- 声明创建一个 IStudentDao 类型的对象
class="com.qfedu.dao.impl.IStudentDaoImpl" 根据类创建对象
id="iStudentDao" 就是创建的对象 再容器中的唯一表示 我们可以根据 id 从容器中获取IStudentDaoImpl 示例
-->
<bean id="iStudentDao" class="com.qfedu.dao.impl.IStudentDaoImpl">
</bean>
<!-- 声明在容器中创建一个StudentServiceImpl 示例 -->
<bean id="studentService" class="com.qfedu.service.impl.StudentServiceImpl">
<!-- 通过ref="iStudentDao" 容器中idiStudentDao 的对象 设置到StudentServiceImpl 对应studentDao 属性内 -->
<!-- -->
<property name="studentDao" ref="iStudentDao"></property>
</bean>
测试
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:dibean.xml");
// 根据id 获取 容器中的实例 IStudentDaoImpl
IStudentDao iStudentDao = (IStudentDao) applicationContext.getBean("iStudentDao");
StudentServiceImpl studentService = (StudentServiceImpl) applicationContext.getBean("studentService");
// 不需要手动控制依赖 使用容器控制依赖关系
// studentService.setStudentDao(iStudentDao);
Student student = studentService.findStudentById(100);
System.out.println("student:"+student);
}