【Spring篇】Spring中的Bean管理

  

      🧸安清h:个人主页

   🎥个人专栏:【计算机网络】【Mybatis篇】

🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 


目录

🎯Spring IOC容器

🚦BeanFactory接口

🚦ApplicationContext接口

🎯Bean的配置

🚦Bean元素的多个属性

🚦Bean元素的多个子元素

🎯Bean的实例化

🚦构造方法实例

✨pom.xml文件

 ✨创建Bean1类

✨编写applicationContext.xml文件

✨编写测试类

🚦静态工厂实例化

✨创建Bean2类

✨创建MyBean2Factory类

✨编写applicationContext.xml文件

✨编写测试类

🚦实例工厂实例化

✨创建Bean3类

✨创建MyBean3Factory类

✨编写applicationContext.xml文件

✨编写测试类

🎯Bean的作用域

🎯Bean的装配方式

🚦基于Xml的装配

🎯基于注解的装配 

🚦导入依赖

🚦创建XML配置文件

🚦定义实体类

🚦定义DAO层

🚦实现DAO层

🚦定义Service层

🚦实现Service层

🚦定义Controller层

🚦定义测试类


🎯Spring IOC容器

Spring框架的主要功能是通过Spring容器实现的,Spring容器可以管理人们开发的各种Bean。Spring提供了相应API来管理Bean,在Spring容器的API里,最常用的是BeanFactory和ApplicationContext这两个接口。

🚦BeanFactory接口

BeanFactory 是 Spring 框架中的一个核心接口,它定义了 Spring IoC 容器的基本功能。BeanFactory 提供了配置应用程序组件的方式,并且负责这些组件的生命周期和依赖关系的管理。它是 Spring 框架中最原始的 IoC 容器的表现形式。BeanFactory 通常由 ApplicationContext 接口实现。

BeanFactory接口的一些关键方法示例:

  1. Object getBean(String name):根据给定的 Bean 名称获取一个 Bean 实例。

  2. <T> T getBean(String name, Class<T> requiredType):根据给定的 Bean 名称和期望的类型获取一个 Bean 实例。

  3. Object getBean(String name, Object... args):根据给定的 Bean 名称和构造函数参数获取一个 Bean 实例。

  4. <T> T getBean(Class<T> requiredType):根据给定的类型获取一个 Bean 实例。

  5. <T> T getBean(Class<T> requiredType, Object... args):根据给定的类型和构造函数参数获取一个 Bean 实例。

  6. boolean containsBean(String name):检查是否包含一个具有给定名称的 Bean。

  7. boolean isSingleton(String name):检查一个具有给定名称的 Bean 是否是单例作用域。

  8. boolean isPrototype(String name):检查一个具有给定名称的 Bean 是否是原型作用域。

  9. boolean isTypeMatch(String name, Class<?> targetType):检查一个具有给定名称的 Bean 是否是指定类型的一个匹配。

  10. Class<?> getType(String name):获取一个具有给定名称的 Bean 的类型。

  11. String[] getAliases(String name):获取一个具有给定名称的 Bean 的所有别名。

🚦ApplicationContext接口

ApplicationContext 接口是 Spring 框架中 BeanFactory 的一个扩展,它提供了更多的高级功能和特性,以支持企业级应用开发。ApplicationContext 包含了 BeanFactory 的所有功能。

ApplicationContext 接口的一些关键实现包括:

  • ClassPathXmlApplicationContext:从类路径下的 XML 配置文件中加载上下文定义。
  • FileSystemXmlApplicationContext:从文件系统下的 XML 配置文件中加载上下文定义。
  • AnnotationConfigApplicationContext:从注解配置类中加载上下文定义。
  • WebApplicationContext:用于 Web 应用程序,如 ServletContext 或 PortletContext。

🎯Bean的配置

在Spring框架中,Bean的配置是将类定义为Spring容器管理的对象的过程。Spring支持多种方式来配置Bean,包括XML配置、注解和Java配置类。

🚦Bean元素的多个属性

在Spring的XML配置中,<bean>元素具有多个属性,用于定义和管理Bean的创建和行为。以下是一些常用的<bean>元素属性:

  1. id:Bean的唯一标识符。通常用于通过getBean方法按名称检索Bean。

  2. class:Bean的全限定类名。Spring将使用这个类名来实例化Bean。

  3. name:为Bean提供额外的名称。可以有多个名称,它们之间用逗号、空格或分号分隔。

  4. scope:定义Bean的作用域。常见的作用域包括singleton(单例,默认值)、prototype(原型)、request(Web应用中的请求)、session(Web应用中的会话)等。

  5. lazy-init:指定Bean是否应该延迟初始化,直到它被首次请求时才创建。

