spring中存储和获取bean对象

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

1. 存储bean对象

存储 Bean 分为以下 2 步:

  1. 存储 Bean 之前,先得有 Bean 才⾏,因此先要创建⼀个 Bean, 说白了也就是写一个类。
  2. 告诉spring,把这个类的对象存起来。

1.1 使用配置文件存储bean对象

  1. 编写User类, 有sayHi方法。
public class User {
    public void sayHi() {
        System.out.println("你好");
    }
}
  1. 告诉spring,把这个类的对象存起来。
    在配置文件中可以通过<bean>标签来告诉spring把对象存起来。
<bean id="user1" class="demo.User"></bean>
  • id : 是用来标识一个对象的,就像我们的身份证一样。
    也称为bean对象的name(名字), 后面通过这个名字就能找到这个对象。
  • class:是带包的类名, 让spring知道我们要存的是哪一个类的对象。

完整的xml文件如下:
spring中存储和获取bean对象,JavaEE,spring,java

<?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">
    <bean id="user1" class="demo.User"></bean>
</beans>

注意:配置文件其他的标签不用管,直接复制粘贴,需要关注的是<bean>标签。


怎么知道Spring把对象存起来了呢?我们查找一下这个bean对象的name(名字) 就行了。
使用BeanFactory或者ClassPathXmlApplicationContext就能查找bean对象了。

BeanFactory的代码如下:
spring中存储和获取bean对象,JavaEE,spring,java

public class Test {
    public static void main(String[] args) {
        //创建BeanFactory的实现类的对象
        BeanFactory beanFactory =
                new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
                
        //根据名字查找bean对象
        User user1 = (User)beanFactory.getBean("user1");
        
        //调用sayHi()方法
        user1.sayHi();
    }
}

结果:

spring中存储和获取bean对象,JavaEE,spring,java

如何创建BeanFactory对象:

  • BeanFactory是一个接口,XmlBeanFactory是其中的一个实现类,因为我们用xml文件来告诉spring存储bean对象,所以用XmlBeanFactory这个类。
  • XmlBeanFactory 其中的一个构造器的参数类型是:Resource
    Resource也是一个接口, 所以还需要创建Resource接口的实现类。

使用ClassPathXmlApplicationContext上下文对象,查找bean对象。

public class Test {
    public static void main(String[] args) {
        test2();
    }

    public static void test2() {
        //创建上下文对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        //查找bean对象,第二个参数传了User的类型,得到bean对象后就无需转型了
        User user1 = context.getBean("user1", User.class);
        user1.sayHi();
    }
}

结果:
spring中存储和获取bean对象,JavaEE,spring,java

1.2 使用五大类注解存储bean对象

xml的形式来存储对象会比较麻烦,如果需要存很多个对象,就需要在xml配置文件中写多个<bean>标签。
这样子会很麻烦。所以spring提供了更加简便的方式来存储bean对象, 那就是使用注解。
下面介绍使用注解存储bean对象。

使用注解的方式,也要配置xml文件,不过只需要配置一个标签:<content:component-scan>
配置文件如下:

<?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="demo"></content:component-scan>
</beans>

说明:
<content:component-scan>这个标签用来配置包扫描路径, base-package="demo"配置的就是具体的包。
作用就是告诉spring在哪个包下扫描带有注解的类。spring扫描到带有注解的类就会为这个类创建对象。

<content:component-scan base-package="demo"></content:component-scan>

想要将对象存储在 Spring 中,有两种注解类型可以实现:

  1. 类注解:
    @Controller(控制器)、@Service(服务)、
    @Repository(仓库)、@Component(组件)、@Configuration(配置)。
  2. ⽅法注解:
    @Bean

1.2.1 类注解

  1. 使用@Controller类注解

在下面的代码中创建了ControllerTest类,有sayHello方法,类的上面有@Controller注解
有了这个@Controller注解,spring就能扫描到这个类,然后spring就会创建对象了。

@Controller
public class ControllerTest {
    public void sayHello() {
        System.out.println("hello, 正在测试@Controller注解");
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        test3();
    }

