Mr. Cappuccino的第60杯咖啡——Spring之BeanFactory和ApplicationContext

Spring之BeanFactory和ApplicationContext

    • 类图
    • BeanFactory
      • 概述
      • 功能
        • 项目结构
        • 项目代码
        • 运行结果
        • 总结
    • ApplicationContext
      • 概述
      • 功能
        • MessageSource(国际化的支持)
          • 概述
          • 项目结构
          • 项目代码
          • 运行结果
        • ResourcePatternResolver(匹配资源路径)
          • 概述
          • 项目结构
          • 项目代码
          • 运行结果
        • EnvironmentCapable(环境变量配置)
          • 项目结构
          • 项目代码
          • 运行结果
        • ApplicationEventPublisher(事件发布)
          • 项目结构
          • 项目代码
          • 运行结果
    • ApplicationContext实现类
      • 基于XML方式
        • 项目结构
        • 项目代码
        • 运行结果
      • 基于磁盘目录XML方式
        • 项目结构
        • 项目代码
        • 运行结果
      • 基于注解方式
        • @Import
          • 项目结构
          • 项目代码
          • 运行结果
        • @Conditional
          • 项目结构
          • 项目代码
          • 运行结果

类图

在这里插入图片描述

BeanFactory

概述

  1. BeanFactory,以Factory结尾,表示它是一个工厂类(接口), 它是负责生产和管理bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖;
  2. BeanFactory只是个接口,并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,如DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,其中XmlBeanFactory就是常用的一种,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用;
  3. 它为其他具体的IOC容器提供了最基本的规范,例如DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等具体的容器都是实现了BeanFactory,再在其基础之上附加了其他的功能;
  4. 原始的BeanFactory无法支持Spring的许多插件,如AOP功能、Web应用等。ApplicationContext接口,它由BeanFactory接口派生而来。现在一般使用ApplicationnContext,其不但包含了BeanFactory的作用,同时还进行更多的扩展;

功能

项目结构

在这里插入图片描述

项目代码

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com</groupId><artifactId>spring-bean-factory</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.1.RELEASE</version></dependency></dependencies></project>

AutowireBean.java

package com.spring.bean;/*** @author honey* @date 2023-08-10 14:51:07*/
public class AutowireBean {public void autowire(){System.out.println("AutowireBean==autowire()");}
}

UserBean.java

package com.spring.bean;import org.springframework.beans.factory.annotation.Autowired;/*** @author honey* @date 2023-08-10 14:08:14*/
public class UserBean {@Autowiredprivate AutowireBean autowireBean;public void to() {System.out.println("UserBean==to()");autowireBean.autowire();}
}

SpringConfig.java

package com.spring.config;import com.spring.bean.AutowireBean;
import com.spring.bean.UserBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author honey* @date 2023-08-10 14:08:44*/
@Configuration
public class SpringConfig {@Beanpublic UserBean userBean(){return new UserBean();}@Beanpublic AutowireBean autowireBean(){return new AutowireBean();}
}

SpringTest01.java

package com.spring.test;import com.spring.bean.UserBean;
import com.spring.config.SpringConfig;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigUtils;import java.util.Arrays;
import java.util.Collection;/*** @author honey* @date 2023-08-10 14:09:39*/
public class SpringTest01 {public static void main(String[] args) {// 初始化BeanFactoryDefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();// 获取SpringConfig对应的BeanDefinitionAbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(SpringConfig.class).getBeanDefinition();// 将BeanDefinition注册到BeanFactory中beanFactory.registerBeanDefinition("springConfig", beanDefinition);// 注册注解相关配置的处理器AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);// 通过BeanFactory后置处理器处理SpringConfig中配置的bean(ConfigurationClassPostProcessor)Collection<BeanFactoryPostProcessor> beanFactoryPostProcessors = beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values();beanFactoryPostProcessors.forEach((beanFactoryPostProcessor) -> beanFactoryPostProcessor.postProcessBeanFactory(beanFactory));// 通过Bean对象后置处理器处理依赖注入@Autowired(AutowiredAnnotationBeanPostProcessor)和@Resource(CommonAnnotationBeanPostProcessor)Collection<BeanPostProcessor> beanPostProcessors = beanFactory.getBeansOfType(BeanPostProcessor.class).values();beanPostProcessors.forEach(beanFactory::addBeanPostProcessor);// 提前初始化单例对象(饿汉式)beanFactory.preInstantiateSingletons();// 默认情况下延迟加载(懒汉式)UserBean userBean = beanFactory.getBean("userBean", UserBean.class);userBean.to();System.out.println(userBean);System.out.println("-------------");// 输出所有注册到BeanFactory中的beanNameArrays.stream(beanFactory.getBeanDefinitionNames()).forEach((beanName) -> System.out.println("beanName:" + beanName));}
}

运行结果

在这里插入图片描述

总结

DefaultListableBeanFactory作为BeanFactory的默认实现类,该类中维护了存储Bean对象的map集合,BeanFactory主要负责生产和管理Bean对象。


// 注册注解相关配置的处理器
AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);

