一文带你了解Spring中存入Bean和获取Bean的方式

这篇具有很好参考价值的文章主要介绍了一文带你了解Spring中存入Bean和获取Bean的方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0. Spring中的五大注解

一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java
上图中就是五大类注解对应的层,通过源码可以看到其他四个注解都基于@Conponent

1. 存入 Bean

Spring既然是一个包含众多工具方法的IoC容器,它是一个控制反转的容器,所以就需要将Bean对象存入到容器中,需要用的时候从容器中获取Bean对象,下面我们来介绍下存入Bean对象。

1.1 在 xml 中存入 Bean 对象

<?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:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

   // 这句代码中, id 就是给 这个要注入的对象取个名字, class就是 要存入的 Bean 的类型是哪一个
    <bean id = "user" class="com.java.demo.User"></bean>

</beans>

一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java

1.2 通过配置 Bean 扫描路径 + 类注解 实现 Bean 的存储

<?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:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 通过配置扫描路径 -->
    <content:component-scan base-package="com.java.demo"></content:component-scan>

</beans>

配置了 Bean 的扫描路径,只有当前目录下的类才会被扫描是否加了类注解,如果加了类注解后,就会将 所有加了类注解的类 存入到 IoC 容器中。

@Component
public class User {
    public void say(){
        System.out.println("Hello User...");
    }
}

类注解存Bean需要注意几点

  • 如果类名为大驼峰命名规则,那么获取 Bean 的默认名称,就是 类名首字母小写
  • 如果不满足首字母大写,第二个字母小写,那么 Bean 的名称,就是原类名,这点可以看源码知道
    一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java

1.3 通过配置 Bean 扫描路径 + 方法注解 实现 Bean 的存储

<?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:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 通过配置扫描路径 -->
    <content:component-scan base-package="com.java.demo"></content:component-scan>

</beans>
public class Student {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
@Component
public class User {

    @Bean
    public Student getStudent(){
        Student student = new Student();
        student.setName("张三");
        student.setAge(18);
        return student;
    }
    public void say(){
        System.out.println("Hello User...");
    }
}

在上述代码中,我们可以通过 在方法上 加上 @Bean 注解 将该方法存入到 IoC 容器中,并且可以直接获取到该对象。
一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java


在使用 @Bean 注解的时候,需要注意几点

  • @Bean 注解必须配合 五大类注解一块使用
  • @Bean 注解的默认命名 = 方法名称
  • 如果使用 @Bean(“xxxx”)方式,那么名称就是 xxxx, 并且 @Bean({“xxx”,“xxxxx”,“xxxxxx”}),里面可以类似和数组一样多个名称
  • 如果@Bean重命名后,那么默认的方法名就没用,获取Bean的时候就不能写默认方法名
  • 如果多个 Bean 使用相同的名称,则不会报错,只会存储第一个 Bean对象,之后相同名称的不会存入,会自动忽略

2. 获取 Bean

2.1 依赖查找(DF)

依赖查找(依赖Bean的名称),有两种方式,一种是 ApplicationContext, 一种是 BeanFactory。这两种都是容器管理对象,都可以获取到 Bean对象

2.11 ApplicationContext

public class App {
    public static void main(String[] args) {

        // 1. 获取 Spring 上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2。获取 Bean 对象
        Student student = (Student) context.getBean("student");
        System.out.println(student);
    }
}

2.12 BeanFactory

    public static void main(String[] args) {
        // 1. 得到 spring 上下文对象
        BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        // 2. 获取 Bean 对象
        //Student student = (Student)context.getBean("user");

        Student student = (Student)context.getBean("student");
        System.out.println(student.toString());
    }

2.13 Application VS BeanFactory

ApplicationContext BeanFactory
ApplicationContext是BeanFactory的子类,其拥有更多功能(国际化支持、资源访问支持、事件传播) BeanFactory是ApplicationContext的父类
ApplicationContext加载Bean:一次性加载所有Bean对象 BeanFactory加载Bean:懒加载,按需加载(使用一个加载一个)

一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java

2.2 依赖注入(DI)

在 spring 中实现依赖注入的常见方式有3种:

  • 1.属性注入
  • 2.setter注入
  • 3.构造方法注入

2.21 属性注入

@Controller
public class UserController {

    /**
     * 属性注入
     */
    @Autowired
    private UserService userService;

    // 此处 main方法里面,必须使用依赖查找的方式,先获取到UserController
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserController userController = (UserController) context.getBean("userController");
        userController.userService.say();
    }
}

属性注入:

优点: 实现简单、使用简单,只需要在属性上加一个注解@Autowired,就不需要自己new一个对象,直接获得注入的对象。

缺点:

  1. 无法注入一个用 final 修饰的对象一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java
    因为在Java语法中,final修饰的对象(不可变),要么一开始就赋值,要么在构造方法里面赋值。而上述使用属性注入,注入final修饰的对象,就不符合规范,所以不行。

  1. 只能适用于 IoC 容器:如果将这些代码放到其他非IoC容器中,那么代码就会失效
  2. 设计原则:更容易违背单一原则,因为属性注入比较简单,那么可能就会在一个类中注入多个对象,这就可能不符合程序的单一职责问题。

2.22 Setter注入

@Controller
public class UserController2 {

    private UserService userService;
    /**
     * setter注入
     */
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserController2 userController2 = (UserController2) context.getBean("userController2");
        userController2.userService.say();
    }

}

优点:似乎没什么优点,而且比属性注入更加麻烦,要说唯一可能有用的就是,完全符合单一职责设计原则,每个 setter 只针对一个对象。Setter注入 也适用于非IoC容器
缺点:

  1. 不能注入 final 对象
    一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java
  2. 由于是 Setter 注入,提供了 set 方法,那么注入的对象可以随时被更改

