Spring01:IOC
Spring01 IOC
1.概述
Spring 是轻量级的开源的 JavaEE 框架
解决企业应用开发的复杂性
核心部分:IOC 和 Aop
- IOC:控制反转,把创建对象过程交给 Spring 进行管理
- Aop:面向切面,不修改源代码进行功能增强
Spring 特点
方便解耦,简化开发
- Aop 编程支持
- 方便程序测试
- 方便和其他框架进行整合
- 方便进行事务操作
- 降低 API 开发难度
Spring模块

2.IOC
控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
耦合度降低
2.1 原理
xml解析 工厂模式 反射
- 配置文件
- 解析 String classValue = 解析得到属性
- 工厂类中反射创建对象 Class.forName(classValue);
IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂
Spring 提供 IOC 容器实现两种方式:(两个接口)
- BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用
- 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
- ApplicationContext:BeanFactory 接口的子接口,一般用于开发
- 加载配置文件时候就会把在配置文件对象进行创建
- ApplicationContext 接口有实现类:
- FileSystemXmlApplicationContext 对应文件全路径
- ClassPathXmlApplicationContext 对应类中路径
2.2 Bean管理
Spring 创建对象 + Spirng 注入属性
操作方式:
2.2.1 基于 xml
-
spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建
- id 属性:唯一标识;class 属性:类全路径(包类路径)
- 创建对象时,默认执行无参构造方法
-
xml 方式注入属性:依赖注入DI,创建对象的注入属性
- 使用set方法注入:类中定义set方法,并在配置文件中配置
<!-- set 方法注入属性--> <bean id="user" class="com.fremont.spring.User"> <property name="id" value="1"></property> <property name="name" value="张三"></property> </bean>- 有参构造注入:类中定义有参构造,配置文件
<!--有参数构造注入属性--> <bean id="orders" class="com.atguigu.spring5.Orders"> <constructor-arg name="oname" value="电脑"></constructor-arg> <constructor-arg name="address" value="China"></constructor-arg> </bean>-
p名称空间注入:简化基于 xml 配置方式
添加 p 名称空间在配置文件中
<bean id="book" class="com.atguigu.spring5.Book" p:bname="九阳神功" p:bauthor="无名氏"></bean>- 注入其他类型属性:
1、字面量
<!--null 值--> <property name="address"> <null/> </property> <!--属性值包含特殊符号 1 把<>进行转义 < > 2 把带特殊符号内容写到 CDATA--> <property name="address"> <value><![CDATA[<<南京>>]]></value> </property>2、注入属性-外部 bean
service 调用 dao 里面的方法
<!--service 和 dao 对象创建--> <bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl"></bean> <bean id="userService" class="com.atguigu.spring5.service.UserService"> <!--注入 userDao 对象 name 属性:类里面属性名称 ref 属性:创建 userDao 对象 bean 标签 id 值 --> <property name="userDao" ref="userDaoImpl"></property> </bean>3、注入属性-内部 bean
对象类型属性
<!--外部 bean--> <bean id="emp" class="com.atguigu.spring5.bean.Emp"> <!--设置两个普通属性--> <property name="ename" value="lucy"></property> <property name="gender" value="女"></property> <!--设置对象类型属性,内部bean--> <property name="dept"> <bean id="dept" class="com.atguigu.spring5.bean.Dept"> <property name="dname" value="安保部"></property> </bean> </property> </bean>4、注入属性-级联赋值
<!--1-级联赋值--> <bean id="emp" class="com.atguigu.spring5.bean.Emp"> <!--设置两个普通属性--> <property name="ename" value="lucy"></property> <property name="gender" value="女"></property> <!--级联赋值--> <property name="dept" ref="dept"></property> </bean> <bean id="dept" class="com.atguigu.spring5.bean.Dept"> <property name="dname" value="财务部"></property> </bean> <!--2-级联赋值--> <bean id="emp" class="com.atguigu.spring5.bean.Emp"> <!--设置两个普通属性--> <property name="ename" value="lucy"></property> <property name="gender" value="女"></property> <!--级联赋值--> <property name="dept" ref="dept"></property> <property name="dept.dname" value="技术部"></property> </bean>5、注入集合
生成对应set方法
<!--1 集合类型属性注入--> <bean id="stu" class="com.atguigu.spring5.collectiontype.Stu"> <!--数组类型属性注入--> <property name="courses"> <array> <value>java 课程</value> <value>数据库课程</value> </array> </property> <!--list 类型属性注入--> <property name="list"> <list> <value>张三</value> <value>小三</value> </list> </property> <!--map 类型属性注入--> <property name="maps"> <map> <entry key="JAVA" value="java"></entry> <entry key="PHP" value="php"></entry> </map> </property> <!--set 类型属性注入--> <property name="sets"> <set> <value>MySQL</value> <value>Redis</value> </set> </property> </bean>集合里面设置对象类型值
<!--创建多个 course 对象--> <bean id="course1" class="com.atguigu.spring5.collectiontype.Course"> <property name="cname" value="Spring5 框架"></property> </bean> <bean id="course2" class="com.atguigu.spring5.collectiontype.Course"> <property name="cname" value="MyBatis 框架"></property> </bean> <!--注入 list 集合类型,值是对象--> <property name="courseList"> <list> <ref bean="course1"></ref> <ref bean="course2"></ref> </list> </property>提取集合注入部分:引入名称空间 util
xmlns:util="http://www.springframework.org/schema/util"
<!--1 提取 list 集合类型属性注入--> <util:list id="bookList"> <value>易筋经</value> <value>九阴真经</value> <value>九阳神功</value> </util:list> <!--2 提取 list 集合类型属性注入使用--> <bean id="book" class="com.atguigu.spring5.collectiontype.Book"> <property name="list" ref="bookList"></property> </bean> -
操作Bean:
-
普通Bean:中定义 bean 类型就是返回类型
-
工厂Bean:定义 bean 类型可以和返回类型不一样
- 工厂 bean,实现接口 FactoryBean
- 实现的方法中定义返回的 bean 类型
-
Bean作用域:bean 标签里面有属性(scope)用于设置单实例还是多实例
- 默认singleton,单实例对象,加载spring配置文件时创建单实例对象
- prototype,多实例对象,调用getBean 方法时创建多实例对象
-
Bean生命周期:从创建到销毁
- 无参构造器创建 bean 实例
- 调用 set 属性设置、bean 引用
- 调用bean初始化
- 对象获取
- 容器关闭时调用 bean销毁方法
-
Bean 的后置处理器:初始化前后处理实例
创建后置处理器 MyBeanPost,实现接口 BeanPostProcessor
配置后置处理器:
- 构造器创建 bean 实例
- 调用 set 属性设置、bean 引用
- bean 实例传递 bean 后置处理器:postProcessBeforeInitialization
- bean 的初始化
- bean 实例传递 bean 后置处理器:postProcessAfterInitialization
- 对象获取
- 容器关闭时调用 bean销毁方法
-
xml自动装配:指定装配规则
<!--实现自动装配 bean 标签属性 autowire,配置自动装配 autowire 属性常用两个值: byName 根据属性名称注入 ,注入值 bean 的 id 值和类属性名称一样 byType 根据属性类型注入 --> <bean id="emp" class="com.spring5.autowire.Emp" autowire="byName"></bean> <bean id="dept" class="com.spring5.autowire.Dept"></bean> -
外部属性文件:
先建立 jdbc.properties
引入 context 名称空间
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation中加入:
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
<!-- 配置 Druid 连接池 --> <!--引入外部属性文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <!-- dataSource.setDriverClassName("com.mysql.jdbc.Driver"); set方法注入 --> <!-- 获取properties文件内容,根据key获取,使用spring表达式获取 --> <property name="driverClassName" value="${jdbc.driverclass}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean>
-
2.2.2 基于注解
注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值..)
注解作用在类上面,方法上面,属性上面;简化 xml 配置
-
引入依赖:spring-aop-5.2.6.RELEASE.JAR
-
开启组件扫描:
<!--先添加 xmlns:context="http://www.springframework.org/schema/context" 在xsi:schemaLocation中添加: http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd --> <!--开启组件扫描 1 如果扫描多个包,多个包使用逗号隔开 2 扫描包上层目录 --> <!--use-default-filters="false" 表示现在不使用默认 filter,自己配置 filter--> <context:component-scan base-package="com.atguigu,com.xxx" use-default-filters="false"> <!--context:include-filter ,设置扫描哪些内容--> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <!--context:exclude-filter: 设置哪些内容不进行扫描--> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Component"/> </context:component-scan> -
添加创建对象注解
创建对象、创建 bean 实例提供注解 :
@Component @Service @Controller @Repository
-
注解方式实现属性注入
- @Autowired:根据属性类型进行自动装配
- @Qualifier:根据名称value值进行注入;和@Autowired 一起使用
- @Resource:根据类型/根据名称注入 设置name值
- @Value:注入普通类型属性 把value值注入属性
-
完全注解开发
创建配置类,替代 xml 配置文件
@Configuration//作为配置类,替代 xml 配置文件 @ComponentScan(basePackages = {"com.fremont"}) public class SpringConfig { } //在测试中加载 ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

浙公网安备 33010602011771号