🚦Bean元素的多个子元素

在Spring的XML配置中,<bean>元素可以包含多个子元素,这些子元素用于定义Bean的属性、构造函数参数、元数据以及其他配置。以下是一些常用的<bean>子元素:

  1. <property>:用于设置Bean的属性。它包含一个或多个<value><ref><bean>子元素,用于指定属性的值。

  2. <constructor-arg>:用于提供构造函数参数。可以包含<value><ref><bean>子元素,或者通过indextype属性指定参数的位置或类型。

  3. <property>的集合:可以定义多个<property>子元素来设置Bean的多个属性。

🎯Bean的实例化

在Spring框架中,Bean的实例化是指创建Bean实例的过程。Spring提供了多种方式来实例化Bean,这些方式可以通过配置来指定。以下是Spring中常见的Bean实例化方式:

🚦构造方法实例

在Spring中,构造方法实例化是通过调用类的构造方法来创建Bean实例的一种方式。这种方式适用于需要通过构造参数来初始化Bean的情况。以下是如何在Spring中使用构造方法实例化Bean的步骤:

✨pom.xml文件

 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

 ✨创建Bean1类

public class Bean1 {
    public Bean1(){
        System.out.println("Bean1");
    }
}

✨编写applicationContext.xml文件

 <bean id="bean1" class="com.han.Bean1"></bean>

✨编写测试类

public class Bean1Test {
    public static void main(String[]args){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        Bean1 bean= (Bean1) applicationContext.getBean("bean1");
        System.out.println(bean);
    }
}

🚦静态工厂实例化

静态工厂实例化是指使用类的静态方法来创建Bean实例的方式。在Spring中,可以通过配置XML文件来指定使用哪个类的静态方法来创建Bean。这种方式特别适用于那些没有构造函数参数或者需要通过特定工厂方法来创建实例的情况。

✨创建Bean2类

public class Bean2 {
    public Bean2(){
        System.out.println("Bean2");
    }
}

✨创建MyBean2Factory类

public class Bean2Factory {
    public static Bean2 createBean(){
        return new Bean2();
    }
}

✨编写applicationContext.xml文件

 <bean id="bean2" class="com.han.Bean2Factory" factory-method="createBean"></bean>

✨编写测试类

public class Bean2Test {
    public static void main(String[]args){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        Bean2 bean2= (Bean2) applicationContext.getBean("bean2");
        System.out.println(bean2);
    }
}

🚦实例工厂实例化

在Spring中,实例工厂实例化是一种创建Bean实例的方法,它允许你通过工厂方法来创建Bean,而不是通过构造函数或静态工厂方法。这种方式提供了更高的灵活性,因为你可以在工厂方法中执行复杂的逻辑来决定哪个Bean的实例应该被创建 

✨创建Bean3类

public class Bean3 {
    public Bean3(){
        System.out.println("Bean3");
    }
}

✨创建MyBean3Factory类

public class MyBean3Factory {
    public MyBean3Factory(){
        System.out.println("bean3工厂实例化中");
    }
    public Bean3 createBean(){
        return new Bean3();
    }
}

✨编写applicationContext.xml文件

    <bean id="mybean3" class="com.han.MyBean3Factory"/>
    <bean id="bean3" factory-bean="mybean3" factory-method="createBean"/>

✨编写测试类

public class Bean3Test {
    public static void main(String[]args){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        Bean3 bean3= (Bean3) applicationContext.getBean("bean3");
        System.out.println(bean3);
    }
}

🎯Bean的作用域

在bean标签中可以通过scope属性指定对象的作用域

scope="singleton"表示当前bean是单例模式(默认饿汉模式,Spring容器初始化阶段就会完成此对象的创建,在bean标签中设置lazy-init="true"时变为懒汉模式)

scope="prototype"表示当前bean为非单例模式,每次通过Spring容器获取此bean的对象时都会创建一个新的对象。

单例

<bean id="book2Spring" class="com.haust.pojo.Book" scope="singleton" lazy-init="true"></bean>

非单例

<bean id="book1Spring" class="com.haust.pojo.Book" scope="prototype"></bean>

bean的声明周期方法

在bean标签中通过init-method属性指定当前bean的初始化方法,初始化方法在构造器执行之后执行。

在bean标签中通过destory-method属性指定当前bean的销毁方法,销毁方法在对象销毁之前执行。

🎯Bean的装配方式

🚦基于Xml的装配

