墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. java
  3. spring
  4. 正文

Java中Bean的配置方式及扩展点详解

2023年 7月 19日 96点热度 0人点赞 0条评论

一、概述

  1. 什么是Bean

在Spring框架中,Bean是指被Spring容器所管理的Java对象。该对象可以是任何简单的Java对象(POJO),也可以是Web应用程序中的任何组件,例如servlet或过滤器。

  1. Bean的生命周期

Bean的生命周期包括以下几个阶段:

  • 实例化:Spring容器创建Bean的实例;
  • 属性设置:Spring容器通过setter方法或构造方法为Bean设置属性值;
  • 初始化:通过自定义初始化方法来初始化Bean,该方法由开发人员控制;
  • 使用:Bean已被Spring容器创建并初始化,可在应用程序中使用;
  • 销毁:调用开发人员自定义的销毁方法来销毁Bean。
  1. 为什么需要实例化Bean

在Java应用程序中,对象的创建和销毁是由程序员自己来处理的,这样会产生很多问题,例如对象管理、对象重用、对象依赖关系等问题。而Spring容器可以通过配置Bean来管理Java对象,从而解决这些问题。

二、XML配置方式

  1. 在XML中声明Bean

通过在Spring配置文件中使用元素声明Bean,例如:

<bean id="userService" class="com.example.UserService">
    <property name="userDao" ref="userDao"></property>
</bean>

其中,id属性表示Bean的唯一标识符,class属性表示Bean的完全限定类名,元素表示Bean的属性依赖。

  1. Bean的属性注入

在配置Bean时,需要将相关属性注入到Bean中。Spring提供两种属性注入方式:构造方法注入和属性注入。

1) 构造方法注入

通过在元素中使用子元素来进行构造方法注入。例如:

   <bean id="userService" class="com.example.UserService">
       <constructor-arg index="0" ref="userDao"></constructor-arg>
   </bean>

其中,index属性表示注入参数的位置,ref属性表示引用另一个Bean。

2) 属性注入

属性注入和构造方法注入的区别在于,属性注入是通过setter方法或直接为属性设置值来实现的。例如:

   <bean id="userService" class="com.example.UserService">
       <property name="userDao" ref="userDao"></property>
   </bean>

其中,name属性表示属性名,ref属性表示引用另一个Bean。

  1. 依赖注入

依赖注入是将一个Bean引用另一个Bean的过程,Spring提供了两种依赖注入方式:构造方法注入和Setter方法注入。

1) 构造方法注入

通过在元素中使用子元素来进行构造方法注入。例如:

   <bean id="userService" class="com.example.UserService">
       <constructor-arg index="0" ref="userDao"></constructor-arg>
   </bean>

其中,index属性表示注入参数的位置,ref属性表示引用另一个Bean。

2) Setter方法注入

通过在元素中使用子元素来进行Setter方法注入。例如:

   <bean id="userService" class="com.example.UserService">
       <property name="userDao" ref="userDao"></property>
   </bean>

其中,name属性表示属性名,ref属性表示引用另一个Bean。

三、注解配置方式

  1. @Component注解

@Component是一个通用的Spring注解,用于指示一个类作为Spring Bean。例如:

@Component
public class UserDao {
   ...
}
  1. @Autowired注解

@Autowired是一个用于自动注入Bean的注解,可以用于构造方法注入和Setter方法注入。

1) 构造方法注入

通过在构造方法上使用@Autowired注解来进行构造方法注入。例如:

   @Component
   public class UserService{
       private UserDao userDao;
       @Autowired
       public UserService(UserDao userDao){
           this.userDao = userDao;
       }
   }

2) Setter方法注入

通过在setter方法上使用@Autowired注解来进行Setter方法注入。例如:

   @Component
   public class UserService{
       private UserDao userDao;
       @Autowired
       public void setUserDao(UserDao userDao){
           this.userDao = userDao;
       }
   }
  1. @Qualifier注解

@Qualifier是一个用于指定Bean名称的注解。在使用@Autowired注解进行自动注入时,如果存在多个类型相同的Bean,可以通过@Qualifier指定Bean的名称。例如:

