3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解)

这篇具有很好参考价值的文章主要介绍了3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 存储 Bean 对象

1.1 配置扫描路径

1.2 添加注解存储 Bean 对象

1.2.1 @Controller(控制器存储)

1.2.2 @Service(服务存储)

1.2.3 @Repository(仓库存储)

1.2.4 @Component(组件存储)

1.2.5 @Configuration(配置存储)

1.3 使用多个类注解的原因

1.3.1 五大注解之间的关系

1.3.1 Bean 的命名规则

1.4 方法注解 @Bean

1.4.1 方法注解要配合类注解使用

1.4.2 重命名 Bean

1.4.3 给有参数的方法添加 Bean 注解 

1.4.4 Spring xml 配置的方式进行传参

2. 根据日志定位问题

NoSuchBeanDefinitionException -- 没有找到 Bean


3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

在 Spring 中想要更简单的存储和读取对象的核心是使用注解。

1. 存储 Bean 对象

之前我们存储 Bean 时,需要在 spring-config 中添加⼀行 bean 注册内容才行,如下图所示:

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

但是现在我们可以通过注解来代替上面的配置。

1.1 配置扫描路径

想要将对象成功的存储到 Spring 中,我们需要配置⼀下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 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="com.bit.service"></content:component-scan>
</beans>

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

也就是说,即使添加了注解,如果不是在配置的扫描包下的类对象,也是不能被存储到 Spring 中的。

1.2 添加注解存储 Bean 对象

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

1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration。

2. 方法注解:@Bean。

1.2.1 @Controller(控制器存储)

使用 @Controller 存储对象:

@Controller
public class UseController {
    public void sayHi(){
        System.out.println("hi,Controller...");
    }
}

接下来取对象:

public class App {
    public static void main(String[] args) {
        // 得到 Spring 上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 获取 Bean 对象
        UserController user = (UserController) context.getBean("userController");
        // 使用 Bean
        user.sayHi();
    }
}

可以发现在使用 getBean() 方法时,我们直接使用了注解下类名的小驼峰的形式,可以看到运行无误:

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

1.2.2 @Service(服务存储)

使用 @Service 存储对象:

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

 接下来取对象:

public class App {
    public static void main(String[] args) {
        // 得到 Spring 上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 获取 Bean 对象
        UserService userService = (UserService)context.getBean("userService");
        // 使用 Bean
        userService.sayHi();
    }
}
1.2.3 @Repository(仓库存储)

使用 @Repository 存储对象:

@Repository
public class UserRepository {
    public void sayHi(){
        System.out.println("Hi,Repository...");
    }
}

接下来取对象:

public class App {
    public static void main(String[] args) {
        // 得到 Spring 上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 获取 Bean 对象
        UserRepository userRepository = (UserRepository)context.getBean("userRepository");
        // 使用 Bean
        userRepository.sayHi();
    }
}
1.2.4 @Component(组件存储)

使用 @Component 存储对象:

@Component
public class UserComponent {
    public void sayHi(){
        System.out.println("Hi,Component...");
    }
}

 接下来取对象:

public class App {
    public static void main(String[] args) {
        // 得到 Spring 上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 获取 Bean 对象
        UserComponent userComponent = (UserComponent)context.getBean("userComponent");
        // 使用 Bean
        userComponent.sayHi();
    }
}
1.2.5 @Configuration(配置存储)

使用 @Configuration 存储对象: 

@Configuration
public class UserConfiguartion {
    public void sayHi(){
        System.out.println("Hi,Configuration...");
    }
}

 接下来取对象:

public class App {
    public static void main(String[] args) {
        // 得到 Spring 上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 获取 Bean 对象
        UserConfiguartion userConfiguartion = (UserConfiguartion)context.getBean("userConfiguartion");
        // 使用 Bean
        userConfiguartion.sayHi();
    }
}
1.3 使用多个类注解的原因

