Spring-Bean基础

news/2024/10/18 18:24:08/

文章目录

  • 什么是 BeanDefinition
  • 如何获取BeanDefinition
  • 如何将BeanDefinition注册到容器中
  • Bean的初始化操作
  • Bean的销毁操作


什么是 BeanDefinition

BeanDefinition 是 Spring Framework 中定义 Bean 的配置元信息接口,包含如下信息:在这里插入图片描述

如何获取BeanDefinition

我们直接给出代码示例:

public class BeanDefinitionCreator {public static void main(String[] args) {/** 方式一:通过BeanDefinitionBuilder构建*/// 获取BeanDefinitionBuilderBeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);// 设置属性beanDefinitionBuilder.addPropertyValue("id", 1).addPropertyValue("name", "zfDtpTest1");// 构建BeanDefinitionBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();/** 方式二:通过AbstractBeanDefinition以及其派生类构建*/GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();genericBeanDefinition.setBeanClass(User.class);MutablePropertyValues propertyValues = new MutablePropertyValues();propertyValues.add("id", 2).add("name", "zfDtpTest2");genericBeanDefinition.setPropertyValues(propertyValues);}
}

如何将BeanDefinition注册到容器中

  • XML 配置元信息
    • <bean name=”…” … />
  • Java 注解配置元信息
    • @Bean
    • @Component
    • @Import
// @Import将Config注册到容器中
@Import(AnnotationBeanDefinitionDemo.Config.class)
public class AnnotationBeanDefinitionDemo {public static void main(String[] args) {// 定义容器AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();// 此处其实是用的Java API的方式进行注册的annotationConfigApplicationContext.register(Config.class);// 刷新容器annotationConfigApplicationContext.refresh();User user3 = annotationConfigApplicationContext.getBean("user3", User.class);User test3 = annotationConfigApplicationContext.getBean("test3", User.class);// 关闭容器annotationConfigApplicationContext.close();}// 使用@Component将Config 注册到容器中@Componentpublic static class Config {@Bean(name = {"user3", "test3"})public User user() {User user = new User();user.setId(3);user.setName("test3");return user;}}
}
  • Java API 配置元信息
    • 命名方式:BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
    • 非命名方式:
      BeanDefinitionReaderUtils#registerWithGeneratedName(AbstractBeanDefinition,BeanDe
      finitionRegistry)
    • 配置类方式:AnnotatedBeanDefinitionReader#register(Class…)
public class ApiRegistryBeanDemo {public static void main(String[] args) {// 定义容器AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();// 命名方式annotationConfigApplicationContext.registerBeanDefinition("user1", getUserBeanDefinition());// 非命名方式BeanDefinitionReaderUtils.registerWithGeneratedName(getUserBeanDefinition(), annotationConfigApplicationContext);// 刷新容器annotationConfigApplicationContext.refresh();User user = annotationConfigApplicationContext.getBean("user1", User.class);System.out.println(user);// 关闭容器annotationConfigApplicationContext.close();}public static AbstractBeanDefinition getUserBeanDefinition(){GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();genericBeanDefinition.setBeanClass(User.class);MutablePropertyValues propertyValues = new MutablePropertyValues();propertyValues.add("id", 2).add("name", "zfDtpTest2");genericBeanDefinition.setPropertyValues(propertyValues);return genericBeanDefinition;}
}

Bean的初始化操作

  • @PostConstruct 标注方法
  • 实现 InitializingBean 接口的 afterPropertiesSet() 方法
  • 自定义初始化方法
    • XML 配置:<bean init-method=”init” … />
    • Java 注解:@Bean(initMethod=”init”)
    • Java API:AbstractBeanDefinition#setInitMethodName(String)
public class BeanInitDemo {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();applicationContext.register(BeanInitDemo.class);applicationContext.refresh();applicationContext.close();}@Bean(initMethod = "customInitMethod")public InitDemo initDemo(){return new InitDemo();}public static class InitDemo implements InitializingBean {@PostConstructpublic void postConstruct(){System.out.println("InitDemo 的 postConstruct初始化方式被实现");}public void afterPropertiesSet() {System.out.println("InitDemo 的 InitializingBean#afterPropertiesSet初始化方式被实现");}public void customInitMethod(){System.out.println("InitDemo 的 customInitMethod初始化方式被实现");}}
}

Bean的销毁操作