@Component
public class Service{
    private Dao dao;
    @Autowired
    public void setDao(@Qualifier("daoImpl") Dao dao){
        this.dao = dao;
    }
}

四、Java配置方式

  1. @Configuration注解

@Configuration是一个用于定义Spring配置类的注解。该注解表示这个类的实例是一个IoC容器,这个IoC容器用于生产Bean实例。例如:

@Configuration
public class AppConfig {
   @Bean
   public UserDao userDao() {
       return new UserDaoImpl();
   }
}
  1. @Bean注解

@Bean是一个用于定义Spring Bean的注解。这个注解标明了一个方法是Bean的生产方法,同时产生的Bean对象会被注册到Spring容器中。例如:

@Configuration
public class AppConfig {
   @Bean
   public UserService userService() {
       return new UserService(userDao());
   }
   @Bean
   public UserDao userDao() {
       return new UserDaoImpl();
   }
}
  1. 依赖注入

    1) 构造方法注入

    通过在Bean的生产方法上进行构造方法注入。例如:

   @Configuration
   public class AppConfig {
       @Bean
       public UserService userService(UserDao userDao) {
           return new UserService(userDao);
       }
       @Bean
       public UserDao userDao() {
           return new UserDaoImpl();
       }
   }

2) Setter方法注入

通过在Bean的生产方法中进行Setter方法注入。例如:

   @Configuration
   public class AppConfig {
       @Bean
       public UserService userService(){
           UserService userService = new UserService();
           userService.setUserDao(userDao());
           return userService;
       }
       @Bean
       public UserDao userDao(){
           return new UserDaoImpl();
       }
   }

五、扩展点

  1. Bean的作用域

    Spring支持多种Bean的作用域:singleton(默认)、prototype、request、session和global session。

    • singleton:一个容器中只存放一个Bean实例。
    • prototype:每次注入或者getBean时都返回一个全新的Bean实例。
    • request:每次HTTP请求都创建一个新的实例。
    • session:同一Session共享一个Bean实例。
    • global session:同一Portlet共享一个Bean实例。

    通过@Scope注解来进行Bean的作用域配置。例如:

   @Component
   @Scope("prototype")
   public class UserService{
       ...
   }
  1. Bean的初始化和销毁方法

    可以在Bean中定义自己的初始化和销毁方法。在初始化方法和销毁方法被调用时,Spring会自动调用该方法。初始化方法通过@PostConstruct注解进行声明,销毁方法通过@PreDestroy注解进行声明。例如:

   @Component
   public class UserService{
       @PostConstruct
       public void init(){
           //初始化方法
       }
       @PreDestroy
       public void destroy(){
           //销毁方法
       }
   }
  1. Bean的延迟加载

    Bean的延迟加载是指Spring容器在需要用到Bean时才进行加载。通过在Bean的@Scope注解中配置lazy-init属性为true来实现Bean的延迟加载。例如:

   @Component
   @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS, lazyInit = true)
   public class UserService{
       ...
   }

六、总结

通过以上介绍,我们对于Java中Bean的配置方式以及扩展点有了更深入的了解。在实际项目开发中,不同的配置方式可以根据需要进行选择,并且可以根据具体需求来定制Bean的作用域、初始化和销毁方法等。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: bean的注入 java spring 生命周期
最后更新:2023年 6月 22日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”? 炸裂!DeepSeek 8B 量化版降临:告别显存焦虑,你的 3080 Ti 也能玩转顶级大模型了! 美团炸场AI圈:点外卖点出个软件?用「对话式编程」重塑生产力!
炸裂!微软这门免费AI Agent新手课,GitHub近2万星,简直是宝藏!ComfyUI“打通任督二脉”:直接调用Veo2、GPT-4o等65大模型!一键串联你的AI工作流AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?
SpringBoot四大核心组件详解 掌握java 面向对象编程的关键:类、对象、继承、多态和封装 从零开始,详细讲解如何在服务器上安装、配置和使用宝塔面板:一站式解决网站管理问题 Couchbase开源的NoSQL(非关系型)数据库 阿里WebAgent开源:引领自主搜索新纪元 使用MyBatis在Java Spring中进行数据访问的指南
标签聚合
spring java deepseek 动态规划 教程 设计模式 算法 AI

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策