一、Spring概述
1、什么是Spring
1、Spring是分层的Java SE/EE应用full-stack(全栈)轻量级开源框架
核心是IOC(Inverse Of Control:控制反转)和AOP(Aspect Oriented Programming:面向切面编程)
2、Spring是一个全栈应用框架,提供了表现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多应用技术
3、Spring还能整合开源世界众多注明的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架
2、为什么学习Spring
3、Spring的特点及优势
1、方便解耦,简化开发
2、AOP编程的支持
3、声明式事务的支持
4、方便程序的测试
5、方便集成各种优秀框架
6、降低Java EE API的使用难度
7、Java源码是经典学习范例
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)
4、Spring体系结构
二、IoC概述
大致可以这样理解,在以往的三层框架编写时,web层调用service层,service调用dao层,这样一套流程,如果我们想改变其中一部分代码,那么这些一连串的代码流程都需要改变,所以需要有一种方法可以动态的改变其中的调用内容,比如在web层调用service层时,service是写死了的调用的到层方法,我们把service剥离出来,可以动态的改变调用的是哪一个dao类方法,怎么办呢,我们在web层告诉service调用某一个类的方法,这个思想,称之为IoC
三、Spring入门
1、Spring核心配置文件(applicationContext.xml)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dao层接口名" class="该dao层的实现类的全路径"></bean></beans>
2、获取Spring核心配置文件的bean标签内容
// 读取applicationContext.xml配置文件ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取具体类dao层接口类型 dao层接口名 = (类型转换) applicationContext.getBean("bean标签中的id名");//通过dao层接口名调用具体实现类的方法
四、Spring相关API
1、Spring核心接口
a、BeanFactory
IOC容器的顶级接口,它定义了IOC的最基础的功能,但是其功能比较简单,一般面向Spring自身使用
在第一次使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化[什么时候用什么时候创建]—>【懒汉设计】
public class BeanFactory {// 声明存储对象的容器(map集合)private static Map<String, Object> ioc = new HashMap<>();// 静态代码块,初始化ioc容器static {String id = null;String className = null;Object object = null;try {// 1.通过类加载器读取 beans.xmlInputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml");// 2.创建dom4j核心解析器对象SAXReader saxReader = new SAXReader();Document document = saxReader.read(in);// 3.编写xpath表达式String xpath = "//bean";// 4.获取所有的bean标签对象List<Element> list = document.selectNodes(xpath);// 5.遍历集合,创建对象实例,设置到ioc容器中for (Element element : list) {id = element.attributeValue("id");className = element.attributeValue("class");object = Class.forName(className).newInstance();// 设置到map集合ioc.put(id, object);}} catch (Exception e) {e.printStackTrace();}}// 从ioc容器中获取指定id的对象实例public static Object getBean(String id) {return ioc.get(id);}}
b、ApplicationContext
这是在BeanFactory基础上衍生出的接口,它扩展了BeanFactory的功能,一般面向程序员使用
在容器启动时,一次性创建并加载所有的Bean,[初始化的时候全创建好]—>【饿汉设计】
2、Spring核心实现类
a、ClassPathXmlApplicationContext
b、FileSystemXmlApplicationContext
c、AnnotationConfigApplicationContext
3、Spring核心实现方法
a、通过指定id获取对象的实例,需要手动强转
// 读取applicationContext.xml配置文件ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取UserDaoUserDao userDao = (UserDao) applicationContext.getBean("userDao");// 调用方法userDao.getUser();
b、通过指定类型获取对象的实例,不需要强转
// 读取applicationContext.xml配置文件ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取UserDaoUserDao userDao = applicationContext.getBean(UserDao.class);// 调用方法userDao.getUser();
注:如果同一个接口类型下有多个对象实例,会报错
原因是不能找到一个唯一的UserDao的实现类对象
c、通过指定id和类型获取对象的实例
// 读取applicationContext.xml配置文件ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取UserDaoUserDao userDao = applicationContext.getBean("userDao",UserDao.class);// 调用方法userDao.getUser();
五、Spring配置文件
1、Bean标签配置
a、相关属性
id:在ioc容器中的唯一标识class:创建对象实例的全路径名scope:声明对象的作用范围singleton:单例对象(默认)prototype:多例对象init-method:在对象创建时,执行此方法destroy-method:在对象销毁时,执行此方法扩展:scope取值:request-->web项目中,Spring创建一个Bean的对象, 将对象存在request中session-->web项目中,Spring创建一个Bean的对象, 将对象存在session中globalSession-->(用于分布式web开发)创建实例绑定全局Session对象
b、作用范围
主要是针对scope属性来讲解Bean的使用范围
singleton:单例对象* 何时创建?ioc容器初始化时,创建对象* 对象何时运行?还要ioc容器在,对象就一直在* 何时销毁?ioc容器关闭时,销毁对象
prototype:多例对象* 何时创建?在调用getBean()方法时,创建* 对象运行?一直使用就一直活着* 何时销毁?当对象不再使用后,根据JVM GC机制垃圾回收
c、生命周期
init-method 和 destroy-method的使用单例(默认)在相应的实现类创建init方法:init-method属性指向该方法,对象创建时执行创建destroy方法:destory-method属性指向该方法,对象销毁(close)时执行多例(scope="prototype")在相应的实现类创建init方法:init-method属性指向该方法,对象创建时执行创建destroy方法:destory-method属性指向该方法,什么时候销毁由JVM决定
2、创建对象的三种方式
a、无参构造
Spring框架,默认使用无参构造方法,进行创建对象,如果没有提供无参则构建对象失败!!!
b、工厂静态方法【了解】
c、工厂普通方法【了解】
六、依赖注入
DI:依赖注入,Dependency Iniection的缩写
指Spring创建对象的过程中,将对象依赖属性(常量,对象,集合)通过配置设置给该对象
就是给对象中的成员进行赋值操作
相关坐标:
<dependencies><!--spring的核心坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.5.RELEASE</version></dependency><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies><build><plugins><!-- 设置编译版本为1.8 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build>
1、依赖注入方式
a、构造方法注入
在bean标签中提供了一个子标签来完成构造方法的注入
方式一:一个参数
name :构造方法参数名称value :简单数据类型(String,int,double)ref :引用数据类型(从ioc容器中获取的对象)<bean id="接口名" class="实现类的全路径"><constructor-arg name="参数名" value="简单数据类型参数" ></constructor-arg></bean><bean id="接口名" class="实现类的全路径"><constructor-arg name="参数名" ref="引用数据类型参数名" ></constructor-arg></bean>
方式二:多个参数(索引从0开始)【了解】
index :构造方法参数的索引type :该索引对应的java类型(全路径名)value :简单数据类型ref :引用数据类型<bean id="接口名" class="实现类的全路径"><constructor-arg index="0" type="引用参数的全路径" ref="引用参数名"></constructor-arg><constructor-arg index="1" type="简单数据类型" value="简单数据类型参数"></constructor-arg></bean>
b、set方法注入
在接口实现类中提供set方法
使用set方法注入,在bean标签下提供了一个
name :set方法的属性名value :简单数据类型ref :引用数据类型
c、P命名空间注入
引入p命名约束
xmlns:p="http://www.springframework.org/schema/p"
bean标签中提供属性:p:接口名-ref=”引用数据类型”;p:接口名-value=”引用数据类型”;
2、依赖注入的数据类型
a、注入实体类
<bean id="实体类" class="实体类的全路径"><property name="username" value="zhangsan"/><property name="age" value= "13"/></bean>
b、注入引用类型
c、注入集合类型
单列集合注入:
<!--注入List集合--><property name="list"><list><value>张三</value><value>李四</value><value>王五</value></list></property><!--注入Set集合--><property name="set"><set><value>古力娜扎</value><value>玛尔扎哈</value><value>撒有哪啦</value></set></property><!--注入Array数组--><property name="array"><array><value>马蓉</value><value>陶吉吉</value><value>宋吉吉</value></array></property>
双列集合注入:
<!-- Map集合 --><property name="map"><map><entry key="m1" value="v1"></entry><entry key="m2" value="v2"></entry><entry key="m3" value="v3"></entry></map></property><!-- Properties集合 --><property name="prop"><props><prop key="p1">v1</prop><prop key="p2">v2</prop><prop key="p3">v3</prop></props></property>
七、模块化配置文件
1、applicationContext-dao.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:p="http://www.springframework.org/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--只配置dao层实现类--><bean id="userDao" class="com.itfxp.dao.impl.UserDaoImpl"></bean></beans>
2、applicationContext-service.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:p="http://www.springframework.org/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置service层的实现类--><bean id="userService" class="com.itfxp.service.impl.UserServiceImpl"><property name="userDao" ref="userDao"/></bean></beans>
总、applicationContext.xml
<!--加载从配置文件--><import resource="classpath:applicationContext-dao.xml"></import><import resource="classpath:applicationContext-service.xml"></import>