基于XML的装配是Spring框架中的一种配置方式,它允许开发者通过XML文件来定义和管理Bean的创建和依赖关系。这种方式在早期的Spring应用中非常常见,尽管现在注解和Java配置逐渐成为主流,但XML配置仍然是一种重要的配置手段,特别是在需要配置大量复杂Bean关系时。

在XML配置中,Bean的装配可以通过以下几种方式实现:

  1. setter注入(Setter Injection):这是最常见的装配方式,通过在XML文件中使用<property>标签来注入依赖。这种方式要求Bean类必须提供一个无参构造方法,并且需要注入的属性必须有对应的setter方法。例如:

    <bean id="student1" class="educoder.Student">
        <property name="name" value="张三" />
        <property name="age" value="25" />
    </bean>
  2. 构造注入(Constructor Injection):通过构造器注入的方式装配Bean,需要在XML配置文件中使用<constructor-arg>标签来定义构造方法的参数。这种方式适用于需要通过构造器传递依赖的场景。例如:

    <bean id="student2" class="educoder.Student">
        <constructor-arg index="0" value="李四" />
        <constructor-arg index="1" value="24" />
    </bean>

🎯基于注解的装配 

基于注解的装配是Spring框架中的一种依赖注入方式,它通过在代码中使用特定的注解来实现Bean的自动装配,从而减少了XML配置的复杂性。这种方式使得配置更加简洁,代码与配置的耦合度更低,提高了开发效率。以下是Spring中常用的几种注解装配方式:

  • @Component@Service@Repository@Controller:这些注解用于声明一个类作为Spring容器管理的Bean。@Component是通用的,而其他注解提供了额外的语义信息。
  • @Value:用于注入外部配置的值,如properties文件中的值。
  • @Resource:这是Java标准的一部分,可以通过名称来自动装配Bean,如果Bean的名称与字段名或setter方法名相同,Spring容器会自动装配。
  • @Autowired:这是最常见的自动装配注解,Spring容器会通过类型来自动装配Bean。如果存在多个相同类型的Bean,可以通过@Qualifier注解来指定具体的Bean。

下面通过一个案例来演示用注解装配Bean,具体步骤及代码如下:

🚦导入依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>

🚦创建XML配置文件

在appicationContext.xml文件中添加如下代码:

<context:component-scan base-package="com.han"/>

代码中指定要扫描的包为com.han,这个包下的注解就会生效。 

🚦定义实体类

实体类User是一个简单的Java类,使用@Component注解标记为Spring管理的Bean,并设置了作用域为单例。类中定义了三个属性:idusernamepassword,以及它们的getter和setter方法。@Value注解用于注入配置文件中的值。toString方法被覆盖以提供类的字符串表示。

@Component("user")
@Scope("singleton")
public class User {
    @Value("1")
    private int id;
    @Value("haha")
    private String username;
    @Value("789")
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

🚦定义DAO层

DAO层定义了一个接口UserDao,其中包含一个save方法。这个接口代表了与数据库交互的数据访问对象,save方法用于表示保存数据的操作。

public interface UserDao {
    public void save();
}

🚦实现DAO层

UserDaoImpl类实现了UserDao接口,并使用@Repository注解标记为Spring的Repository Bean。它的save方法中通过Spring的ApplicationContext获取了User Bean的实例,并打印了用户信息和保存操作的消息。

//使用Repository将UserDaoImpl类标识为Spring中的Bean
@Repository("userDao")
public class UserDaoImpl implements UserDao{
    @Override
    public void save() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        User user= (User) applicationContext.getBean("user");
        System.out.println(user);
        System.out.println("执行UserDaoImpl.save()");
    }
}

🚦定义Service层

Service层定义了一个接口UserService,其中包含一个save方法。这个接口代表了业务逻辑层,save方法用于表示执行保存操作的业务逻辑。

public interface UserService {
    public void save();
}

🚦实现Service层

UserServiceImpl类实现了UserService接口,并使用@Repository注解标记为Spring的Service Bean。它通过@Resource注解注入了UserDao,并在save方法中调用了UserDaosave方法,然后打印了业务逻辑层的保存操作消息。

@Repository("userService")
public class UserServiceImpl implements UserService{
    //使用Resource注解注入UserDao
    @Resource(name="userDao")
    private UserDao userDao;
    @Override
    public void save() {
       this.userDao.save();
       System.out.println("执行UserServiceImpl.save()");
    }
}

🚦定义Controller层

