Spring: 通过注解存储Bean对象

目录

一, 配置扫描路径

二, 为什么要使用注解及其关系

三, 通过类注解存储Bean

四, 类注解存储Bean的命名规则

五, 通过方法注解存储Bean

六,  @Bean  重命名的几种方式


一, 配置扫描路径

我们在rescourse目录下创建Spring的配置文件 spring-config.xml ,粘贴以下代码

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

然后在base-package里设置存储对象的扫描路径, 只有在设置了扫描路径的包里,并添加了注解的对象才能被存储到Spring里

目录在java包里开始,比如此处是java包里的Spring.demo包

二, 为什么要使用注解及其关系

作用都是一样的: 将Bean对象存储到Spring中

但不同的代码的功能是不同的,通过注解我们可以直观的区分出这些代码的用途是什么

就像车牌号,看到粤开头就知道是广东省的,看到闽就知道是福建省的

                

类注解:

@Controller                控制器.        接收前端传递过来的数据,校验数据的合法性(相当于安检系统)

@Service                     服务        进行业务组装,判断实现某个业务的时候需要调用哪些方法(相当                                                     于咨询中心)

@Repository               数据持久层        负责具体业务的实现,直接和数据库打交道

@Component              组件        存放一些项目需要的组件

@Configuration           配置层        设置一些项目的配置

其余类注解都是基于@Component 实现的

三, 通过类注解存储Bean

类注解演示:  以 @Controller 为例:  

其他类注解用法相同,只需在类对象前加个注解即可,无需再在Spring配置文件上注入Bean,然后getBean()方法的第一个参数 填 类名的小写形式即可.

四, 类注解存储Bean的命名规则

1.指定命名

2.使用默认命名

  • 类名第一个字母为大写,第二个字母为小写 (标准的驼峰命名)

  • 前两个字母都为大写的情况

这种情况,就不能使用小写形式了,而是要用原类名才可

为什么会是这个样子,我们可以查看Spring源码

双击shift 进入类名搜索框

输入BeanName 找到  构造注解Bean名类

进去后找到构造Bean名方法,跳转进 buildDefaultBeanName

进去后发现返回的是 这个方法,再跳转进去

此处就是最低层的代码了

但移到第一行我们发现这个类是 java的包

点击左处的  定位标    可以发现是java jdk1.8里的方法

总结:

由此我们可以得出结论,Spring的类注解Bean命名规则是引用了java标准库中Bean的命名规则

五, 通过方法注解存储Bean

五大类注解是注解在类之前,而方法注解是注解在方法之前

使用方法注解时,必须搭配五大类注解之一

  

创建一个文章实体类:

package Spring.demo;
import javax.swing.*;
import java.time.LocalDateTime;

public class Article {
    String author;
    String text;
    LocalDateTime createTime;

    public void setAuthor(String author) {
        this.author = author;
    }

    public void setText(String text) {
        this.text = text;
    }

    public void setCreateTime(LocalDateTime createTime) {
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "Article{" +
                "author='" + author + '\'' +
                ", text='" + text + '\'' +
                ", createTime=" + createTime +
                '}';
    }
}

然后调用这个类的方法,此处使用了伪代码,实际开发中并不会这样写

方法上面加了 @Bean方法注解 ,   并且在类上面加了  类注解@Controller  

实现将这个方法注入到Spring中

package Spring.demo;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;

import java.time.LocalDateTime;

@Controller
public class ArticleSpring {

    @Bean
    public Article getArticle(){
        
        // 伪代码,实际开发不会这样写
        Article article = new Article();
        article.setAuthor("李大牛");
        article.setText("锄禾日当午,飞流直下三千尺");
        article.setCreateTime(LocalDateTime.now());
        return article;
    }
}

使用方法注解, 此时Bean对象的默认命名就是方法名

import Spring.demo.ArticleSpring;
import Spring.demo.Article;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        // 1.先得到 Spring 上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        // 2.得到bean对象   { 依赖查找  IoC的一种实现 }
        Article article = context.getBean("getArticle",Article.class);

        System.out.println(article);

    }
}

运行后成功获得结果

六,  @Bean  重命名的几种方式

在上一点中我们提到,使用@Bean方法注解的默认命名就是方法名

我们也可以指定命名:

例: 我们将Bean对象的名字指定为 "a33" 或 "a44" , 然后调用 "a44" 发现是可以成功读取到的

当我们对 Bean 对象重命名了之后,就无法再使用默认的方法名读取了

如果同一个类里,存在多个方法注解的名字相同,那么Spring会根据类加载顺序和类中代码从上至下的顺序注入第一个Bean,后面相同名字的@Bean 不会存放到Spring容器中

如果在不同的类中存在多个相同名字的Bean对象,我们可以通过 @order 来指定优先级,数值越大,越先将这个类的Bean对象注入

读取名字为 "a44" 的Bean , 得到的是  陈小猪

对调一下优先级,得到的就是李大牛了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值