通过不同的类注解更加明确当前类的用途:

  • @Controller:表示的是业务逻辑层,控制器,通常是指程序的入口。比如参数校验、参数类型转换、前置处理工作等;
  • @Servie:服务层,一般写业务代码、服务编排、调用 DB、调用第三方接口等;
  • @Repository:持久层,仓库,通常是指 DB 操作相关的代码(Dao、mapper);
  • @Component:其他的对象;
  • @Configuration:配置层。
1.3.1 五大注解之间的关系

 查看 @Controller / @Service / @Repository / @Configuration 等注解的源码发现:

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

 这些注解里面都有⼀个注解 @Component,说明它们本身就是属于 @Component 的“子类”。

1.3.1 Bean 的命名规则

通过以上举例我们猜测:注解对应的 Bean 的名称是首字母小写。那么,真的如此吗?此时就需要我们去查看一下官方的文档。按住 CTRL + N 键进行搜索:

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

可以看到第四个是我们所需要的关于注解的,点进去后可以看到:

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

因此,我们得出结论:

当类名前两位均为大写时,需要返回自身类名;否则,返回首字母小写后的类名。

1.4 方法注解 @Bean
1.4.1 方法注解要配合类注解使用

类注解是添加到某个类上的,而方法注解是放到某个方法上的,如以下代码的实现:

public class Users {
    private String name;
    private Integer age;

    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public void setAge(Integer age){
        this.age = age;
    }
@Configuration
public class BeanConfig {
    @Bean
    public Users user(){
        Users user = new Users();
        user.setName("小明");
        user.setAge(18);
        return user;
    }
    public Users user2(){
        Users user = new Users();
        user.setName("小蓝");
        user.setAge(19);
        return user;
    }
}
public class App {
    public static void main(String[] args) {
        // 得到 Spring 上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 获取 Bean 对象
        Users users = (Users) context.getBean("user");
        // 使用 Bean
        System.out.println(users.getName());
    }
}

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

@Bean 无法直接单独使用,必须搭配五大类注解使用。

Bean 对应生成的 Bean 名称是方法名。

1.4.2 重命名 Bean
@Configuration
public class BeanConfig {
    @Bean("aaa")
    public Users user(){
        Users user = new Users();
        user.setName("小明");
        user.setAge(18);
        return user;
    }
    public Users user2(){
        Users user = new Users();
        user.setName("小蓝");
        user.setAge(19);
        return user;
    }
}
@Configuration
public class BeanConfig {
    @Bean(name={"aaa","user"})
    public Users user(){
        Users user = new Users();
        user.setName("小明");
        user.setAge(18);
        return user;
    }
    public Users user2(){
        Users user = new Users();
        user.setName("小蓝");
        user.setAge(19);
        return user;
    }
}
@Configuration
public class BeanConfig {
    @Bean({"aaa","user"})
    public Users user(){
        Users user = new Users();
        user.setName("小明");
        user.setAge(18);
        return user;
    }
    public Users user2(){
        Users user = new Users();
        user.setName("小蓝");
        user.setAge(19);
        return user;
    }
}

以上三种方法均可实现 Bean 的重命名,重命名之后则无法使用原来的方法名来获取 Bean

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

 对五大类注解同样可以使用以上重命名的方法。

1.4.3 给有参数的方法添加 Bean 注解 
@Configuration
public class BeanConfig {
    @Bean({"aaa","user"})
    public Users user(Integer age){
        Users user = new Users();
        user.setName("小明");
        user.setAge(age);
        return user;
    }
    public Users user2(){
        Users user = new Users();
        user.setName("小蓝");
        user.setAge(19);
        return user;
    }
}

直接运行上述代码会报错,因为并没有找到 age 这个对象:

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

 此时修改代码如下:

@Configuration
public class BeanConfig {
    @Bean
    public Integer age(){
        return 15;
    }
    @Bean({"aaa","user"})
    public Users user(Integer age){
        Users user = new Users();
        user.setName("小明");
        user.setAge(age);
        return user;
    }
    public Users user2(){
        Users user = new Users();
        user.setName("小蓝");
        user.setAge(19);
        return user;
    }
}

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

