当前位置: 首页 > news >正文

Spring中IOC容器

IoC


IOC容器

IoC是一种设计思想,面向对象编程

Spring通过IoC管理所有Java对象的实例化和初始化,控制对象之间依赖关系

将IoC容器管理的Java对象称为Spring Bean,与new创建的对象没有区别

控制反转(IoC Inversion of Controle)

指将对象的创建权力交给第三方容器负责

依赖注入(DI Dependency Injction)

Spring创建对象过程中,将对象依赖属性通过配置进行注入

DI是IoC思想的具体实现

IoC容器在Spring的实现

IoC容器是IoC思想的产品实现

IoC容器管理组件 -》 Spring的bean或对象

Spring提供的IoC容器实现方法:

BeanFactory

Spring内部接口,不提供给开发人员使用

ApplicationContext

BeanFactory子接口,更多高级特性,面向使用者

ApplicationContext主要实现类:

ClassPathXmlApplicationContext:

读取类路径XML配置文件创建IoC容器对象

FileSystemXmlApplicationContext:

读取系统路径XML配置文件创建IoC容器对象


基于XML管理Bean

ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

id属性是bean的唯一标识

HelloWorld bean = (HelloWorld)ac.getBean(“id”);

HelloWorld bean = (HelloWorld)ac.getBean(“id”);

还可以根据获取(该类在XML中只能有一个)

不用强制转换成目标类

HelloWorld bean = ac.getBean(HelloWorld.class) ;    

还可以标识和类都使用

HelloWorld bean = ac.getBean(HelloWorld.class,”id”) ;

使用setter注入依赖

创建类,在类中创建变量

变量创建set和get方法(或只产生set方法)

这样就可在Spring的xml中注入变量值

为不同对象类型属性赋值

使用外部bean

将XML中其他bean的id填入ref属性中

使用内部bean

在一对property之间创建bean

为数组类型属性赋值

为集合类型属性赋值

private List<> students;

为Map集合类型属性赋值


单实例bean

默认将bean实例化获得的对象是一样的

ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");Hello hello1 = ac.getBean("hello");Hello hello2 = ac.getBean("hello");

hello1和hello2是同一个对象,

但是可以修改为多实例的对象

添加scope属性,其中singleton默认单实例,prototype是多实例


引入外部属性文件

在resources目录中常见properties类型文件

在文件中写入数据(name=value)

在Spring config的beans.xml中引入外部属性文件

最后,可以在beans中使用属性文件中的属性(${name})


基于注解管理Bean

Spring默认不使用注解

spring config中通过<context:component-scan> 元素开启 Spring Beans的自动扫描功能

自动扫描指定的包及其子类

若某类使用类@Component注解,就将该类装配到容器中来创建bean

@Component:

标识Spring中的Bean,可以应用在任何层次。

@Repository:

标识Bean,用于数据访问层(Dao层),负责与数据库进行交互

@Service:

标识Bean,用于业务层(Service层),调用数据访问层的方法来获取或修改数据

@Controller:

标识Bean,用于控制层(Controller层),处理用户的请求并响应

控制层 -> 业务逻辑层 -> 数据访问层。

开启自动扫描org.example包的类

使用Component注解来标识类

在注解中配置value属性或直接写值,作为该bean的id

bean对象实例化调用无参数构造方法,这里无参数构造方法直接赋值变量

最后在测试类中获取bean并执行


AutoWired注解自动注入

将bean自动注入到对应的类中

只在有注解管理的类中才能只用

省去了bean中配置对象类型<property>的过程

默认根据类型装配(byType),所以AutoWired注解不需要指定名字

创建注解管理的Hello类

创建注解管理的name类

使用Autowired注解注入Hello类

还可以将注解写在setter方法上

还可以将注解写在name的构造方法上

来注入Hello类

配合@Qualifier,让@Autowired根据名称注入

若同一类有多个bean时使用


Resource注解属性注入

和Autowired目的一样

但是Resource注解是根据名字注入的(byName)

若没有名字再byType寻找bean注入

@Resource是JDK扩展包的一部分,@AutoWired是Spring的一部分。

JDK扩展包需要额外引入

http://www.lryc.cn/news/370651.html

相关文章:

  • php redis分布式锁
  • kotlin 中的布尔
  • 有哪些ai聊天推荐?简单分享三款
  • Python第二语言(十、Python面向对象(上))
  • SolidWorks 2016 SP5安装教程
  • 为什么高考志愿只选计算机专业?
  • GPT大模型微调-提高垂直领域回答质量
  • 全网首发-Docker被封后的代理设置教程
  • 代码随想录算法训练营第五十七天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列
  • RocketMQ事务性消息
  • mysql (事物)
  • kotlin 中的字符串
  • 网站线上模板建设的优缺点
  • 哲学家进餐问题
  • 无人机遥感在农林信息提取中的实现方法与GIS融合应用
  • 联想测开一面(电话面试)笔试60%
  • 【python】tkinter GUI开发: Button和Entry的应用实战探索
  • sm2证书生成(openssl3.0)
  • java计算年化利率
  • 深入理解ChatGPT工作原理
  • 在 Wed 中应用 MyBatis(同时使用MVC架构模式,以及ThreadLocal 事务控制)
  • Elasticsearch index 设置 false,为什么还可以被检索到?
  • 169. 多数元素
  • ADS基础教程19 - 电磁仿真(EM)基本概念和实操
  • LabVIEW RT环境中因字符串拼接导致的系统崩溃问题
  • 深层网络:层数多真的更好吗?
  • 【QT5】<知识点> QT常用知识(更新中)
  • 如何将AndroidStudio和IDEA的包名改为分层级目录
  • 北交字节联合提出ClassDiffusion: 使用显式类别引导的一致性个性化生成。
  • 37、matlab矩阵运算