AnnotationConfigUtils.java

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


// 通过BeanFactory后置处理器处理SpringConfig中配置的bean(ConfigurationClassPostProcessor)
Collection<BeanFactoryPostProcessor> beanFactoryPostProcessors = beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values();
beanFactoryPostProcessors.forEach((beanFactoryPostProcessor) -> beanFactoryPostProcessor.postProcessBeanFactory(beanFactory)
);

ConfigurationClassPostProcessor:用于从BeanFactory中检测使用了@Configuration注解的类,并将这些类中使用了@Bean注解的方法生成BeanDefinition,注册到BeanFactory中。

ConfigurationClassPostProcessor.java

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

EventListenerMethodProcessor:主要用于处理@EventListener注解。


// 通过Bean对象后置处理器处理依赖注入@Autowired(AutowiredAnnotationBeanPostProcessor)和@Resource(CommonAnnotationBeanPostProcessor)
Collection<BeanPostProcessor> beanPostProcessors = beanFactory.getBeansOfType(BeanPostProcessor.class).values();
beanPostProcessors.forEach(beanFactory::addBeanPostProcessor
);

AutowiredAnnotationBeanPostProcessor: 主要用于处理@Autowired注解。

AutowiredAnnotationBeanPostProcessor.java

在这里插入图片描述

CommonAnnotationBeanPostProcessor:主要用于处理@Resource注解。

CommonAnnotationBeanPostProcessor.java

在这里插入图片描述


// 提前初始化单例对象(饿汉式)
beanFactory.preInstantiateSingletons();

BeanFactory默认采用延迟加载的形式来注入Bean。


BeanFactoryPostProcessor:BeanFactory的后置处理器,是实现spring容器功能扩展的重要接口;
BeanPostProcessor:Bean对象的后置处理器,负责对已创建好的bean对象进行加工处理;

BeanPostProcessor中的两个核心方法:
postProcessBeforeInitialization:在任何初始化方法执行之前执行该方法,如InitializingBean的afterPropertiesSet方法;
postProcessAfterInitialization:在任何初始化方法执行之后执行该方法,如InitializingBean的afterPropertiesSet方法;


ApplicationContext

概述

ApplicationContext的中文意思是“应用程序上下文”,它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持、资源访问(如URL和文件)、事件传播等方面进行了良好的支持,被推荐为Java EE应用之首选,可应用在Java APP与Java Web中。

  1. MessageSource(国际化的支持)
  2. ResourcePatternResolver(匹配资源路径)
  3. EnvironmentCapable(环境变量配置)
  4. ApplicationEventPublisher(事件发布)

在这里插入图片描述

功能

MessageSource(国际化的支持)

概述

MessageSource是Spring中的转换消息接口,提供了国际化信息的能力。MessageSource用于解析消息,并支持消息的参数化和国际化。Spring包含两个内置的MessageSource实现:ResourceBundleMessageSource和ReloadableResourceBundleMessageSource。

项目结构

在这里插入图片描述

项目代码

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com</groupId><artifactId>spring-application-context</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.1.RELEASE</version></dependency></dependencies></project>

SpringConfig.java

