Spring Bean

9 篇文章 0 订阅
9 篇文章 0 订阅

Bean对象

1. 框架创建Spring Bean对象的方式有哪些

        Spring框架提供了多种创建Bean对象的方式,具体包括:

  • Xml配置文件方式:是传统的方式,不推荐,通过在Spring的Xml配置文件中使用标签来定义Bean,指定其ID和类名。这种方式适用于纯Spring应用,但随着应用复杂度的增加,可能导致Xml配置文件过大,不便于管理。

        <!-- 在Spring的XML配置文件中定义Bean -->
        <bean id="myBean" class="com.example.MyBeanClass"/>
    
  • 注解方式:使用@Component、@Controller、@Service、@Repository等注解来标记一个类,这些注解将会被Spring容器自动扫描并创建单例对象。这种方法简化了配置,是现代Spring应用中常用的方式。

  • 构造函数方式:如果一个类提供了默认的无参构造函数,Spring可以通过反射机制使用该构造函数来创建Bean对象。如果没有提供无参构造函数,则需要在Xml配置中明确指定使用哪个构造函数来创建对象。

  • 工厂方法方式:可以在Spring的Xml配置文件中使用标签或着通过java配置类中的Bean注解来指定工厂方法,Spring将调用该方法来创建Bean实例。

        <!-- 在Spring的XML配置文件中使用factory-method指定工厂方法 -->
        <bean id="myBean" factory-method="createMyBean"/>
    
        // Java配置类中的@Bean注解指定工厂方法
        @Configuration
        public class AppConfig {
            @Bean
            public MyBeanClass createMyBean() {
                return new MyBeanClass();
            }
        }
    
  • AOP代理方式:在某些情况下,当启用了AOP时,Spring会为匹配切点表达式的Bean创建代理对象。这样,当获取到的对象实际上是一个代理对象,对其方法的调用可能会出发相关的增强逻辑(Advice)。

        <!-- 启用AOP,为匹配切点表达式的Bean创建代理对象 -->
        <aop:config>
            <aop:pointcut id="myPointcut" expression="execution(* com.example.*.*(..))"/>
            <aop:advisor advice-ref="myAdvice" pointcut-ref="myPointcut"/>
        </aop:config>
    
        <bean id="myAdvice" class="org.springframework.aop.interceptor.DebugInterceptor"/>
    

Bean对象定义注解

注解说明
@Component该注解用于描述Spring中的Bean,它是一个泛化概念,仅仅标识容器中的一个组件Bean,用于可以作用在任何层次,使用时主要将该注解标注在相应的类上即可
@Controller用于控制层(Controller层)的类表示为Bean
@Service用于业务层(Service层)的类表示为Bean
@Repository用于数据访问层(Dao层)的类表示为Bean

Bean的获取方式

  • 通过ApplicationContext的getBean()方法;
  • 自动注入@Autowired注解
  • 通过@Resouce注解

2. 依赖注入

  • @Value注解:@Value注入是将属性值直接注入到bean中,主要用于注入一些简单类型的属性(字符串、基本类型等)

  • @Autowired注解:@Autowired注入是将对象注入到bean中,并且在注入对象时会根据依赖注入容器中的bean的类型进行匹配,如果容器中有多个类型匹配的bean存在,则会抛出异常。该注解常用于注入复杂对象、接口类型的属性或其他bean实例。

    • 根据类类型注入
    • 根据接口类型注入
  • @Qualifier注解:@Qualifier是用于限定一个接口有多个实现类时,根据指定的限定条件来选择具体的实现类的注解。当Spring容器中存在多个实现统一接口的bean时,由于不能确定注入哪一个实现类,就需要通过@Qualifier注解来明确指定要注入的bean的名称。

  • @Resource注解:@Resource是JavaEE提供的注解之一,也支持在Spring Framework中使用。在Spring中,可以用来注入Bean实例,与@Autowired注解的作用类似。

    • @Resource注解是JDK扩展包中的,级属于JDK的一部分。该注解是标准注解,而@Autowired注解是Spring框架的。
    • 装配规则
      • @Resource注解默认根据名称装配(byName)
      • 当未指定name时,则使用属性名作为nane进行装配
      • 如果通过name也未找到,则会自动启动通过类型byType装配

3. Bean的作用域

  • 单实例(singleton):指某个类只能创建唯一的一个实例对象,并且该类提供一个全局的访问点(静态方法)来让外界获取这个实例,常用于只需要一个实例来处理所有任务的场景下。

  • 多实例(Multiple):指可以在同一个类的定义下,创建多个实例对象。每个对象都是相互独立的,有自己的状态和行为;常用于需要同时处理多个任务的场景。

注解说明
@Scope(“singleton”)[默认]在IoC容器中,bean的对象为单例模式
@Scope(“prototype”)在IoC容器中,bean的对象为多例模式

4. Bean的生命周期

        程序中每个对象都有生命周期,对象的创建、初始化、使用、销毁的整个过程称之为对象的生命周期。在对象创建以后需要初始化,应用完成以后需要销毁时执行的一些方法,可以称之为时生命周期方法。在Spring中,可以通过@PostConstruct和@PreDestory注解实现bena独享生命周期的初始化和销毁时的方法。

注解说明
@PostConstruct生命周期初始化方法,在对象构建以后执行
@PreDestory生命周期销毁方法【prototype作用域对象不执行此方法】
  • 完整生命周期
    • 实例化阶段(Bean对象创建):在这个阶段中,IoC容器会创建一个Bean的实例,并为其分配空间。这个过程可以通过构造方法完成。
    • 属性赋值阶段:在实例化完成Bean之后,容器会把Bean中的属性值注入到Bean中,这个过程可以通过set方法完成。
    • 初始化阶段(Bean对象初始化):在属性注入完成后,容器会对Bean进行一些初始化操作。
    • 使用阶段:初始化完成后,Bean对象就可以被容器使用。
    • 销毁阶段:容器在关闭时会对所有的Bean进行销毁操作,释放资源

5. 引用外部属性文件

使用流程如下:
    1. 创建外部属性文件(在resources目录下创建文件,命名为***.properties)
    2. 引入外部属性文件(使用@PropertySource(“classpath:文件名”)注解)
    3. 获取外部属性文件中的变量值(使用${变量名}方式)
    4. 进行属性值注入

6. 自动扫描配置

        自动扫描配置是Spring框架提供的一种基于注解(Annotation)的配置方式,用于自动发现和注册Spring容器中的组件。当我们使用自动扫描配置时,只需要在需要被Spring管理的组件(如Service、Controller、Repository等)上添加对应的注解,Spring就会自动地将这些组件注册到容器中,从而可以在其他组件中使用。

        在Spring中,通过@ComponentScan注解来实现自动扫描配置。

        @ComponentScan注解用于指定要扫描的包或类。

        Spring会在指定的包及其子包下扫描所有添加@Component等注解的类,把这些类注册为Spring Bean,并纳入Spring容器进行管理。

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨尘儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值