标题:Spring框架学习—IOC
学习内容:
1、Spring框架基本概述以及IOC基本概述
2、IOC底层原理
3、基于XML方式的bean管理
4、基于注解的bean管理
5、IOC内容的补充
内容详情:
1、Spring框架基本概述以及IOC基本概述
Spring框架基本概述
1、Spring是轻量级的开源的JavaEE框架’
2、Spring:可以解决企业应用开发的复杂性。
3、Spring有两个核心部分:IOC和 Aop
(1)IOC:控制反转,把创建对象过程交给Spring进行管理
(2) Aop:面向切面,不修改源代码进行功能增强。
4、Spring特点
(1)方便解耦,简化开发
(2)Aop编程支持;
(3)方便程序测试
(4)方便和其他框架进行整合
(5)方便进行事务操作
(6)降低API开发难度;
什么是IOC
控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理
使用IOC目的:
为了耦合度降低
’
2、IOC底层原理
xml解析、工厂模式、反射
IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
Spring提供IOC容器实现两种方式:(两个接口),
BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用,加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用,加载配置文件时候就会把在配置文件对象进行创建
3、基于XML方式的bean管理
3.1.创建对象
在spring配置文件中,使用bean标签,标签里面添加对应属性
*id属性:唯一标识;
*class属性:类全路径〔包类路径)
创建对象时候,默认是执行无参数构造方法完成对象创建
<bean id="book" class="jr.xiaobai.Book" > </bean>
3.2.属性注入之set注入,以及set注入—p名称空间注入
set注入
<bean id="book" class="jr.xiaobai.Book">
<property name="id" value="1"></property>
<property name="name" value="哈哈哈"></property>
<property name="num" value="2"></property>
</bean>
p名称空间注入
首先在上面写下
xmlns:p=“http://www.springframework.org/schema/p”
然后通过P:属性注入
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="book" class="jr.xiaobai.Book" p:id="3" p:name="数据库" p:num="20" >
</bean>
3.3.带参数的构造注入
<bean id="user" class="jr.xiaobai.User">
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="username" value="小白"></constructor-arg>
<constructor-arg name="id" value="1"></constructor-arg>
</bean>
3.4. 注入空值以及 注入特殊符号
<bean class="jr.xiaobai.User" id="user">
<!-- 注入空值-->
<property name="username">
<null/>
</property>
<!-- 注入特殊符号<<湖南>>-->
<property name="id">
<value><![CDATA[<<湖南>>]]></value>
</property>
</bean>
3.5. 外部bean的注入
<!-- 外部bean的注入 获取别的bean类的对象,这个bean类里面定义一个别的对象作为属性-->
<bean id="userDaolmpl" class="jr.dao.UserDaolmpl"></bean>
<bean class="jr.service.UserService" id="userService">
<property name="userDaolmpl" ref="userDaolmpl">
</property>
</bean>
这段代码就在UserService类里面,注入了UserDaolmpl类的一个对象,就可以使用这个对象操作了
3.6.内部bean的注入以及级联赋值
<!--内部bean的注入 -->
<!-- <bean class="jr.bean.Emp" id="emp">-->
<!-- <property name="ename" value="xiaobai"></property>-->
<!-- <property name="dept">-->
<!-- <bean class="jr.bean.Dept" id="dept">-->
<!-- <property name="dname" value="咸鱼部"></property>-->
<!-- </bean>-->
<!-- </property>-->
<!-- 级联赋值-->
<bean class="jr.bean.Dept" id="dept">
<property name="dname" value="技术部"></property>
</bean>
<bean class="jr.bean.Emp" id="emp">
<property name="ename" value="xiaobai"></property>
<property name="dept" ref="dept"></property>
</bean>
一对多的关系,比如一个员工属于一个部门,一个部门有很多员工,员工类用部门类的部门名作为属性时,需要获取部门类的对象,并且为其赋值
3.7.给数组、list、map、set集合赋值
<!--给数组、list、map、set集合赋值-->
<bean class="jr.xiaobai.Stu" id="stu">
<property name="arr">
<list>
<value>hhh</value>
</list>
</property>
<property name="list">
<list>
<value>知道</value>
<value>了吗</value>
</list>
</property>
<property name="maps">
<map>
<entry key="hello" value="你好"></entry>
<entry key="no" value="不"></entry>
</map>
</property>
<property name="sets">
<set>
<value>知道</value>
<value>你会了</value>
</set>
</property>
</bean>
3.8. 集合中放的对象的赋值
<!-- 集合中放的对象的赋值-->
<bean class="jr.xiaobai.Stu" id="stu">
<property name="list1">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
</bean>
<bean class="jr.xiaobai.Course" id="course1">
<property name="cname" value="haha"></property>
</bean>
<bean class="jr.xiaobai.Course" id="course2">
<property name="cname" value="hahahhh"></property>
</bean>
3.9.把集合抽取出来供公共使用
<!-- 把集合抽取出来供公共使用-->
<util:list id="Peoplelist">
<value>aa</value>
<value>le</value>
<value>Wu</value>
</util:list>
<bean class="jr.xiaobai.People" id="people">
<property name="list" ref="Peoplelist"></property>
</bean>
4、基于注解的bean管理
4.1.Bean管理中创建对象注解
@Component :普通类
@Service ;service层
@Controller :web层
@Repository ;dao层
规范的话就按照上面的用,其实效果都一样4个注解,都可以随便用,但规范的话就按照上面的标准。
用法:很简单,用在哪个类就放哪个类上面
但要开启注解扫描
<!-- 开启组件扫描-->
<context:component-scan base-package="jr"></context:component-scan>
4.2.基于注解方式实现属性注入
@Autowired:根据属性类型进行自动装配
@Qualifier:根据属性名称进行注入
@Resource:可以根据类型注入,可以根据名称注入
@Value:注入普通类型属性
Qualifier要跟Autowired一起使用,Resource不是Spring提供的,是java扩展类提供的。
基于注解很简单,注解写在属性上面,特殊需要的话,注解后面跟个value=。
5、IOC内容的补充
5.1.测试代码的补充
之前都是配置文件的代码,这里补充一个通用的测试类代码
//加Spring配置文件,两种方式对应不同的路径
ClassPathXmlApplicationContext context1 = new ClassPathXmlApplicationContext("bean2.xml");
ApplicationContext context = new FileSystemXmlApplicationContext("C:\\ideacode\\IOC\\src\\bean1.xml");
//加载配置的对象
Book book = context.getBean("book", Book.class);
Book book1 = context1.getBean("book", Book.class);
5.2.简要介绍Spring有两种类型 bean
Spring有两种类型 bean:
普通bean:在配置文件中定义bean类型就是返回类型
工厂bean (FactoryBean) :在配置文件定义bean类型可以和返回类型不一样
5.3.bean的作用域
在spring配置文件 bean标签里面有属性(scope)用于设置单实例还是多实例
scope属性值 第一个值默认值singleton,表示是单实例对象
第二个值prototype,表示是多实例对象
singleton和prototype区别
singleton单实例,prototype多实例
设置scope值是singleton时候,加载spring配置文件时候就会创建单实例对象 设置 scope值是
prototype时候,不是在加载spring 配置文件时候创建对象,在调用getBean方法时候创建多实例对象s
5.4.bean的生命周期
生命周期
从对象创建到对象销毁的过程
bean生命周期
1.通过构造器创建bean实例(无参数构造)
2.为bean的属性设置值和对其他bean引用(调用set方法)
3.调用bean的初始化的方法(需要进行配置初始化的方法))
4.bean可以使用了(对象获取到了)
5.当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
添加后置处理器之后
就有7步了
在第三步的前后添加了把bean实例传递bean后置处理器的方法
5.5.bean基于xml方式的自动装配
实现自动装配
bean标签属性autowire
配置自动装配autowire属性常用两个值:
byName根据属性名称注入,注入值bean的id值和类属性名称一样
byType根据属性类型注入
5.6.引入外部属性文件
5.6.开启组件扫描的筛选配置