package com.spring.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;/*** @author honey* @date 2023-08-11 01:30:48*/
@Configuration
public class SpringConfig {@Beanpublic ResourceBundleMessageSource messageSource() {ResourceBundleMessageSource source = new ResourceBundleMessageSource();// 设置基础名source.setBasenames("messages/message");// 设置编码source.setDefaultEncoding("UTF-8");return source;}
}

在resources目录下创建文件夹messages,并在messages文件夹下新增两个配置文件,分别是message_en.properties和message_zh.properties。

message_en.properties

test=test

message_zh.properties

test=测试

SpringTest01.java

package com.spring.test;import com.spring.config.SpringConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ResourceBundleMessageSource;import java.util.Locale;/*** @author honey* @date 2023-08-11 01:33:10*/
public class SpringTest01 {public static void main(String[] args) {// MessageSource(国际化的支持)AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);ResourceBundleMessageSource messageSource = applicationContext.getBean("messageSource", ResourceBundleMessageSource.class);System.out.println("中文:" + messageSource.getMessage("test", null, Locale.CHINESE));System.out.println("英文:" + messageSource.getMessage("test", null, Locale.ENGLISH));}
}
运行结果

在这里插入图片描述

ResourcePatternResolver(匹配资源路径)

概述

ResourcePatternResolver用于解析带有*等通配符路径的资源文件,是ResourceLoader接口的拓展接口。

classpath: 只会从target/classes目录下查找文件;
classpath*: 不仅会从target/classes目录下查找文件,还会从所依赖的Jar包中查找文件;

项目结构

在这里插入图片描述

项目代码

application.properties

name=honey

SpringTest02.java

package com.spring.test;import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.io.Resource;import java.io.IOException;
import java.util.Arrays;/*** @author honey* @date 2023-08-11 02:09:51*/
public class SpringTest02 {public static void main(String[] args) throws IOException {// ResourcePatternResolver(匹配资源路径)AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();System.out.println("-------------------------------------------------------------");System.out.println("读取resources目录下的application.properties");Resource[] resources1 = applicationContext.getResources("classpath:application.properties");Arrays.stream(resources1).forEach(System.out::println);System.out.println("-------------------------------------------------------------");System.out.println("读取spring-beans-5.2.1.RELEASE.jar!/META-INF/spring.factories");Resource[] resources2 = applicationContext.getResources("classpath*:META-INF/spring.factories");Arrays.stream(resources2).forEach(System.out::println);}
}
运行结果

在这里插入图片描述

EnvironmentCapable(环境变量配置)

项目结构

在这里插入图片描述

项目代码

SpringTest03.java

package com.spring.test;import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;/*** @author honey* @date 2023-08-11 02:31:12*/
public class SpringTest03 {public static void main(String[] args) {// EnvironmentCapable(环境变量配置)AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();ConfigurableEnvironment environment = applicationContext.getEnvironment();String javaHome = environment.getProperty("java_home");String env = environment.getProperty("env");System.out.println("java_home:" + javaHome);System.out.println("env:" + env);}
}
运行结果

在启动时需要加上环境变量参数


方式一

在这里插入图片描述


方式二

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

ApplicationEventPublisher(事件发布)

项目结构

在这里插入图片描述

项目代码

UserInfoEvent.java

package com.spring.event;import org.springframework.context.ApplicationEvent;/*** @author honey* @date 2023-08-11 02:42:37*/
public class UserInfoEvent extends ApplicationEvent {/*** source事件源** @param source source*/public UserInfoEvent(Object source) {super(source);}
}

EmailListener.java

package com.spring.listener;import com.spring.event.UserInfoEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;/*** @author honey* @date 2023-08-11 02:44:35*/
@Component
public class EmailListener {@EventListenerpublic void emailListener(UserInfoEvent userInfoEvent) {System.out.println("当前监听器:emailListener,userInfoEvent:" + userInfoEvent);}
}

PhoneListener.java

package com.spring.listener;import com.spring.event.UserInfoEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;/*** @author honey* @date 2023-08-11 02:46:40*/
@Component
public class PhoneListener {@EventListenerpublic void phoneListener(UserInfoEvent userInfoEvent) {System.out.println("当前监听器:phoneListener,userInfoEvent:" + userInfoEvent);}
}

SpringConfig02.java

package com.spring.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;/*** @author honey* @date 2023-08-11 02:48:54*/
@Configuration
@ComponentScan(value = {"com.spring.listener"})
public class SpringConfig02 {
}

SpringTest04.java

package com.spring.test;import com.spring.config.SpringConfig02;
import com.spring.event.UserInfoEvent;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** @author honey* @date 2023-08-11 02:47:25*/
public class SpringTest04 {public static void main(String[] args) {// ApplicationEventPublisher(事件发布)AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig02.class);applicationContext.publishEvent(new UserInfoEvent(applicationContext));}
}
运行结果

在这里插入图片描述

ApplicationContext实现类

基于XML方式

项目结构

在这里插入图片描述

项目代码

UserBean.java

package com.spring.bean;/*** @author honey* @date 2023-08-11 03:11:09*/
public class UserBean {
}

spring.xml

<?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"><bean id="userBean" class="com.spring.bean.UserBean"/></beans>

SpringTest05.java

package com.spring.test;import com.spring.bean.UserBean;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author honey* @date 2023-08-11 03:11:51*/
public class SpringTest05 {public static void main(String[] args) {// 读取spring.xmlClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");// 从IOC容器中读取对象UserBean userBean = applicationContext.getBean("userBean", UserBean.class);System.out.println(userBean);}
}

运行结果

在这里插入图片描述

基于磁盘目录XML方式

项目结构

在这里插入图片描述

项目代码

在这里插入图片描述

SpringTest06.java

package com.spring.test;import com.spring.bean.UserBean;
import org.springframework.context.support.FileSystemXmlApplicationContext;/*** @author honey* @date 2023-08-11 03:17:20*/
public class SpringTest06 {public static void main(String[] args) {// 从磁盘中读取spring.xmlFileSystemXmlApplicationContext applicationContext = new FileSystemXmlApplicationContext("F:\\spring.xml");// 从IOC容器中读取对象UserBean userBean = applicationContext.getBean("userBean", UserBean.class);System.out.println(userBean);}
}

运行结果

在这里插入图片描述

基于注解方式