  • @PreDestroy 标注方法
  • 实现 DisposableBean 接口的 destroy() 方法
  • 自定义销毁方法
    • XML 配置:<bean destroy=”destroy” … />
    • Java 注解:@Bean(destroy=”destroy”)
    • Java API:AbstractBeanDefinition#setDestroyMethodName(String)
public class BeanDestroyDemo {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();applicationContext.register(BeanDestroyDemo.class);applicationContext.refresh();applicationContext.close();}@Bean(destroyMethod = "customDestroyMethod")public DestroyDemo destroyDemo(){return new DestroyDemo();}public static class DestroyDemo implements DisposableBean {@PreDestroypublic void preDestroy(){System.out.println("DestroyDemo 的 @PreDestroy 销毁方式被实现");}public void destroy() throws Exception {System.out.println("DestroyDemo 的 DisposableBean#destroy 销毁方式被实现");}public void customDestroyMethod(){System.out.println("DestroyDemo 的 @Bean(destroyMethod = \"customDestroyMethod\") 销毁方式被实现");}}
}

http://www.ppmy.cn/news/277010.html

相关文章

cmake 学习 笔记

文章目录 说明常用语法find_packageinclude_directorieslink_directoriesadd_executabletarget_link_librariesadd_library🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀 欢迎关注,加入学习交流群 🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀 �

linux系统gpu test,GpuTest显卡测试软件 For Linux

说到显卡测试&#xff0c;我们一定会想到3D Mark&#xff0c;可是看着3D Mark那几百兆的大小和小水管的网速&#xff0c;有没有轻量级的测试软件呢&#xff1f; GpuTest就是一款十分小巧的软件&#xff0c;这是一款基于OpenGL的显卡压力测试软件&#xff0c;GpuTest还是一款跨平…

通达OA协同办公软件怎么样?

通达OA协同办公软件是北京通达信科科技有限公司旗下的OA产品&#xff0c;正在选型中的您&#xff0c;一定非常关心通达OA协同办公软件用户口碑怎么样&#xff1f;优缺点有哪些&#xff1f; 想了解这些信息&#xff0c;您应该到选型宝&#xff0c;B2B的大众点评&#xff0c;看看…

华为OA办公系统怎么选?什么是用户口碑最好的华为OA系统?

提到OA选型&#xff0c;难免不会提到华为&#xff0c;华为OA怎么样&#xff1f;华为OA有哪些优缺点&#xff1f;华为OA用户口碑怎么样&#xff1f; 想了解这些信息&#xff0c;您应该到选型宝&#xff0c;B2B的大众点评&#xff0c;看看用户对华为OA产品的实名点评。 关于华为…

【面经】华为OD软件测试

本人山东双非一本&#xff0c;二战失利后参加工作&#xff0c;面试时参考了网上很多面经&#xff0c;前人栽树后人乘凉&#xff0c;写一下自己的面试经历。 2.16 机试 总分400&#xff0c;两道简单题各100分&#xff0c;一道中等题200分&#xff0c;每题按照通过样例百分比计…

软件测试OA办公自动化系统测试方案

办公自动化系统擅长处理类似公告、公文等流转类型的行政办公类应用需求、设计及相对独立的个人相关资料、通讯录、记事本等个人事务类的需求、设计。另外办公自动化系统软件的权限管理是其不同于其他应用软件的另外一个特点。系统需要为使用人员提供设置不同的权限和访问许可的…

显卡测试软件3d mark,最强显卡测试软件!AquaMark3

AquaMark3很有可能会取代3DMark2003,成为新一带3D显示卡测试标准。而从测试项目来看,AquaMark3和3DMark03相比,会更加贴近目前主流游戏的3D技术标准,AquaMark3当中采用的任何3D技术都已经在目前的游戏当中出现过 AquaMark3 初探 AquaMark3很有可能会取代3DMark2003,成为新…

ubuntu系统计算机_显卡-性能测试软件

下面记录下自己经常使用的linux下计算机CPU性能、显卡性能测试软件。 说明: time echo "scale=5000; 4*a(1)" | bc -l -q(注意空格) 解释:time命令:测量命令的执行时间或者系统资源的使用情况