Spring---Bean配置文件

上一章写的关于Spring的IOC容器,说了在IOC中配置一个组件就是配置一个Bean,IOC中包含了多个Bean对象,本章详细讲解关于Bean的原理知识

例子

工程结构图
在这里插入图片描述
MailService类,用于在用户登录和注册成功后发送邮件通知

public class MailService {
    private ZoneId zoneId = ZoneId.systemDefault();

    public void setZoneId(ZoneId zoneId) {
        this.zoneId = zoneId;
    }

    public String getTime() {
        return ZonedDateTime.now(this.zoneId).format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    }

    public void sendLoginMail(User user) {
        System.err.println(String.format("Hi, %s! You are logged in at %s", user.getName(), getTime()));
    }

    public void sendRegistrationMail(User user) {
        System.err.println(String.format("Welcome, %s!", user.getName()));

    }
}

UserService类,实现用户注册和登录。通过setMailService()注入了一个MailService

public class UserService {
    private MailService mailService;

    public void setMailService(MailService mailService) {
        this.mailService = mailService;
    }

    private List<User> users = new ArrayList<>(List.of( // users:
            new User(1, "bob@example.com", "password", "Bob"), // bob
            new User(2, "alice@example.com", "password", "Alice"), // alice
            new User(3, "tom@example.com", "password", "Tom"))); // tom

    public User login(String email, String password) {
        for (User user : users) {
            if (user.getEmail().equalsIgnoreCase(email) && user.getPassword().equals(password)) {
                mailService.sendLoginMail(user);
                return user;
            }
        }
        throw new RuntimeException("login failed.");
    }

    public User getUser(long id) {
        return this.users.stream().filter(user -> user.getId() == id).findFirst().orElseThrow();
    }

    public User register(String email, String password, String name) {
        users.forEach((user) -> {
            if (user.getEmail().equalsIgnoreCase(email)) {
                throw new RuntimeException("email exist.");
            }
        });
        User user = new User(users.stream().mapToLong(u -> u.getId()).max().getAsLong() + 1, email, password, name);
        users.add(user);
        mailService.sendRegistrationMail(user);
        return user;
    }
}

配置文件:application.xml配置文件,告诉Spring的IOC容器应该如何创建并组装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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置实例(id:“唯一标识”  class="需要被创建的目标对象全限定名") -->
    <bean id="userService" class="com.itranswarp.learnjava.service.UserService">
        <property name="mailService" ref="mailService" />
    </bean>

    <bean id="mailService" class="com.itranswarp.learnjava.service.MailService" />
</beans>

其实对于目前来说,我们所说的IOC就是将对象的创建权交给了Spring,由Spring代替我们去操作创建对象,不再由开发者进行操作,极大地降低了代码的耦合。
而由于Spring获取了对象的创建权和注入,Spring需要知道创建什么对象,并且注入到哪里,这时就需要通过配置文件来告诉Spring创建什么Bean,并且注入到哪里

配置文件

schema

配置文件中的顶级标签中包含了语义化标签的相关信息

xmlns:语义化标签所在的命名空间。
xmlns:xsi:XMLSchema-instance 标签遵循Schema标签标准。
xsi:schemaLocation:xsd文件位置,用以描述标签语义、属性、取值范围等。

application.xml配置文件中需要关注的是<beans …>的配置
1、每个<bean …>都有一个id标识,相当于Bean的唯一ID
2、通过注入了另一个Bean
3、Bean的顺序不重要,Spring根据依赖关系会自动正确初始化

在例子中的application.xml文件中的配置等同于下面的java代码

UserService userService = new UserService();
MailService mailService = new MailService();
userService.setMailService(mailService);

上述中注入的是引用类型的,如果注入的是基本类型,则是通过value注入

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test" />
    <property name="username" value="root" />
    <property name="password" value="password" />
    <property name="maximumPoolSize" value="10" />
    <property name="autoCommit" value="true" />
</bean>

当我们写完配置文件后我们需要加载配置文件,从而让Spring容器为我们创建并装配好配置文件中指定的所有Bean

IOC容器的创建

有三种创建IOC容器的方式
1、ClassPathXmlApplicationContext:从项目的根目录下加载配置文件

ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");

2、FileSystemXmlApplicationContext:从磁盘中的加载配置文件
3、AnnotationConfigApplicationContext:当使用注解配置容器对象时使用此类进行注解读取,创建容器。

Spring容器就是ApplicationContext,它是一个接口,有很多实现类。
获得ApplicationContext的实例,就获得了IoC容器的引用。从ApplicationContext中我们可以根据Bean的ID获取Bean,但更多的时候我们根据Bean的类型获取Bean的引用

Spring还提供另一种IoC容器叫BeanFactory,使用方式和ApplicationContext类似

BeanFactory factory = new XmlBeanFactory(new ClassPathResource("application.xml"));
MailService mailService = factory.getBean(MailService.class);

BeanFactory和ApplicationContext的区别在于,BeanFactory的实现是按需创建
即第一次获取Bean时才创建这个Bean,ApplicationContext会一次性创建所有的Bean

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 2.1.1 版本中,使用 spring-elasticsearch 时出现 "No qualifying bean" 错误通常是由于以下原因导致的: 1. 缺少必要的依赖:请确保您的项目中已经正确添加了 spring-elasticsearch 的依赖。在 Maven 或 Gradle 构建文件中检查依赖是否正确引入。 2. 没有正确配置 Elasticsearch 相关的属性:在您的应用程序配置文件(例如 application.properties 或 application.yml)中,确保已经配置了正确的 Elasticsearch 连接属性,例如主机名、端口号等。还要确保您的配置文件位于正确的位置,并且被正确加载。 3. 缺少对 ElasticsearchRepository 的实现类:请确保您的项目中存在一个继承自 ElasticsearchRepository 的接口,并且有一个具体的实现类。实现类需要添加 `@Repository` 注解,以便被 Spring 自动发现并注入。 4. 包扫描问题:如果您的实现类不在 Spring 扫描的包路径下,Spring 可能无法自动发现该类。请确保您的实现类在正确的包路径下,并且包扫描配置正确。 5. 版本兼容性问题:请确保您使用的 spring-elasticsearch 版本与 Spring Boot 2.1.1 兼容。有时候特定版本的库可能不兼容,建议查看官方文档或社区支持来确认版本兼容性。 请检查以上可能导致错误的原因,并逐一排除。如果问题仍然存在,请提供更多的错误信息、配置以及依赖信息,以便更详细地帮助您解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值