Spring框架----Spring的IOC

38 篇文章 1 订阅
23 篇文章 2 订阅

1.SpringIOC概念

在这里插入图片描述
图中两个代码代表了两种不同的创建对象的方式
第一种创建对象的方式,我们采用的是new的方式,在采用new的方式创建对象的时候
在这里插入图片描述
我们在找对象的时候,是主动的在找,应用app是直接的跟资源联系,他们之间是有必然的联系,是消除不掉的,资源独立就变得很难
采用第二种方式创建对象的时候,就是如下图
在这里插入图片描述
app断开了和资源的联系,找工厂要一个资源,由工厂负责给我们的资源取得联系,把想要的资源返回给我们的应用中,从而实现应用和资源之间的依赖关系。这是IOC。
为什么叫控制反转。
把创建对象的权力交给我们的工厂,由工厂通过固定的名称给我们找到我们想要的对象。
第一种方式,它有独立的控制权,想要谁就创建谁,而第二种方法把控制权交给了工厂,带来的好处是降低程序间的依赖关系,削减计算机的耦合。
控制反转:Inversion of Control.IOC,把创建对象的权力交给框架,是框架的重要特征,它包括依赖注入和依赖查找

明确IOC的作用:削减计算机程序的耦合,解除我们代码中的依赖关系。
它不能实现数据库增删改查,也不能实现表现层的请求参数封装,也无法接收请求,能干的事情就是解决程序间的依赖关系。

2.spring基于XML的IOC环境搭建和入门

在这里插入图片描述
第一个aop包,基于注解的ioc开发的必备jar包。
而jcl是把apache的日志组件继承到其开发包中,做成了自己的jar包
而beans,core,spEl,context就是spring核心容器所需的jar包。
它就是一个map,封装我们的对象。
1.新建bean.xml文件,并导入xml约束(在index.html或官网中中搜索xmlns)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

2.把对象的创建交给spring来管理
把对象的创建交给spring来管理,beans里面多个bean,id表示唯一标志,class表示全限定类名

<!--把对象的创建交给spring来管理,beans里面多个bean,id表示唯一标志,class表示全限定类名-->
<bean id="accountService" class="com.yujie.service.Impl.AccountServiceImpl"></bean>
<bean id="accountDao" class="com.yujie.dao.Impl.AccountDaoImpl"></bean>

3.把创建好的容器给取出来,就可以根据唯一标志来获取对象
Spring中工厂的类结构图
在这里插入图片描述
获取spring的IOC核心容器,并根据ID获取对象,有两种方式获取对象
第一种,拿到object类型,强转
第二种,传给字节码,用字节码转

/*
*   获取spring的IOC核心容器,并根据ID获取对象
* */
public static void main(String[] args) {
    //1.获取核心容器对象
    ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
    //2.根据id获取bean对象
    IAccountService as=(IAccountService)ac.getBean("accountService");       //第一种,拿到object类型,强转
    IAccountDao adao=ac.getBean("accountDao", IAccountDao.class);           //第二种,传给字节码,用字节码转
    System.out.println(as);
    System.out.println(adao);
}

在这里插入图片描述

3. applicationContext的实现类

三个常用实现类
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
AnnotationConfigApplicationContext

ClassPathXmlApplicationContext第一个它可以加载类路径下的配置文件,要求配置文件必须在类路径下,不在的话,加载不了
FileSystemXmlApplicationContext它可以加载磁盘任意路径下的配置文件(必须有访问权限:不同操作系统不同)
AnnotationConfigApplicationContext读取注解创建容器,是明天的内容
用第二个,它会报错,我们把bean.xml扔到桌面上,并拷贝路径,粘贴进去,其他不作任何调整

4. BeanFactory和ApplicationContext的区别

核心容器的两个接口引发出的问题
ApplicationContext:
它在构件核心容器时,创建对象采取的思想策略是:
采用立即加载的方式,也就是说,只要一读取完配置文件,就创建配置文件中配置的对象
当我们走完那个代码的时候,它会马上读取配置文件,并且在配置的过程中使用反射的方式来把这两个对象都创建出来。
即读取完配置文件,对象就创建起来了,并且全部创建出来。

BeanFactory
它在构建核心容器时,创建对象采取的策略是延迟加载的方式,也就是说,什么时候根据id获取对象了,什么时候就真正的创建对象。

/*BeanFactory*/
Resource resource=new ClassPathResource("bean.xml");
BeanFactory factory=new XmlBeanFactory(resource);
IAccountService as=(IAccountService)factory.getBean("accountService");
System.out.println(as);

通过上述代码加debug即可测试,断点到了第三步的时候,还未执行创建对象。
实际开发中根据不同的情况选择不同的方法。
什么时候适合于延迟加载,什么时候适合立即加载
由于不会有类成员,因此不会有线程安全问题,我们可以使用单例模式来创建我们service和dao,进一步如果service和dao都是单例的话,任何时候都只会创建一次,因此,只要容器创建,我们就需要马上创建对象,因为它只创建一次。因此只要容器一创建,我们马上就创建对象,因为它只会创建一次,创建完就不会再创建。
单例模式适用于本次案例。
beanFactory什么时候用什么时候创建,适用于多例对象,如果我在加载容器就要创建对象,那么我第二次用又要创建对象。
Spring会根据配置不同改变其策略。实际开发中更多的使用ApplicationContext来创建对象.它很智能,可以根据对象的单例还是多例来决定立即加载还是延迟加载

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring-IOCSpring框架的核心部分之一,它是一种设计模式,全称为Inversion of Control(控制反转)。它通过将对象的创建、依赖关系的管理和对象的生命周期交给Spring容器来实现,从而降低了组件之间的耦合度,提高了代码的可重用性和可维护性。Spring-IOC的实现主要依靠Spring容器Spring容器Spring框架的核心,它负责创建、管理和装配Bean对象,其中Bean是Spring框架中最基本的组件。 Spring-IOC的实现主要有两种方式:BeanFactory和ApplicationContext。其中,BeanFactory是Spring-IOC的基本实现,而ApplicationContext是BeanFactory的子接口,提供了更多高级特性。ApplicationContext是Spring框架中最常用的IOC容器,它除了提供BeanFactory的所有功能外,还提供了更多的企业级特性,例如AOP、事务管理、国际化、事件传播等。 下面是一个简单的Spring-IOC的例子,假设我们有一个UserService接口和一个UserServiceImpl实现类,我们可以通过Spring-IOC容器创建和管理UserServiceImpl对象: 1.定义UserService接口和UserServiceImpl实现类 ```java public interface UserService { void addUser(User user); } @Service public class UserServiceImpl implements UserService { @Override public void addUser(User user) { // 添加用户的具体实现 } } ``` 2.在Spring配置文件中配置UserService实例 ```xml <bean id="userService" class="com.example.service.UserServiceImpl"/> ``` 3.在代码中获取UserService实例并使用 ```java ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = context.getBean("userService", UserService.class); User user = new User(); userService.addUser(user); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值