2.23 构造方法注入(Spring4.x之后推荐的)

@Controller
public class UserController3 {

    private final UserService userService;

    /**
     * 构造方法注入
     */
    
    // @Autowired 此处如果构造方法参数只有一个的时候,该注解可有可无
    public UserController3(UserService userService) {
        this.userService = userService;
    }

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserController3 userController3 = (UserController3) context.getBean("userController3");
        userController3.userService.say();
    }
}

优点:

  1. 可以注入 被final 修饰的对象一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java

  2. 注入对象不会被更改,因为是在构造方法注入的,构造方法在对象创建的时候只会创建一次

  3. 注入的对象会被完全初始化

  4. 通用性会更好,无论在 IoC容器 还是 非 IoC容器中都能用

缺点:

  1. 写法更加复杂
  2. 使用构造方法,无法解决循环依赖的问题

Spring官方推荐的是构造方法的注入,可以注入不可变对象,通用性更好;如果想要注入可变对象,那么可以使用 Setter 注入。

3. 解决同一类型多个 Bean 的报错问题

一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java
上述代码,可以看到报错,出现了多个同一类型的多个Bean报错,需要1个,找到了2个。如何解决呢

  • 1.@Autowired 配合 @Qualifier(value = “xxx”)一起使用,里面参数加方法名字一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java
  • 2.使用@Resource(name = “xxxx”)一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java

3. @Resource 和 @Autowired

  • 出身不同:@Resource来自于JDK,@Resource来自于Spring

  • 支持参数不同:@Resource支持更多的参数一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java
    @Autowired只支持一个参数设置

  • 使用上的区别:@Resource不支持构造方法的注入
    一文带你了解Spring中存入Bean和获取Bean的方式,SSM,spring,java

  • 兼容性问题:@Autowired在社区版 IDEA可能会误报;文章来源地址https://www.toymoban.com/news/detail-595250.html


到了这里,关于一文带你了解Spring中存入Bean和获取Bean的方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring的加载配置文件、容器和获取bean的方式

    🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 properties文件: jdbc.properties 1.开启context命名空间 2.使用context命名空间,加载指定properties文件 3.使用属性占位符 ${} 读取properties文件中的属性 properties文件

    2024年02月15日
    浏览(35)
  • 【JavaEE】Spring中注解的方式去获取Bean对象

    【JavaEE】Spring的开发要点总结(3) 在前面的代码里,我们获取Bean对象也比较麻烦: 本文章就是为了更方便地去获取Bean对象~ 对象装配 也叫 对象注入 那么有没有对应的注解去实现这个功能呢? Spring提供的三种实现方法: 属性注入 构造方法注入 Setter注入 而这种非明文获取

    2024年02月15日
    浏览(38)
  • Spring容器获取Bean的9种方式 | 京东云技术团队

    随着SpringBoot的普及,Spring的使用也越来越广,在某些场景下,我们无法通过注解或配置的形式直接获取到某个Bean。比如,在某一些工具类、设计模式实现中需要使用到Spring容器管理的Bean,此时就需要直接获取到对应的Bean。 本文为大家整理汇总了常见的获取Bean的方式,并提

    2024年02月12日
    浏览(36)
  • spring(1):基于XML获取Bean对象以及各种依赖注入方式

    1.1 根据id获取 1.2 根据类型获取 1.3 根据id和类型获取 注意: 当根据类型获取bean时,要求IOC容器中指定类型的bean有且只能有一个。 例如以下XML文件,当IOC容器中一共配置了两个,根据类型获取时会抛出异常。 根据类型来获取bean时,在满足bean唯一性的前提下,其实只是看:

    2024年01月25日
    浏览(44)
  • 【Spring学习】走进spring,spring的创建和使用,spring获取Bean的几种常见方式, ApplicationContext 和 BeanFactory的区别(重点面试)

    前言: 大家好,我是 良辰丫 ,我们在上一篇文章不是简单介绍了SpringBoot嘛,为什么不学习SpringBoot,而是要开始Spring呢?Spring是SpringBoot的前身,我们先学习以前的稍微复杂的框架,才能更好的学习SpringBoot.💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaEE进阶篇之框架学习 🍎励志

    2024年02月08日
    浏览(45)
  • 一文带你了解动态内存管理

    目录 动态内存存在的意义 动态内存函数的介绍 malloc和free calloc realloc 常见的动态内存错误 对NULL指针解引用操作 对动态开辟的空间的越界访问 对非动态开辟内存使用free释放 使用free释放一块动态开辟内存的一部分 对同一块内存多次释放 动态开辟内存忘记释放 经典的笔试题

    2024年02月16日
    浏览(43)
  • 一文带你了解React框架

    前言 由于 React的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。 这个项目本身也越滚越大,从最早的UI引擎变成了一整套前后端通吃的 Web App 解决方案。衍生的 React Nativ

    2024年02月01日
    浏览(48)
  • 一文带你了解MySQL之锁

    上一篇文章主要学习了事务并发执行时可能带来的各种问题,并发事务访问相同记录的情况我们大致可以划分为3种: 读-读 情况:即并发事务相继读取相同的记录,我们需要知道的是读取操作本身不会对记录有一毛钱影响,并不会引起什么问题,所以允许这种情况的发生。

    2024年02月08日
    浏览(48)
  • 【MySQL】一文带你了解过滤数据

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ 😁大家好呀,今天是我第N次写MySQL,也是最近才学习MySQL,也想着记录

    2024年02月09日
    浏览(49)
  • 【MySQL】一文带你了解检索数据

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ ------------------❤️分割线❤️------------------------- —————————

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包