Controller层定义了一个UserController类,使用@Controller注解标记为Spring的Controller Bean。它通过@Resource注解注入了UserService,并在save方法中调用了UserServicesave方法,然后打印了控制器层的保存操作消息。

//使用Controller注解将UserController类标识为Bean
@Controller
public class UserController {
    @Resource(name="userService")
    private UserService userService;
    public void save(){
        this.userService.save();
        System.out.println("执行UserController.save()");
    }
}

🚦定义测试类

测试类AnnotationTest包含了一个main方法,用于初始化Spring的ApplicationContext并获取UserController的实例。然后调用UserControllersave方法来执行保存操作,从而测试整个Spring应用的流程是否正确。

public class AnnotationTest {
    public static void main(String[]args){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserController userController= (UserController) applicationContext.getBean("userController");
        userController.save();
    }
}

以上就是今天要讲的内容了,主要介绍了Bean的配置,实例化,作用域以及装配方式等相关内容,如果您感兴趣的话,可以订阅我的相关专栏。非常感谢您的阅读,如果这篇文章对您有帮助,那将是我的荣幸。我们下期再见啦🧸!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/895200.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【火山引擎】 Chat实践 | 大模型调用实践 | python

目录 一 前期工作 二 Doubao-pro-4k_test实践 一 前期工作 1 已在火山方舟控制台在线推理页面创建了推理接入点 ,接入大语言模型并获取接入点 ID。 2 已参考安装与初始化中的步骤完成 SDK 安装和访问凭证配置

Java面向对象编程基础(二)

Java面向对象编程基础二 一、package与import关键字的使用1.说明2.包的作用3.JDK中主要的包4. import5.import关键字的使用 二、封装性1.为什么要封装&#xff1f;2.如何封装?3.作用4.权限修饰符的权限大小5.案例 三、构造器1 构造器的使用说明2 案例: 四、实例变量赋值过程1 …

【优选算法】(第四十四篇)

目录 ⻜地的数量&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 地图中的最⾼点&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⻜地的数量&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;Le…

在wsl2下将Ubuntu从一个盘移动到其他盘

参考文章&#xff1a; wsl下将Ubuntu从c盘移动到其他盘 WSL数据迁移(迁移ext4.vhdx) WSL 系统迁移&#xff08;2&#xff09;&#xff0c;导入虚拟机磁盘映像 .vhdx ext4/fs WSL2迁移后默认登陆用户为root的解决方案 操作过程&#xff1a; 1.查看当前系统中wsl分发版本 …

MySQL数据库从入门到精通 第2讲 启动 停止 连接

MySQL数据库从入门到精通 第2讲 启动 停止 连接 MySQL数据库的初步使用 在上一小节我们已经简单了解了数据库与一些相关概念 接下来我们来学习下如何使用一下MySQL 1 MySQL的启动 MySQL服务是随着电脑开机自动启动的&#xff0c;在windows中MySQL的服务名称默认就是MySQL8…

从一个事故中理解 Redis(几乎)所有知识点

作者&#xff1a;看破 一、简单回顾 事故回溯总结一句话&#xff1a; &#xff08;1&#xff09;因为大 KEY 调用量&#xff0c;随着白天自然流量趋势增长而增长&#xff0c;最终在业务高峰最高点期占满带宽使用 100%。 &#xfeff; &#xfeff; &#xff08;2&#xff…

【JavaScript】LeetCode:76-80

文章目录 76 有效的括号77 最小栈78 字符串解码79 每日温度80 柱形图中最大的矩形 76 有效的括号 栈三种不匹配的情况&#xff1a; ( [ { } ] ( )&#xff0c;最左边的"("多余&#xff0c;即字符串遍历完了&#xff0c;栈还不为空。[ { ( } } ]&#xff0c;中间"…

机器学习中空间和时间自相关的分析:从理论基础到实践应用

空间和时间自相关是数据分析中的两个基本概念,它们揭示了现象在空间和时间维度上的相互依赖关系。这些概念在各个领域都有广泛应用,从环境科学到城市规划,从流行病学到经济学。本文将探讨这些概念的理论基础,并通过一个实际的野火风险预测案例来展示它们的应用。 图1: 空间自相…

el-radio 点击报错 Element with focus: inputAncestor with aria-hidden....

一、序言 浏览器版本影响的问题&#xff08;与代码无关&#xff0c;可能是web或浏览器相关协议更新导致&#xff09;&#xff0c;不影响功能的使用. 翻译&#xff1a;元素上的Blocked aria-hidden&#xff0c;因为刚刚接收焦点的元素不能对辅助技术用户隐藏。避免在焦点元素或…

DDR Study - LPDDR Initial

