文章目录
一、IOC的概念及底层原理
1、概念
- 控制反转:把对象创建和对象之间的调用过程,交给Spring进行管理.
- 目的:降低耦合度.(重要点)
2、底层原理:xml解析、工厂模式、反射.
利用代码理解底层原理
- 创建通用方法类
//通用方法类:
public class UserDao{
public void add(){
......
}
}
- 原始java代码实现方法的调用
//原始方式调用上述方法。
class UserService{
public static void main(String[] args) {
UserDao dao = new UserDao();
dao.add();
}
}
- 工厂模式实现方法的调用
//工厂模式调用上述方法。
class UserFactory{
public static UserDao getDao(){
return new UserDao();
}
}
class UserService{
public static void main(String[] args) {
UserDao dao = UserFactory.getDao();
dao.add();
}
}
- 利用IOC容器实现方法的调用
- 第一步:xml配置文件,配置创建的对象
<bean id="dao" class="Spring.UserDao"></bean>
- 第二步:有service类和dao类,创建工厂类
class UserFactory{
public static UserDao getDao(){
String classValue = "Spring.UserDao"//xml配置文件中bean标签的class属性值
Class clazz = Class.forName(classValue);//通过反射创建对象
return (UserDao)clazz.newInstance();
}
class UserService{
public static void main(String[] args) {
UserDao dao = UserFactory.getDao();
dao.add();
}
}
二、IOC接口介绍
- IOC思想基于IOC容器完成,IOC容器底层就是对象工厂。
- Spring提供IOC容器实现两种方式(两个接口)
- BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用。(特征:加载配置文件时不会创建对象,在获取对象(使用)才去创建对象。
- ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用。(加载配置文件时就会把配置文件对象创建)
- ApplicationContext常用接口实现类
- FileSystemXmlApplicationContext:在指定的文件系统路径下查找xml文件
ApplicationContext context = new FileSystemXmlApplicationContext("E:\\ideaiu\\idea-project\\spring-first\\src\\bean1.xml");
- ClassPathXmlApplicationContext:在所有的类路径(包含JAR文件) 下查找xml文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
- FileSystemXmlApplicationContext:在指定的文件系统路径下查找xml文件
三、IOC操作Bean管理
1、概念
- 概念:Bean管理是指两个操作:Spring创建对象,Spring注入属性。
- Bean管理操作有两种方式
- 基于xml配置文件方式实现
- 基于注解方式实现
2、基于xml配置文件方式实现
1.基于xml方式创建对象
<bean id="user" class="spring.user"></bean>
- 在Spring配置文件中,使用bean标签,标签里面添加相应属性,就可以实现对象的创建。
- 在bean标签中有很多属性,在此先介绍两个常用的属性:
- id属性:bean标签的唯一标识(了解:name属性:与id属性用处相同,可以在引号中加入特殊符号,但目前很少使用)
- class属性:类全路径(包类路径)
- 创建对象时候,默认也是执行无参数构造方法完成对象创建。
2.基于xml方式注入属性
(1)第一种注入方式:使用set方法进行注入。
-
创建对象,并写出相应属性的set方法
public class user { private String name; private String ID; // set方法注入属性 public void setName(String name) { this.name = name; } public void setID(String ID) { this.ID = ID; } public void print(){ System.out.println(name+"......"+ID); } }
-
在Spring配置文件中配置对象创建,配置属性注入(使用property实现)
<bean id="User" class="spring.user"> <!-- name:user类里面属性的名称 value:向属性注入的值 --> <property name="name" value="Mr.liu"></property> <property name="ID" value="2021"></property> </bean>
(2)第二种注入方式:使用有参构造进行注入
-
创建对象,并写出有参构造方法
public class user { private String name; private String ID; //构造器方法注入属性 public user(String name, String ID) { this.name = name; this.ID = ID; } public void print(){ System.out.println(name+"......"+ID); } }
-
在Spring配置文件中配置对象创建,配置属性注入(使用constructor-arg实现)
<bean id="User" class="spring.user"> <constructor-arg name="name" value="mr.liu"></constructor-arg> <!--<constructor-arg index="0" value="mr.liu"></constructor-arg>--> <constructor-arg name="ID" value="2021"></constructor-arg> </bean>
(3)创建测试类,验证属性是否注入成功
-
创建测试类
@Test public void testprintf(){ //加载spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); //获取配置创建的对象 user user1 = context.getBean("User",user.class); user1.print(); }
-
测试结果
mr.liu......2021
3、p名称空间注入属性
- 目的:使用p名称空间注入属性,可以简化基于Xml配置方式。
- 具体步骤
- 第一步:添加p名称空间在配置文件中
- 第二步:进行属性注入,在bean标签里面进行操作(基于set方法注入)
<?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"> <!-- xmlns:p为第一步 以下操作为第二步 --> <bean id="User" class="spring.user" p:name="mr.liu" p:ID="2021"></bean> </beans>
❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤
若对Spring基础知识感兴趣的可以关注一下博主,我会持续更新Spring基础知识(一边学习一边记录),一起进步,有错误的地方也可以在评论区指出来喔,谢谢大家啦!!!