  1. @Configuration:配置类
  2. @ComponentScan:扫描指定包中加上了@Controller/@Service/@Reponsitory/@Component等注解的类
  3. @Bean:beanId默认为方法名称
  4. @Import:beanId默认为类的全限定名
    4.1. @Import({A.class,B.class})
    4.2. @Import (MyImportSelector.class),其中MyImportSelector实现了ImportSelector接口
    4.3. @Import (MyImportBeanDefinitionRegistrar.class),其中MyImportBeanDefinitionRegistrar实现了ImportBeanDefinitionRegistrar接口
  5. @Scope:设置作用域(singleton、prototype、request、session)
  6. @Lazy:设置单例对象是否懒加载
  7. @Conditional:根据指定条件判断Bean对象是否加载到IOC容器中

@Import

项目结构

在这里插入图片描述

项目代码

SpringConfig03.java

package com.spring.config;import com.spring.bean.UserBean;
import org.springframework.context.annotation.Bean;/*** @author honey* @date 2023-08-11 03:53:02*/
public class SpringConfig03 {@Beanpublic UserBean userBean03() {return new UserBean();}
}

SpringConfig04.java

package com.spring.config;import com.spring.bean.UserBean;
import org.springframework.context.annotation.Bean;/*** @author honey* @date 2023-08-11 03:54:27*/
public class SpringConfig04 {@Beanpublic UserBean userBean04() {return new UserBean();}
}

MyImportSelector.java

package com.spring.bean;import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;/*** @author honey* @date 2023-08-11 03:55:37*/
public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.spring.config.SpringConfig04"};}
}

MyImportBeanDefinitionRegistrar.java

package com.spring.bean;import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;/*** @author honey* @date 2023-08-11 03:55:45*/
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(UserBean.class);registry.registerBeanDefinition("userBean05", rootBeanDefinition);}
}

SpringConfig05.java

package com.spring.config;import com.spring.bean.MyImportBeanDefinitionRegistrar;
import com.spring.bean.MyImportSelector;
import org.springframework.context.annotation.Import;/*** @author honey* @date 2023-08-11 04:02:27*/
@Import({SpringConfig03.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class SpringConfig05 {}

SpringTest07.java

package com.spring.test;import com.spring.bean.UserBean;
import com.spring.config.SpringConfig05;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** @author honey* @date 2023-08-11 04:06:39*/
public class SpringTest07 {public static void main(String[] args) {AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(SpringConfig05.class);UserBean userBean03 = annotationConfigApplicationContext.getBean("userBean03", UserBean.class);System.out.println(userBean03);UserBean userBean04 = annotationConfigApplicationContext.getBean("userBean04", UserBean.class);System.out.println(userBean04);UserBean userBean05 = annotationConfigApplicationContext.getBean("userBean05", UserBean.class);System.out.println(userBean05);}
}
运行结果

在这里插入图片描述

@Conditional

项目结构

在这里插入图片描述

项目代码

LinuxCondition.java

package com.spring.condition;import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;/*** @author honey* @date 2023-08-11 04:20:37*/
public class LinuxCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return System.getProperty("os.name").toLowerCase().contains("linux");}
}

WindowsCondition.java

package com.spring.condition;import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;/*** @author honey* @date 2023-08-11 04:22:04*/
public class WindowsCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return System.getProperty("os.name").toLowerCase().contains("windows");}
}

SystemOperation.java

package com.spring.condition;/*** @author honey* @date 2023-08-11 04:22:49*/
public class SystemOperation {private final String name;public SystemOperation(String name) {this.name = name;}@Overridepublic String toString() {return "SystemOperation{" +"name='" + name + '\'' +'}';}
}

SpringConfig06.java

package com.spring.config;import com.spring.condition.LinuxCondition;
import com.spring.condition.SystemOperation;
import com.spring.condition.WindowsCondition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;/*** @author honey* @date 2023-08-11 04:23:27*/
public class SpringConfig06 {@Bean@Conditional(value = WindowsCondition.class)public SystemOperation windowsSystemOperation() {return new SystemOperation("执行windows命令");}@Bean@Conditional(value = LinuxCondition.class)public SystemOperation linuxSystemOperation() {return new SystemOperation("执行linux命令");}
}

SpringTest08.java

package com.spring.test;import com.spring.condition.SystemOperation;
import com.spring.config.SpringConfig06;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.Map;/*** @author honey* @date 2023-08-11 04:24:39*/
public class SpringTest08 {public static void main(String[] args) {AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(SpringConfig06.class);Map<String, SystemOperation> beansOfType = annotationConfigApplicationContext.getBeansOfType(SystemOperation.class);System.out.println(beansOfType);}
}
运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/84669.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试热题(岛屿数量)

给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网格的四条边均…

阿里云Nas文件存储的各种场景使用

文章目录 1.ECS服务器挂载NAS文件存储1.1.添加NAS挂载点1.2.为ECS挂载NAS存储image-202202012230314501.3.验证ECS服务器是否挂载了NAS存储1.4.卸载挂载的NAS存储 2.通过命令行的方式在ECS中挂载NAS存储3.KodCloud云盘系统采用NAS存储用户上传的文件3.1.配置云盘系统接入NAS存储…

爬虫013_函数的定义_调用_参数_返回值_局部变量_全局变量---python工作笔记032

然后再来看函数,可以避免重复代码 可以看到定义函数以及调用函数

【MFC】05.MFC第一大机制:程序启动机制-笔记

MFC程序开发所谓是非常简单&#xff0c;但是对于我们逆向人员来说&#xff0c;如果想要逆向MFC程序&#xff0c;那么我们就必须了解它背后的机制&#xff0c;这样我们才能够清晰地逆向出MFC程序&#xff0c;今天这篇文章就来带领大家了解MFC的第一大机制&#xff1a;程序启动机…

Vulhub之Apache HTTPD 换行解析漏洞(CVE-2017-15715)

Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞&#xff0c;在解析PHP时&#xff0c;1.php\x0A将被按照PHP后缀进行解析&#xff0c;导致绕过一些服务器的安全策略。 1、docker-compose build、docker-compo…

Technical debt (技术负债 / 技术债)

Technical debt (技术负债 / 技术债) In software development, or any other IT field (e.g., Infrastructure, Networking, etc.) technical debt (also known as design debt or code debt) is the implied cost of future reworking required when choosing an easy but li…

支持对接鸿蒙系统的无线模块及其常见应用介绍

近距离的无线通信得益于万物互联网的快速发展&#xff0c;基于集成部近距离无线连接&#xff0c;为固定和移动设备建立通信的蓝牙技术也已经广泛应用于汽车领域、工业生产及医疗领域。为协助物联网企业终端产品能快速接入鸿蒙生态系统&#xff0c;SKYLAB联手国产芯片厂家研发推…

新能源汽车充电桩控制主板有哪些特点

你是否好奇&#xff0c;新能源汽车充电桩控制主板是什么样子的?它有哪些特点?接下来&#xff0c;我们将为您揭秘。 控制主板是充电桩的大脑&#xff0c;它决定了充电桩的性能和稳定性。睿讯微充电桩主板拥有良好的整机抗干扰能力&#xff0c;能够有效地防止外部信号和电磁波的…

模仿火星科技 基于cesium+水平面积测量+可编辑

​ 当您进入Cesium的编辑水平积测量世界&#xff0c;下面是一个详细的操作过程&#xff0c;帮助您顺利使用这些功能&#xff1a; 1. 创建提示窗&#xff1a; 启动Cesium应用&#xff0c;地图场景将打开&#xff0c;欢迎您进入编辑模式。 在屏幕的一角&#xff0c;一个友好的提…

C++中如何让程序休眠自定义的时长

在C中&#xff0c;可以使用以下几种方法让程序休眠指定的时间&#xff1a; 1 使用操作系统相关的方法&#xff0c;如 Windows 中的 Sleep 函数&#xff0c;需要包含 <windows.h> 头文件 #include <windows.h> // 休眠1000毫秒&#xff08;1秒&#xff09; Sleep(…

Bert详细学习及代码实现详解

BERT概述 BERT的全称是Bidirectional Encoder Representation from Transformers&#xff0c;即双向Transformer的Encoder&#xff0c;因为decoder是不能获要预测的信息的。在大型语料库&#xff08;Wikipedia BookCorpus&#xff09;上训练一个大型模型&#xff08;12 层到 …

Java:Stream API

文章目录 1 说明2 为什么要使用Stream API3 什么是StreamStream的操作三个步骤创建Stream实例一系列中间操作终止操作 1 说明 Java8中有两大最为重要的改变。第一个是 Lambda 表达式&#xff1b;另外一个则是 Stream API。Stream API ( java.util.stream) 把真正的函数式编程风…

android studio内存分析之Memory profiler的使用

目录 Android Studio中内存分析工具Memory profiler的使用1. 打开Memory Profiler2. 工具使用3. 内存选项说明4. 内存性能分析器概览5. 内存计算方式6. 查看内存分配7. 捕获java/kotlin方式查看内存分配8. 堆转储文件导入和导出 内存性能分析器中的泄漏检测 Android Studio中内…

模仿火星科技 基于cesium+ 贴地测量+可编辑

当您进入Cesium的编辑贴地测量世界&#xff0c;下面是一个详细的操作过程&#xff0c;帮助您顺利使用这些功能&#xff1a; 1. 创建提示窗&#xff1a; 启动Cesium应用&#xff0c;地图场景将打开&#xff0c;欢迎您进入编辑模式。在屏幕的一角&#xff0c;一个友好的提示窗将…

【ROS】Ubuntu18.04安装Ros

Ubuntu18.04安装Ros 引言1 ROS安装&#xff08;一键式&#xff09;2 正常安装2.1 添加ROS软件源2.2 添加公钥2.3 更新2.4 安装ros2.5 初始化 rosdep2.6 设置环境2.7 安装rosinstall,便利的工具2.8 检验 3 rviz将bag数据可视化为点云3.1 打开ROS和rviz软件3.2 配置rviz软件可视化…

【论文阅读】基于深度学习的时序预测——Autoformer

系列文章链接 论文一&#xff1a;2020 Informer&#xff1a;长时序数据预测 论文二&#xff1a;2021 Autoformer&#xff1a;长序列数据预测 论文链接&#xff1a;https://arxiv.org/abs/2106.13008 github链接&#xff1a;https://github.com/thuml/Autoformer 解读参考&…

UDS诊断笔记

文章目录 常见缩写简介UDS寻址模式1. 物理寻址&#xff08;点对点、一对一&#xff09;2. 功能寻址&#xff08;广播、一对多&#xff09;3. 功能寻址使用场景举例 UDS报文格式UDS协议栈网络层网络层功能网络层协议1. 单帧 SF&#xff08;Single Frame&#xff09;2. 首帧 FC&a…

gradio解决上传文件数最大为1000的限制

当使用上传文件夹功能传输超过1000个文件时&#xff0c;会报出以下错误&#xff1a; 在github上&#xff0c;最新版的gradio仓库已经解决了这一问题&#xff1a; 但是这一更改还没有正式发布&#xff0c;因此无法使用pip更新&#xff1a; 因此只能先手动git clone https://g…

Pytest三种运行方式

Pytest 运行方式共有三种&#xff1a; 1、主函数模式 运行所有 pytest.main() 指定模块 pytest.main([-vs],,./testcase/test_day1.py) 只运行testcase 下的test_day1.py 文件 指定目录 pytest.main([-vs]),./testcase) 只运行testcase 目录下的文件 通过nodeid指定用例…

JavaScript + GO 通过 AES + RSA 进行数据加解密

浏览器端搞些小儿科的加密&#xff0c;就好比在黑暗夜空中&#xff0c;点缀了几颗星星&#xff0c;告诉黑客「这里有宝贵信息&#xff0c;快来翻牌」 浏览器端的加密&#xff0c;都是相对安全的。 它的具体安危&#xff0c;取决于里面存在的信息价值&#xff0c;是否值得破解者…