spring5笔记1--IOC的底层原理和两种实现方式

spring5笔记1

spring是轻量级的开源框架
spring有两部分核心:

1). IOC: 控制反转,把**创建对象**和**对象之间的调用**交给spring进行管理
2). Aop: 面向切面,不修改源代码的基础上进行功能增强

Spring 特点:
(1)方便解耦,简化开发
(2)Aop 编程支持
(3)方便程序测试
(4)方便和其他框架进行整合
(5)方便进行事务操作
(6)降低 API 开发难度

IOC

IOC:控制反转,把对象创建和对象之间的调用过程交给spring进行管理
目的:降低耦合度

IOC的底层原理
eg: 实现在一个类里调用另一个类的方法

1). 原始方法:在一个类里通过new方式创建另一个类,可以实现,但耦合度太高


class UserDao{
	add(){
	...
	}
}

class UserService{
	excute(){
		//通过new对象的方式创建对象,再调用其方法
		UserDao userDao = new UserDao();
		userDao.add();
	}
}

2). 工厂模式:另创建一个类UserFactory,再此类中创建对象,实现了一定程度的解耦

class UserFactory{
	public static UserDao getDao(){
		return new UserDao();
	}
}

class UserService{
	excute(){
		//通过调用工厂类中的方法创建对象,再调用其方法
		UserDao userDao = UserFactory.getDao();
		userDao.add();
	}
}

3). IOC:进一步降低耦合度
xml解析 + 工厂模式 + 反射
xml解析:是指对xml文件进行解析获取值,常见方式:Dom4j
反射:通过得到类的字节码文件,可以操作类中所有内容

<!--1.通过xml配置文件,配置创建的对象-->
<bean id="dao" class="com.atguigu.UserDao"></bean>
//2.有service类和dao类,再创建工厂类
class UserFactory{
	public static UserDao getDao(){
		//2.1 xml解析:获取全路径(包名+类名)
		String classValue = class属性值; 
		//2.2 通过反射创建对象:获取class类的对象
		Class clazz = CLass.forName(classValue);
		return (UserDao)clazz.newInstance();
	}
}

注意:class.newInstance() 只能调用无参构造器
一般:耗时耗资源的交给服务器启动时完成

IOC接口
IOC思想基于IOC容器完成,IOC容器底层就是工厂对象

Spring提供IOC容器实现的两种方式:(两个接口)

1)BeanFactory:IOC容器的基本实现,是spring内部使用的接口,不提供给开发人员使用
* 在加载配置文件时不会创建对象,在使用对象时才去创建对象

public class TestDemo1 {
    @Test
    public void test01(){
        //1.加载spring配置文件(此时不会创建对象)
        BeanFactory app = new ClassPathXmlApplicationContext("bean1.xml");
        //2.获取配置文件创建的对象
        User user = app.getBean("user", User.class);
        System.out.println(user);
        user.add();
    }
}

2) ApplicationContext:BeanFactory接口的子接口,提供更强大的功能,一般由开发人员使用
* 在加载配置文件时就会创建对象

public class TestDemo1 {
    @Test
    public void test01(){
        //1.加载spring配置文件(创建对象)
        ApplicationContext app = new ClassPathXmlApplicationContext("bean1.xml");
        //2.获取配置文件创建的对象
        User user = app.getBean("user", User.class);
        System.out.println(user);
        user.add();
    }
}

在这里插入图片描述
两个实现类:
FileSystemXmlApplicationContext: 加载的是绝对路径(比如从c盘开始)
ClassPathXmlApplicationContext:加载的是相对于src文件下的路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值