   public static void test3() {
        //创建上下文对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        //获取bean对象, 如果没有在注解上加参数,默认用类名的首字母小写获取bean对象
        ControllerTest controllerTest = context.getBean("controllerTest", ControllerTest.class);
        controllerTest.sayHello();
    }

结果:
spring中存储和获取bean对象,JavaEE,spring,java

注意:
如果在注解上没有指定bean对象的名字,将类名的首字母小写后作为bean对象的名字获取bean对象。
ControllerTest类名小写后是controllerTest,所以用controllerTest可以获取到bean对象。

也可以在注解上传参,指定bean对象的名字。

spring中存储和获取bean对象,JavaEE,spring,java

根据名字获取bean对象

spring中存储和获取bean对象,JavaEE,spring,java

  1. 使用@Service注解
    @Service注解跟@Controller的用法几乎一模一样。
@Service
public class ServiceTest {
    public void sayHello() {
        System.out.println("hello, 正在测试@Service注解");
    }
}
public class Test {
    public static void main(String[] args) {
        test4();
    }
    
    public static void test4() {
        //创建上下文对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        //获取bean对象, 如果没有在注解上加参数,默认用类名的首字母小写获取bean对象
        ServiceTest serviceTest = context.getBean("serviceTest", ServiceTest.class);
        serviceTest.sayHello();
    }
}

spring中存储和获取bean对象,JavaEE,spring,java
@Repository, @Component, @Configuarion注解用法跟上面的代码差不多,就不再演示了。

1.2.2 五大类注解的作用

因为后端程序是分层的,这五个类注解,分别就代表不同的层。
@Controller代表了业务逻辑层。
@Service代表了服务层。
@Repository代表了数据层。
@Configuration是配置层。
这些类注解功能是一样的,都是告诉spring存储bean对象。
但是当我们看到一个类上带了@Controller注解的时候,我们就清楚了,这个类处于 哪一层的,是干什么的。
spring中存储和获取bean对象,JavaEE,spring,java
这样做这样可以大大提高程序的可阅读性。

spring中存储和获取bean对象,JavaEE,spring,java

1.2.3 方法注解

@Bean方法注解用来将方法返回的对象存到spring中。

ControllerTest类中,写一个getObj方法,这个方法返回的ArrayList对象会存到spring

@Controller("con")
public class ControllerTest {
    public void sayHello() {
        System.out.println("hello, 正在测试@Controller注解");
    }

    @Bean(name = "list")
    public ArrayList<Integer> getObj() {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        return list;
    }
}

测试列:

public class Test {
    public static void main(String[] args) {
        test5();
    }
    
   public static void test5() {
        //创建上下文对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //根据name获取bean对象
        ArrayList<Integer> list = context.getBean("list", ArrayList.class);
        System.out.println(list.get(0));
    }
}

输出:

spring中存储和获取bean对象,JavaEE,spring,java

2.获取bean对象

获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,也可以叫对象注⼊。
对象注⼊的实现⽅法以下 3 种:

  1. 属性注⼊
  2. 构造⽅法注⼊
  3. Setter 注⼊

使用@Autowired或者@Resource注解实现spring中的bean对象注入。
这里用@Autowired注解进行演示。

2.1 属性注入

UserService

@Service
public class UserService {
    public void sayHi() {
        System.out.println("Hi");
    }
}

UserController

获取spring中的对象使用@Autowired注解,将UserService类的bean对象注入进来

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    public void sayHi() {
        userService.sayHi();
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        test6();
    }
    
	public static void test6() {
        //创建上下文对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //获取bean对象
        UserController userController = context.getBean("userController", UserController.class);
        userController.sayHi();
    }
}

spring中存储和获取bean对象,JavaEE,spring,java
输出了HiUserSevice类的bean对象成功被注入了。

2.2 构造器注入

@Autowired注解放在构造器的上面,加一个形参,就可以实现构造器注入了。

@Controller
public class UserController {
    private UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    public void sayHi() {
        userService.sayHi();
    }
}

2.3 getter注入

getter注入也一样,将@Autowired注解放在getter方法上即可。

@Controller
public class UserController {
    private UserService userService;

