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

Spring Bean的定义(含创建Bean的三种方式)

🏆 文章目标:复习和理解下Spring Bean的定义
🍀 Spring Bean的定义(含创建Bean的三种方式)
✅ 创作者:Jay…
🎉 个人主页:Jay的个人主页
🍁 展望:若本篇讲解内容帮助到您,请帮忙点个赞吧,谢谢。🙏

定义

Spring bean 对象是构成应用程序的支柱,也是由 Spring IoC 容器管理的。bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建的。

创建Bean

基于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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="beanDemoJay" class="demo.BeanDemoJay"/></beans>

基于注解扫描的配置

从 Spring 2.5 开始就可以使用注解来配置依赖注入,在可以使用基于注解的配置之前,我们将需要在我们的 Spring 配置文件中启用它。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 开启基于注解的配置 --><context:annotation-config/><!-- bean definitions go here --></beans>

当开启后,将可以在代码上使用注解,这表明 Spring 应该自动连接值到属性,方法和构造函数。如下是常用的注解:

序号说明
1@Required 注解应用于 bean 属性的 setter 方法。
2@Autowired 注解可以应用到 bean 属性的 setter 方法,非 setter 方法,构造函数和属性。
3@Qualifier通过指定确切的将被连线的 bean,@Autowired 和 @Qualifier 注解可以用来删除混乱。
4JSR-250 AnnotationsSpring 支持 JSR-250 的基础的注解,其中包括了 @Resource,@PostConstruct 和 @PreDestroy 注解。

基于Java的配置

基于 Java 的配置,可以使你在不用配置 XML 的情况下编写大多数的 Spring,主要通过 @Configuration 和 @Bean 等注解。

Component系列

注解说明
@Component最普通的一个注解,一般用于把普通pojo实例化到spring容器中。@Controller 和 @Service 和@Repository 是它的特殊情况,只是作为一个普通的类,不需要特殊归类时,比较适合采用@Component注解。
@Controller用于标注控制层,表示向控制层注入服务层的数据
@Service用于标注服务层,来进行业务的逻辑处理,在服务层注入DAO层数据
@Repository用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
@Configuration用于定义配置类,可替换xml配置文件,也可以理解为Spring配置文件当中的上下文。

依附于@Configuration的注解

@Bean 创建Deom

@Configuration
public class Demo {@Beanpublic Demo demo(){return new Demo();}
}

@Import 创建Cofing

@Configuration
@Import(Config.class)
public class Demo {}

@Import.ImportSelector 选择器,传入@Import注解所在类Demo上所有的注解信息,返回要导入的类名

@Configuration
@Import(ImportSelector_.class)
public class Demo {   
}
public class ImportSelector_ implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.spring.demo.beanlifecycle.Demo"};}
}

@Impport.ImportBeanDefinitionRegistrar Bean定义注册器,传入@Import注解所在类Demo上所有的注解信息:

Mybatis的Mapper接口就是用这种方式将Bean定义注册到Spring上下文的

@Configuration
@Import(ImportBeanDefinitionRegistrar_.class)
public class Demo {
}
public class ImportBeanDefinitionRegistrar_ implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Bean.class).setInitMethodName("init").setDestroyMethodName("destroy").getBeanDefinition();registry.registerBeanDefinition("bean", beanDefinition);System.out.println("registerBeanDefinitions: " + beanDefinition);}
}

FactoryBean

当通过“factoryBean”获取实例时,FactoryBean会调用getObject()方法;

当通过“&factoryBean”获取实例时,返回FactoryBean的实例;

当通过Demo.class来获取bean实例时,调用factoryBean的getObjectTyoe()来获取类型。

@Configuration
public class Demo {@Beanpublic FactoryBean_ factoryBean(){return new FactoryBean_();}
}
public class FactoryBean_ implements FactoryBean {@Overridepublic Object getObject() throws Exception {return new Demo();}@Overridepublic Class<?> getObjectType() {return Demo.class;}
}
http://www.lryc.cn/news/42530.html

相关文章:

  • vue的路由-vue router(一)
  • DevOps流水线搭建-PHP版本
  • C语言之按位取反~(七十一)
  • C# 委托
  • leetcode究极刷题笔记(11~15)
  • 【C语言】一篇带你从零了解 枚举
  • 用Pytorch搭建一个房价预测模型
  • 《Netty》从零开始学netty源码(十五)之ServerSocketChannel
  • Java stream性能比较
  • 【数据结构与算法】设计循环队列
  • 最新版!国内IT软件外包公司汇总~
  • MySQL的COUNT语句,竟然都能被面试官虐的这么惨!?
  • 数位DP 详解及其案例实战 [模板+技巧+案例]
  • 并发编程(六)—AbstractExecutorService源码分析
  • 015行为型-职责链模式
  • python例程:五子棋(控制台版)程序
  • leveldb的Compaction线程
  • 邪恶的想法冒出,立马启动python实现美女通通下
  • 蓝桥杯刷题冲刺 | 倒计时18天
  • 经典算法面试题——Java篇-附带赠书活动,评论区随机选取一人赠书
  • 支持RT-Thread最新版本的瑞萨RA2E1开发板终于要大展身手了
  • 【C语言进阶】 12. 假期测评①
  • 给程序加个进度条吧,1行Python代码,快速添加~
  • 常见的Keil5编译报错及其原因和解决方法
  • Django 实现瀑布流
  • 传输层协议----UDP/TCP
  • 教你如何快速在Linux中找到某个目录中最大的文件
  • Java二叉树面试题讲解
  • rancher2.6进阶之nfs动态创建pv配置
  • 快速上手vue elementUI好看的登录界面