参考来源&#xff1a;JESD209-4B 在之前的DDR Study - Basic Understanding中介绍了DDR的基础概念&#xff0c;从这篇文章开始&#xff0c;会基于LPDDR4依次按照如下顺序对LPDDR内容进行简单分析&#xff1a; LPDDR Initial → LPDDR Write Leveling and DQ Training → LPDDR …

Teledyne LeCroy:800G高速以太网一站式自动化测试解决方案(网络打流测试+物理层加压干扰+协议分析)

LinkExpert一站式测试解决方案 LinkExpert 是一款软件应用程序&#xff0c;可对Teledyne LeCroy的协议分析仪和训练器进行自动化硬件控制和管理。除了作为合规性、一致性和验证测试的便捷接口外&#xff0c;它还能轻松地将这些测试添加到自动回归测试流程中。 现在&#xff0c;…

uniapp 获取签名证书 SHA1 自有证书签名打包

1.登录你的Dcloud 账户 2.找到我的应用菜单 3.点开某个应用 4.查看证书详情&#xff0c;里面有SHA1 和别名&#xff0c;密码&#xff0c;下载证书用于云打包&#xff0c;可以选择自有证书&#xff0c;输入别名&#xff0c;密码打包

读数据工程之道:设计和构建健壮的数据系统14源系统

1. 源系统中的数据生成 1.1. 数据工程师的工作是从源系统获取数据&#xff0c;对其进行处理&#xff0c;使其有助于为下游用例提供服务 1.2. 数据工程师的角色将在很大程度上转向理解数据源和目的地之间的相互作用 1.3. 数据工程的最基本的数据管道任务——将数据从A移动到B…

类型转换 与 explicit 关键字作用

例子1&#xff1a; 有时候&#xff0c;如果你不希望编译器帮你自动转换类型&#xff0c;就用关键字 explicit 。 class SampleClass1{ public:operator string() { return string();} };class SampleClass2{ public:explicit operator string() {return string();} };void …

Chrome谷歌浏览器加载ActiveX控件之JT2Go控件

背景 JT2Go是一款西门子公司出品的三维图形轻量化预览解决工具&#xff0c;包含精确3D测量、基本3D剖面、PMI显示和改进的选项过滤器等强大的功能。JT2Go控件是一个标准的ActiveX控件&#xff0c;曾经主要在IE浏览器使用&#xff0c;由于微软禁用IE浏览器&#xff0c;导致JT2Go…

操作系统:进程通信实践-同步又有互斥的信号量机制(详解)

目录 请设计进程既有同步又有互斥的应用场景&#xff0c;并尝试用信号量机制实现。可尝试用有名或无名信号量代码实现上述过程&#xff0c;并给出代码截图、调试过程和运行结果截图。当交换互斥和同步的P&#xff0c;V操作顺序时&#xff0c;程序运行结果是什么&#xff1f; …

【CTF-SHOW】Web入门 Web14 【editor泄露-详】【var/www/html目录-详】

editor泄露问题通常出现在涉及文件编辑器或脚本编辑器的题目中&#xff0c;尤其是在Web安全或Pwn&#xff08;系统漏洞挖掘&#xff09;类别中。editor泄露的本质是由于系统未能妥善处理临时文件、编辑历史或进程信息&#xff0c;导致攻击者可以通过某种途径获取正在编辑的敏感…

CABiNet:用于低延迟语义分割的高效上下文聚合网络

摘要 随着自主机器需求的不断增加&#xff0c;视觉场景理解的像素级语义分割不仅需要准确&#xff0c;而且需要高效&#xff0c;以满足任何潜在的实时应用需求。在本文中&#xff0c;我们提出了CABiNet&#xff08;Context Aggregated Bi-lateral Network&#xff0c;上下文聚…

力扣3191.使二进制数全变成1

给你一个二进制数组 nums 。 你可以对数组执行以下操作 任意 次&#xff08;也可以 0 次&#xff09;&#xff1a; 选择数组中 任意连续 3 个元素&#xff0c;并将它们 全部反转 。 反转 一个元素指的是将它的值从 0 变 1 &#xff0c;或者从 1 变 0 。 请你返回将 nums 中…

Unity Spine优化思路

最近终于闲下来了&#xff0c;于是开始把近期探索到的unity相关优化整理起来。 我们的项目采用的人物表现方式是spine动画&#xff0c;这在2D游戏里算比较常见的解决方案了&#xff0c;但是里面有一些设置需要提前注意一下&#xff0c;否则会造成不必要的性能浪费。 养成读官…