Spring学习笔记(一)-概念与IOC-基于xml
Spring学习笔记(一)-概念与IOC-基于xml
概念
- 轻量级java开发框架,核心是IOC(控制反转)与AOP(面向切面编程)
- 作用是为了解耦,对象解耦,模块解耦,只能降低耦合
- 容器,放置java对象
- tomcat也是容器:管理Servlet,filter,listener
- web.xml文件配置容器
- 面向接口:
- 对象关系从代码转移到配置文件,容器中,便于开发,提高灵活性
IOC
-
不在自己维护业务关系,交由Spring容器统一管理,包含放入容器与注入,对象之间的依赖关系,创建,对象的生命周期由Spring管理
-
控制:对象创建,属性赋值,对象生命周期管理
-
反转:由容器管理对象权限
-
正转:开发人员,使用new构造方法创建对象,掌握对象创建到销毁的全部过程
-
实现:
- DI(依赖注入)Dependency Injection,是IOC的技术实现,程序只需要使用对象,对象的创建,查找由容器内部实现
- 依赖:ClassA使用了ClassB的属性或者方法,只能降低,不能消除
-
通过Spring框架只需要提供要使用的对象名词即可从容器中获取名称对应的对象,Spring底层使用反射机制创建对象
-
//传统对象创建 SomeService service = new SomeServiceImpl();
Spring IOC使用
-
Maven配置
-
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.1</version> </dependency>
-
Spring核心文件配置
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.km"/> </beans>
Bean
-
bean标签就是java对象,spring管理d额java对象就是bean
-
在bean标签中的属性:
- class:让spring管理的类的全限定名称,不能是接口
- id自定义的名称,唯一
- spring管理的容器是一个Map,放入容器就是放入Map
-
创建容器对象:ApplicationContext,表示一个Spring容器
-
//从类路径下的bean.xml文件读取配置,创建容器 ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); //获取对象,使用getBean(id) AccountServiceImpl accountService = ac.getBean("accountService", AccountServiceImpl.class);
Spring容器的特点
- Spring默认使用无参构造方法,在默认设置下,没有无参构造方法会导致对象实例化异常
- Spring创建对象的时机:默认情况下,在创建容器时就会创建文件声明的所有java对象:
- 优点:创建对象速度快
- 缺点:占用内存高
- id作为key,对象作为value
- 可以通过Spring容器对象获取容器中对象的信息
DI
-
Spring调用类的无参构造方法创建对象,对象创建后给予属性赋值
-
属性赋值的方法:1.xml配置文件中的标签和属性;2.注解
-
DI分类:1.设置注入set;2.构造注入
基于xml的DI
set注入:
-
设值注入,Spring调用类中的set方法完成属性赋值,必须要有set方法
-
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="url" value="${jdbc.url}"/> <property name="initialSize" value="${jdbc.initialSize}"/> <property name="maxActive" value="${jdbc.maxActive}"/> <property name="maxWait" value="${jdbc.maxWait}"/> </bean>
-
先调用无参构造方法,再完成属性赋值,Spring此时只调用set方法,对于其他内容并不关心,只要有set的方法就可以使用set注入
-
set的引用类型的注入:
-
<property name="username" ref="引用类型bean的id"/>
-
构造注入:
-
Spring调用的类中有参数构造方法,在创建对象的同时给属性赋值
-
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <constructor-arg name="fairLock" value="true"/> </bean>
-
-
constructor-arg 标签的属性:
- name:构造方法的形参名
- index:构造方法的形参属性,基于位置,0开始
- value:简单类型赋值
- ref:引用类型赋值
-
constructor-arg标签的位置顺序也可以构成参数赋值的要素,可以因此省略index
引用类型的自动注入:
-
Spring可以根据一定规则给引用类型完成赋值,只针对引用类型有效
-
byName(按名称注入):需要注入的类的属性名称与bean的id对应,前提是类型一致
-
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> ... ... </bean> <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" autowire="byName"> <!--此set注入可以省略--> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:MybatisSpringConfig.xml"/> </bean>
-
-
-
byType(按类型注入):需要注入类中的属性的类型与bean的class对应(接口、继承)
- Spring会自动比较所需的类型和容器所管理的所有类型,自动注入
-
在有多个类型匹配时要解决冲突,byType时只能保留一个匹配的类型
-
多个配置文件的使用
-
按功能模块分(登录、注册... ...),按类的功能分(数据库操作、service......)
-
使用import标签:
-
<import resource="其他配置文件的路径"/>
-
-
通配符:
-
<import resource="Spring-*.xml"/>
-
将加载所有Spring-开始的文件
-
注意不能包含自身
-