墨风如雪博客

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

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

2023年 7月 19日 149点热度 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日

墨风如雪

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

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

文章评论

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

墨风如雪

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

最新 热点 随机
最新 热点 随机
视频魔法来了!AI能实时“变脸”直播,连游戏画面也能瞬间换装? 告别“听指令”,AI要“自己动手”了!ChatGPT Agent,AI界的“全能选手”已上线! 8B 模型吊打 671B?数学证明界“卷王”Goedel-Prover-V2 来了! Kiro来了!亚马逊放大招,软件开发要被AI“绑架”了吗? 火速围观!Trae IDE 迎来两大明星模型,Kimi K2 硬核登场,Grok-4 (Beta) 闪耀国际! 告别“打工人”模式,AI“全能选手”RoboNeo 来了!
别只盯着Suno了,腾讯端出的这盘“王炸”可能要改变游戏规则Kimi变身学术“卷王”,你的论文和报告还好吗?昆仑万维扔出王炸:32B模型干翻671B,代码界迎来全能修理工!8亿参数撬动实时混音!谷歌开源“口袋DJ”,人人都能玩转音乐告别插件时代!OmniGen2:一个模型,通吃所有AIGC神操作2000万次呼唤背后,蓝骑士有了“赛博外挂”
JAVA基础 IO流详解 视频魔法来了!AI能实时“变脸”直播,连游戏画面也能瞬间换装? 设计模式的八大准则 java spring bean的生命周期 掌握java 面向对象编程的关键:类、对象、继承、多态和封装 OWL Agent 实战指南:零成本打造你的全能开源 AI 打工人
标签聚合
deepseek 大模型 AI java 算法 设计模式 spring 教程

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

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策