    public void sayHi() {
        userService.sayHi();
    }

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

2.4 注入对象的时候有spring中有多个bean对象怎么办

当注入对象的时候,spring中有多个对象的时候,就要告诉spring获取的是哪个bean对象。
但是@Autowired注解不能传入bean对象的名字,所以要用其他的方式来解决这个问题。

spring中存储和获取bean对象,JavaEE,spring,java

这时候有三种做法:

  1. 将类中属性的名字,改成和要注入的bean对象的名字一样
  2. @Autowired注解下面加@Qualifier注解
  3. 抛弃@Autowired注解, 使用@Resource注解

下面演示这三种不同处理方法:

2.4.1 将类中属性的名字,改成和要注入的bean对象的名字一样

Student类, 有idnameage属性, set方法和toString方法。

public class Student {
    private int id;
    private String name;
    private int age;
    
    public void setId(int id) {
        this.id = id;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public void setAge(int age) {
        this.age = age;
    }

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

StudentService类, 使用了方法注解@Bean将两个Student类的对象存到spring中。

@Service
public class StudentService {
    @Bean("stu1")
    public Student getStu1() {
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        student.setAge(22);
        return student;
    }

    @Bean("stu2")
    public Student getStu2() {
        Student student = new Student();
        student.setId(2);
        student.setName("李四");
        student.setAge(23);
        return student;
    }
}

StudentController类中,有属性stu1showStuInfo方法, 使用@Autowired将对象注入到属性上。

@Controller("stucon")
public class StudentController {
    @Autowired
    private Student stu1;

    public void showStuInfo() {
        System.out.println(stu1.toString());
    }
}

stu1属性名bean对象的名字一样。

spring中存储和获取bean对象,JavaEE,spring,java

spring中存储和获取bean对象,JavaEE,spring,java

测试类:

public class Test {
    public static void main(String[] args) {
        test7();
    }
    
	public static void test7() {
        //创建上下文对象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        
        StudentController studentController = context.getBean("stucon", StudentController.class);
        studentController.showStuInfo();
    }
}

输入出:

spring中存储和获取bean对象,JavaEE,spring,java

2.4.2 在 @Autowired注解下面加@Qualifier注解

@Qualifier注解的源码,使用注解的时候,可以传递value的值
spring中存储和获取bean对象,JavaEE,spring,java

@Qualifier注解的中加上bean对象的名字,spring就知道要注入哪一个bean对象了。

StudentController类如下。

@Controller("stucon")
public class StudentController {
    @Autowired
    @Qualifier("stu1")
    private Student stu;

    public void showStuInfo() {
        System.out.println(stu.toString());
    }
}

2.4.3 抛弃@Autowired注解, 使用@Resource注解

@Resource注解的部分源码。

spring中存储和获取bean对象,JavaEE,spring,java

在注解上传递一个参数即可,name = "stu1"就表示要注入名为stu1bean对象

@Controller("stucon")
public class StudentController {
    @Resource(name = "stu1")
    private Student stu;

    public void showStuInfo() {
        System.out.println(stu.toString());
    }
}

2. 5 @Autowired和@Resource注解的区别

  • 出身不同。@Autowired来自于spring,而@ResourceJDK自带的。
  • 传参不同。@Resource相比@Autowired,可以传递的参数更多。
  • @Autowired注解可以用于属性注入,构造方法注入,setter注入。
    @Resource注解只能用于属性注入和setter注入, 不同用于构造方法注入。
    因为@Autowried注解可以修饰属性,构造器,和方法,@Resource不能修饰构造器,但可以修饰属性和方法。

@Autowried注解部分源码

spring中存储和获取bean对象,JavaEE,spring,java

@Resource注解部分源码

spring中存储和获取bean对象,JavaEE,spring,java文章来源地址https://www.toymoban.com/news/detail-612659.html

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

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

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

相关文章

  • 【JavaEE进阶】 Spring使用注解存储对象

    在博主前面所写的《【JavaEE进阶】 Spring 的创建和使⽤》中我们已经可以实现基本的 Spring 读取和存储对象的操作了,但在操作的过程中我们发现读取和存储对象并没有想象中的那么“简单”,所以接下来我们要学习更加简单的操作 Bean 对象的⽅法。 在 Spring 中想要更简单的存

    2024年02月05日
    浏览(42)
  • 【Spring】使用注解读取和存储Bean对象

     哈喽,哈喽,大家好~ 我是你们的老朋友: 保护小周ღ    谈起Java 圈子里的框架,最年长最耀眼的莫过于 Spring 框架啦,本期给大家带来的是:  将对象存储到 Spring 中、Bean 对象的命名规则、从Spring 中获取bean 对象、注入的、@Autowired 与 @Resource 的区别、解决@Bean 方

    2024年02月13日
    浏览(45)
  • Spring中Bean对象的存储与读取

    在项目的 pom.xml 中添加 Spring 支持 如何选定版本环境:打开官网,点击github图标 jdk8最后一个Spring版本是5.3.x,Spring6.0.x最低需要jdk17 版本冲突问题Maven自己处理 version : 可以选择带有 RELEASE结尾或者纯数字结尾,这样的版本更稳定 项目下创建一个main方法的启动类 存储 Bean 之前

    2024年01月24日
    浏览(35)
  • Spring的存储与获取Bean

    关于 Spring 的创建及简单的使用 可以参考这篇文章 之前的存储方式是利用 bean id=\\\"\\\" class=\\\"\\\"/bean 进行存储 但这种方式存在一个弊端 即需要存储的 Bean 过多时, 手动添加过于繁琐 利用注解可以有效规避这种情况 添加注解存储 Bean 类注解 @Controller: 控制器存储 @Service: 服务存储 @

    2024年02月09日
    浏览(34)
  • 【Spring】(三)Spring 使用注解存储和读取 Bean对象

    前面的文章详细的介绍了 Spring 对象的创建,以及对 Bean 对象的存取操作,但是通过配置文件注册 Bean 对象以及使用 ApplicationContext 或 BeanFactory 的方式获取 Bean 对象的操作就显得格外的复杂。因此,本文主要就是详细介绍了一种更加简单的方式来实现对 Bean 对象更加简单的储

    2024年02月14日
    浏览(37)
  • Spring更简单的存储和读取Bean对象

    目录 1.第一个Spring项目 2.存储Bean对象 2.1 准备工作 2.2 五大类注解 2.3 方法注解@Bean 2.4 Bean对象的默认命名规则 3. 读取Bean对象 3.1 属性注入 3.2 setter注入 3.3 构造方法注入 3.4 注入异常问题 3.5 注入方式优缺点 3.6 @Autowired和@Resource的区别 在学习更简单的方式来读取和存储Bean对象

    2024年02月03日
    浏览(49)
  • 【JavaEE进阶】Spring 更简单的读取和存储对象

    配置扫描路径是使用注解之前的前置工作,是非常重要的,是必须的操作项.只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中. 首先创建一个Spring项目.创建好后,第一步就是配置扫描路径:在 resources 目录中创建一个 spring-config.xml 文件.然后在 spring-config.

    2024年02月12日
    浏览(42)
  • 从 Spring 的创建到 Bean 对象的存储、读取

    目录 创建 Spring 项目: 1.创建一个 Maven 项目:  2.添加 Spring 框架支持: 3.配置资源文件: 4.添加启动类: Bean 对象的使用: 1.存储 Bean 对象: 1.1 创建 Bean: 1.2 存储 Bean 到容器内: 2.获取 Bean 对象: 2.1 创建 Spring 上下文: 2.2 获取指定 Bean 对象: ApplicationContext 和 BeanFactor

    2024年02月06日
    浏览(40)
  • Spring - 更简单的获取 Bean 对象

    目录 二、获取 Bean 对象(对象装配或者对象注入) 1. 属性注入 1.1 属性注入的优点和缺点: 2. Setter注入  2.1 Setter注入的优点和缺点 3. 构造方法注入(spring 官方推荐的对象注入方式) 3.1 构造方法的优点和缺点 4. @Autowired 注解 和 @Resource 注解的区别 4.1 @Autowired 和 @Source 的区

    2024年02月16日
    浏览(35)
  • JavaEE 突击 5 - Spring 更简单的读取和存储对象(2)

    大家新年快乐 , 祝大家新的一年如图 这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架 JavaEE 进阶专栏 Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在 接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点 并且带领

    2024年02月19日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包