开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情
Spring框架两个核心部分:IOC和Aop
1.IOC:控制反转,把创建对象过程交给Spring处理
2.Aop,面向切面,不修改源代码进行功能增强
IOC容器
一.IOC底层原理
(1)xml配置文件,配置创建的对象
<bean id="user" class="com.it.spring5.User"></bean>
(2)有service和dao类,创建工厂类
class UserFactory{
public static UserDao getDao(){
String classValue = class属性值; //1.xml解析
//2.通过反射创建对象
Class clazz = Class.forName(classValue);
//3.创建对象
return (UserDao)clazz.newInstance();
}
}
二.IOC接口(BeanFactory)
1.IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
2.Spring提供IOC容器实现两种方式(两种接口)
(1)BeanFactory : IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用
加载配置文件时不会创建对象,在获取对象(使用)才去创建对象
(2)ApplicationContext : BeanFactory接口的子接口,提供了更多更强大的功能,一般由开发人员使用
加载配置文件时就会把在配置文件对象进行创建
三.IOC操作Bean管理
1.什么是Bean管理
(1)Spring创建对象
(2)Spring注入属性
2.Bean管理操作有两种方式
1.基于xml配置文件方式实现
1.基于xml方式创建对象
<bean id="user" class="com.it.spring5.User"></bean>
(1)在Spring配置文件中,使用bean标签,标签里添加对应属性,就可以实现对象创建
(2)在bean标签有很多属性,常用属性
id属性:为对象取唯一标识
class属性:类全路径(包类路径)
2.基于xml方式注入属性
(1)DI:依赖注入,就是注入属性
1.第一种注入方式:使用set方法进行注入
1.创建类,定义属性和对应的set方法
2.在Spring配置文件配置对象创建,配置属性注入
<!-- 2.set方法注入属性 -->
<bean id="book" class="com.it.spring5.Book">
<!--
使用property完成属性注入
name:类里面属性名称
value:向属性注入的值
-->
<property name="bname" value="数据结构"></property>
</bean>
2.第二种注入方式:使用有参构造函数进行注入
(1)创建类,定义属性,创建属性对应有参构造方法
(2)在Spring配置文件中配置
<!-- 有参构造方法注入属性-->
<bean id="orders" class="com.it.spring5.Orders">
<constructor-arg name="oname" value="笔记本"></constructor-arg>
<constructor-arg name="addrss" value="China"></constructor-arg>
<!-- 可以根据索引值对应到属性 -->
<!-- <constructor-arg index="" value=""></constructor-arg>-->
</bean>
3.p名称空间注入
(1)使用p名称空间注入,可以简化基于xml配置方式
第一步 添加p名称空间在配置文件中
<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标签里面进行操作
<bean id="book" class="com.it.spring5.Book" p:bname="线代" p:bauthor="老师"></bean>
</beans>
3.xml注入其他类型属性
(1)null值
<property name="address">
<null></null>
</property>
(2)包含特殊符号
<!-- 属性值包含特殊符号
1.进行转义 < >
2.把带特殊符号的内容写到CDATA中
-->
<property name="address">
<value><![CDATA[<<新乡>>]]></value>
</property>
4.注入属性-外部bean
(1)创建两个类service和dao类
(2)在service类调用dao里面的方法
(3)在spring配置文件中配置
<bean id="UserService" class="com.it.spring5.service.UserService">
<!-- 注入userDao对象
ref属性:创建userDao对象bean标签的id值
-->
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.it.spring5.dao.UserDaoImpl"></bean>
5.注入属性-内部bean
(1)一对多关系:部门和员工
(2)在实体类之间表示一对多关系
(3)在spring文件中配置
<bean id="emp" class="com.it.spring5.bean.Emp">
<property name="ename" value="xiaohui"></property>
<property name="gender" value="女"></property>
<property name="dept">
<bean id="dept" class="com.it.spring5.bean.Dept">
<property name="dname" value="卷狗部"></property>
</bean>
</property>
</bean>
6.注入属性-级联赋值
<bean id="emp" class="com.it.spring5.bean.Emp">
<property name="ename" value="xiaohui"></property>
<property name="gender" value="女"></property>
<!-- 级联赋值 -->
<!-- 1.第一种写法 -->
<property name="dept" ref="dept"></property>
<!-- 2.第二种写法 -->
<property name="dept.dname" value="技术部"></property>
</bean>
2.xml注入集合属性
1.注入数组类型属性
2.注入List集合类型属性
3.注入Map集合类型属性
(1)创建类,定义数组,list,map,set类型属性,生成对应set方法
(2)在spring配置文件中配置
<bean id="stu" class="com.it.spring5.collectiontype.Stu">
<!-- 数组类型属性注入 -->
<property name="courses">
<array>
<value>java</value>
<value>mysql</value>
</array>
</property>
<!-- list类型属性注入 -->
<property name="list>">
<list>
<value>xiaohui</value>
<value>huihuizi</value>
</list>
</property>
<!-- map类型属性注入 -->
<property name="map>">
<map>
<entry key="JAVA" value="java"></entry>
<entry key="MYSQL" value="mysql"></entry>
</map>
</property>
<!-- set类型属性注入 -->
<property name="sets>">
<set>
<value>mysql</value>
<value>redis</value>
</set>
</property>
</bean>
4.在集合里面设置对象类型值
<!-- 注入list集合类型,值是对象 -->
<property name="courseList">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
<!-- 创建多个Course对象 -->
<bean id="course1" class="com.it.spring5.collectiontype.Course">
<property name="cname" value="Spring"></property>
</bean>
<bean id="course2" class="com.it.spring5.collectiontype.Course">
<property name="cname" value="MyBatis"></property>
</bean>
5.把集合注入部分提取出来
(1)在spring配置文件中引用名称空间util
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
</beans>
(2)使用util标签完成list集合注入提取
<!-- 1.提取list集合类型属性注入 -->
<util:list id="bookList">
<!-- <ref bean=""></ref>-->
<value>1</value>
<value>2</value>
<value>3</value>
</util:list>
<!-- 2.提取list集合类型属性注入使用 -->
<bean id="book" class="com.it.spring5.collectiontype.Book">
<property name="list" ref="bookList"></property>
</bean>
四.IOC操作Bean管理(FactoryBean)
1.Spring有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean)
2.普通bean:在配置文件中定义的bean类型就是返回类型。
3.工厂bean:在配置文件中定义的bean类型可以和返回类型不一样
(1)创建类,作为工厂bean,实现接口FactoryBean
(2)实现接口方法,在方法中定义返回的bean类型
<bean id="mybean" class="com.it.spring5.factorybean.MyBean">
public class MyBean implements FactoryBean<Course> {
@Override
public boolean isSingleton() {
return FactoryBean.super.isSingleton();
}
@Override
public Course getObject() throws Exception {
Course course = new Course();
course.setCname("abc");
return course;
}
@Override
public Class<?> getObjectType() {
return null;
}
}
@Test
public void testMyBean(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
Course course = context.getBean("mybean", Course.class);
System.out.println(course);
}