 将对象交给 Spring 管理后,会自动匹配对应的类型,还可以通过其他方式去读取(比如配置文件中)。当只有一个 @Bean 注解时,根据类型进行匹配;当有多个 @Bean 时,根据名称进行匹配。

1.4.4 Spring xml 配置的方式进行传参
public class BeanConfig {
    public Users user(String name){
        Users user = new Users();
        user.setName(name);
        user.setAge(12);
        return user;
    }
}
<bean id="user" class="springcore">
    <constructor-arg name="name" value="小明"></constructor-arg>
</bean>

当需要注入的是对象时,要写引用:

public class UserController {
    private UserService userService;
    public UserController(UserService userService){
        this.userService = userService;
    }
    public void sayHi(){
        System.out.println("hi,Controller...");
    }
}
<bean id="user" class="springcore">
    <constructor-arg name="userService" ref="userService"></constructor-arg>
</bean>

2. 根据日志定位问题

NoSuchBeanDefinitionException -- 没有找到 Bean

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userController' available

 没有名为“userController”的bean可用。

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

可以看到此时是因为注解被注释了,不再生效的原因。

出现以上日志时还有另一种可能原因,如下图所示:

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

也就是说当我们的扫描路径与实际不符时,同样会出现找不到 Bean 的情况。

除了以上两种情况当我们通过注解获取 Bean 时,类名不符合要求同样会生成以上的日志,具体如下图所示:

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

还有一种情况是因为将注解重命名了,但是使用的依然时未重命名之前的注解,同样会生成以上日志:

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.Integer' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 

没有可用的“java.lang.Integer”类型的限定bean。

3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解),java ee,spring,java,后端文章来源地址https://www.toymoban.com/news/detail-610780.html

到了这里,关于3. Spring 更简单的读取和存储对象(五大类注解 & 方法注解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Spring使用注解存储和读取对象

    之前我们存储Bean时,需要在spring-config.xml中添加bean注册才行,这样的方式并不简单。我们要想 更简单的存储和读取对象的核心是使用注解 1.使用类注解(五大类注解): @Controller:控制器,验证用户请求的数据正确性(安保系统) @Service:服务层,编排和调度具体执行方法的(客服

    2023年04月19日
    浏览(45)
  • 【Spring】使用注解读取和存储Bean对象

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

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

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

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

    在 Spring 中要想更简单的存储和读取对象 , 核心是 使用注解 , 所以我们需要通过 Spring 中相关注解 , 来存储和读取 Bean 对象. 之前我们存储 Bean 时 , 需要在 spring-config.xml 中添加一行注释才行: 而现在我们只需一个注解就可以替代之前要写一行配置 , 不过在存储对象之前 , 我们先

    2024年02月02日
    浏览(40)
  • 5-Spring更简单的读取和存储对象

    目录 1.存储Bean对象 1.1.前置工作:在配置文件中设置bean扫描的根路径(重要) 1.2.添加注解存储Bean对象到Spring中 1.2.1.类注解(添加到某个类上,将当前的类存储到Spring中):@Controller,@Service,@Repository,@Component,@Configuration 关于类注解的bean的命名规则: PS:为什么要这么多类

    2023年04月25日
    浏览(41)
  • Spring系列3 -- 更简单的读取和存储对象

             上一篇章总结了,Spring的创建与使用,通过创建Maven项目配置Spring的环境依赖,创建Spring框架的项目,然后通过在Resource目录下创建Spring-config.xml配置文件,添加bean/bean标签将我们需要的bean对象注入到容器中,然后通过ApplicationContext获取Spring上下文,使用getBean()方法获取be

    2024年02月13日
    浏览(36)
  • 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日
    浏览(50)
  • 【JavaEE进阶】Spring 更简单的读取和存储对象

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

    2024年02月12日
    浏览(43)
  • 【Spring框架全系列】Spring更简单的读取和存储对象

    📬📬哈喽,大家好,我是小浪。上篇博客我们介绍了如何创建一个spring项目,并且如何的存、取对象,介绍了相关方法,那么本篇博客将接着上篇博客的内容介绍如何更加简单的读取和存储对象。 🌃在 Spring 中想要更简单的存储和读取对象的核⼼是使⽤注解,也就是我们接

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

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

    2024年02月19日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包