springIoc容器

2024-04-04 04:28
文章标签 容器 springioc

本文主要是介绍springIoc容器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

springIoc容器

Ioc容器的两个作用:
(1)管理bean,包括发布和获取bean。
(2)描述Bean之间的依赖关系。
Ioc是管理Bean的容器,所有的Ioc都继承自BeanFactory,他是一个顶级容器。
BeanFactory方法有getBean,containBean,isSingleton,isPrototype,getAliases。
getBean()返回Bean会调用isPrototype()方法,如果返回true,就会创建新Bean返回。
ApplicationContext接口继承自BeanFactory接口,并且扩展了消息国际化接口,环境可配置接口,应用事件发布接口,资源模式解析接口。
ioc的配置文件:@Configuration,spring容器用它生成的Ioc配置去装配Bean。
装配Bean:@Bean(name=)return pojo;将这个返回的pojo装配到环境中去。

@configuration
public class AppConf{
@Bean(name="user")
public User initUser(){
return new User();}
}

然后就可以使用AnnotationConfigApplicationContext来构建Ioc容器了。

psvm{
ApplicationContext   ctx=new AnnotationConfigApplicationContext(AppConf.class);
User u=(User)ctx.getBean("user");
}
  1. 使用@Component和@ComponsentScan装配Bean
    使用@Component装配的bean默认使用类名的首字母小写作为Bean的名字。
    @ComponentScan在它的包和子包中扫描,将Conponent装配。
    使用这个组合就可以方便配置类的构造了:
@ComponentScan
@Configuration
public class AppConf{
}

然后再使用注解上下文获得Ioc容器:

psvm{
ApplicationContext   ctx=new AnnotationConfigApplicationContext(AppConf.class);
User u=(User)ctx.getBean("user");
}

@ComponentScan可以设置扫描范围

@ComponentScan(basePackage={"com.springboot.chapter3.*"},excudeFilters={@Filter(classes={UserService.class})
//排除包

3.将引入包的类装配到Ioc中
eg.将DBCP装配
先在pom中引入DBCP,然后使用@Bean.

@Bean(name="dataSource")
public DataSource getDataSource(){
Properties p=new Properties();
p.setProperty("driver","com.mysql.jdbc.Driver");
p.setProperty("url","jdbc:mysql://localhost:3306/chapter3");
p.setProperty("username","root");
p.setProperty("password","12345");
return BasicDataSourceFactory.createDataSource(p);
}

3.3依赖注入(DI)

@Autowired通过在Ioc容器中通过Type查找相应的Bean。

当这个类型有多个子类都符合时候,就会通过对象名字比如(Animal dog;),就会查找name=dog的Bean。
@Autowired(required=false) :允许找不到Bean设置为null

使用@Primary和@Qualifier消除歧义性

  1. 使用@Primary标注在Bean上面,可以优先使用Bean
@Primary
@Component
public class Dog{}
  1. 使用@Qualifier和@Autowired,使用名字和类型一起获得Bean
@Autowired
@Qualifier("dog")
private Animal dog=null;

Bean的生命周期

(1)资源定位:@ComponseScan扫描到Bean
(2)Bean定义:定义载入BeanDefinnition实例
(3)发布Bean定义:Ioc装载Bean的定义
(4)实例化:创建Bean的实例对象
(5)依赖注入

所有的单例作用域的Bean对象都会被创建并放入IoC容器中。对于原型作用域的Bean对象,它们可能在每次被请求时都会被创建。
如果开启延迟注入:@ComponetnScan(lazyInit=true),就会在getBean时候时候再创建Bean

之后就是程序员可以操作的回调函数了
(6)接口BeanNameAware的setBeanName方法,会回传BeanName作为参数(在Compontent中实现)

@Override
public void getBeanName(String BeanName){}

(7)接口BeanFactoryAware的setBeanFactory方法,可以用来获得上下文。

@Oerride
public void setBeanFactory(BeanFactory beanFactory){}

(8)接口ApplicationContextAware的setApplicationContext()方法,只用applicaitonContext的Ioc才能使用

@Override
public void setApplicationContext(ApplicationContext applicationContext){}

(9)针对全部Bean的预处理方法BeanPostProcessor接口(后置初始化器),的postProcessBeforeInitialization方法。
(10)使用@PostConstruct标注的方法,自定义的这个compontent初始化方法
(11)初始化结束的InitializingBeand的afterPropertiesSet方法
(12)针对全部Bean的预处理方法BeanPostProcessor接口(后置初始化器)的postProcessAfterInitialization方法。
(13)使用
(14)@PreDestroy标注方法,自定义销毁方法
(15)接口DisposableBean的destroy方法
后置初始化器:对所有Bean都有效

@Component
public class BeanPostProcessorExample implements BeanPostProcessor{
@Override
postProcessBeforeInitialization()
@Override
postProcesssAfterInitialization()
}

Ioc容器只管理singleton的生命周期,而prototype只负责创建

使用属性文件

在properties.application中配置完成后,可以使用
@Value(“${database.driverName}”)来进行使用属性配置。
使用@ConfigurationProperties(“database”)在自动装配application中的(database.成员变量名字)
使用@PropertySource(value={“classpath:database.properties”},ignoreResourceNotFound=true)将database.properties文件中的属性装配到上下文中。

条件装配Bean:检查上下文有没有在载入properties的配置(@Value载入的)

使用@Condition(ConditionImplments.class)配合接口Condition使用。

@Bean
@Condition(DatabaseCondition.class)
public DataSource getDatasource()

Bean的作用域:@Scope

prototype会在每一次getBean过程中创建一个Bean。
singleton单例
session:每个HTTP会话(SpringWeb工程才能使用)

这篇关于springIoc容器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/874786

相关文章

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

C++ STL关联容器Set与集合论入门

1. 简介 Set(集合)属于关联式容器,也是STL中最实用的容器,关联式容器依据特定的排序准则,自动为其元素排序。Set集合的底层使用一颗红黑树,其属于一种非线性的数据结构,每一次插入数据都会自动进行排序,注意,不是需要排序时再排序,而是每一次插入数据的时候其都会自动进行排序。因此,Set中的元素总是顺序的。 Set的性质有:数据自动进行排序且数据唯一,是一种集合元素,允许进行数学上的集合相

Spring容器上下文

目录 一 什么是spring容器上下文 二 spring容器上下文可以做什么 三 如何使用 1.实现ApplicationContextAware接口 2.代码测试 一 什么是spring容器上下文 你可以把它理解成就是spring容器,它主要用于管理Bean对象,包括bean的生命周期,bean的注入等等。 二 spring容器上下文可以做什么 我们刚刚上面

Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentLinkedDeque

文章目录 ConcurrentLinkedDeque特点构造方法常用方法使用示例注意事项 ConcurrentLinkedDeque ConcurrentLinkedDeque 是 Java 并发工具包(java.util.concurrent 包)中的一个线程安全的双端队列(Deque)实现,实现了 Deque 接口。它使用了链表结构,并且针对高并发环境进行了优化,非常适合

Docker 容器技术:简化 MySQL 主从复制部署与优化

Docker 容器技术:简化 MySQL 主从复制部署与优化 引言 随着大数据和云计算的快速发展,数据库的高可用性、可扩展性和易维护性成为了企业IT架构中的重要考量因素。MySQL 作为一款流行的开源数据库管理系统,其主从复制(Master-Slave Replication)功能为实现数据备份、故障恢复、读取扩展和数据分析提供了强有力的支持。然而,传统的 MySQL 主从复制部署过程复杂且容

Docker进入容器并运行命令

在讨论如何使用Docker进入容器并运行命令时,我们需要先理解Docker的基本概念以及容器的工作原理。Docker是一个开放平台,用于开发、交付和运行应用程序。它使用容器来打包、分发和运行应用程序,这些容器是轻量级的、可移植的、自包含的,能够在几乎任何地方以相同的方式运行。 进入Docker容器的几种方式 1. 使用docker exec命令 docker exec命令是最常用的进入正在运

Qt-常用控件(3)-多元素控件、容器类控件和布局管理器

1. 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别,以 QTableWidget 和 QTableView 为例. QTableView 是基于 MVC 设计的控件.QTableView 自身不持有数据,使用 QTab

spring ioc容器的原理

1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协