【Java】Spring更简单的读取和存储

简介: 【Java】Spring更简单的读取和存储

Spring更简单的读取和存储对象

我们现在已经可以实现基本的Spring读取和存储对象的操作了,但在操作过程当中。我们发现并没有那么简单。在Spring当中想要更简单的存储和使用对象的核心是使用注解接下了就了解下,如何使用注解来存储和获取Bean

1. 存储Bean对象

之前存储Bean对象,需要添加一行bean才能注册,如下图所示:

而现在只需要一个注解,就可以代替一行的配置,但是我们先要来点准备工作

1.1 前置工作:配置扫描路径

注意:想要把Bean成功的存储到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.example.beans"></content:component-scan>
</beans>

圈起来的是扫描路径,表示所有要存放到Spring中的Bean的根目录

1.2 添加注解存储Bean对象

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

  1. 类注解:@Controller @Service @Repository @Component @Configuration
  2. 方法注解:@Bean

接下来,分别来看:

1.2.1 @Controller(控制器存储)
@Controller
public class UserController {
    public void sayHi() {
        System.out.println("你好Controller");
    }
}

这时我们按照之前的方法获取到Spring中的Bean

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
UserController userController = context.getBean("userController", UserController.class);
userController.sayHi();
1.2.2 @Service(服务存储)
@Service
public class UserService {
    public void sayHi() {
        System.out.println("你好Service");
    }
}
1.2.3 @Repository(仓库存储)
@Repository
public class UserRepository {
    public void sayHi() {
        System.out.println("你好Repository");
    }
}
1.2.4 @Component(组件存储)
@Component
public class UserComponent {
    public void sayHi() {
        System.out.println("你好Component");
    }
}
1.2.5 @Configuration
@Configuration
public class UserConfiguration {
    public void sayHi() {
        System.out.println("你好Configuration");
    }
}

1.3 为什么要这么多类注解

既然功能都是一样的,为什么需要这么多呢?

这和为什么每个省/市都有自己的车牌号是一样的?比如陕西车牌号就是:陕XXXXXX,北京车牌号是:京XXXXXXXX。甚至一个省不同的县区车牌号都是不一样的。这样做的好处就是节约了号码,更重要的是可以直观的标识一辆车的归属地


那么为什么需要这么多类的注解也是相同的原因,就是让程序员看到类注解之后,就直接了解当前类的用途。


让代码的可读性提高,让程序员能够直观的判断当前类的用途

比如:

  • @Controller表示业务逻辑层
  • @Service表示服务层
  • @Repository表示持久层
  • @Configuration表示配置层

程序的工程分层,调用流程如下:

1.3.1 类注解之间的关系

查看@Controller、@Service、@Repository、@Configuration等注解可以发现:<img

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

1.3.2 Bean命名规则

通过场面的例子我们可以看出,通常我们bean使用的都是标准大驼峰的命名,而读取的时候首字母小写就可以获取到bean了。

然后当我们首字母和第二个字母都大写的时候,就不能正常的读取到Bean了

这个时候我们就要查询Spring关于Bean存储时生成的命名规则了

源码如下:

public static String decapitalize(String name) {
    if (name == null || name.length() == 0) {
        return name;
    }
    if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
        Character.isUpperCase(name.charAt(0))){
        return name;
    }
    char chars[] = name.toCharArray();
    chars[0] = Character.toLowerCase(chars[0]);
    return new String(chars);
}

1.4 方法注解

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

public class UserBean {
    @Bean
    public void sayHi() {
        System.out.println("你好bean");
    }
}

但是我们发现根本获取不到。这是为什么?

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

在Spring框架当中,方法注解@Bean要配合类注解才能将对象正常的存储到Spring容器当中,如下代码:

@Component
public class UserBean {
    @Bean
    public User getUser() {
        User user = new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}
1.4.2 重命名Bean

可以通过设置name属性给Bean对象进行重命名操作

@Component
public class UserBean {
    @Bean(name = "user")
    public User getUser() {
        User user = new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}

Bean命名规则:当没有设置name属性的时候,那么bean默认的名称就是方法名,当设置了name属性之后,只能通过重命名的那么属性对应的值来获取。也就是说,重命名之后再使用方法名就获取不到了

2. 获取Bean对象(对象装配)

获取bean对象也叫对象装配,是把对象取出来放到某个类当中,也时候也叫作对象注入

对象装配的实现有以下3中方法:

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

2.1 属性注入

2.2 构造方法注入

如果当前类当中只存在一个构造方法,那么@Autowired注解可以省略

2.3 Setter注入

2.4 三种注入的优缺点

  • 属性输入的优点是简介、使用方便;缺点是只能用于IOC容器,如果不是IOC容器不可用,并且只有在使用的时候才会出现NPE(空指针异常)
  • 构造方法注入是Spring推荐的注入方式。它的缺点是如果有多个注入会显得比较臃肿,但是出现这种情况应该考虑一下当前类是否符合程序的单一职责的设计模式了,它的有点在于通用性,在使用之前,一定能保证注入的类不为空
  • Setter方式是Spring前期版本推荐的注入方式,但是通用性不如构造方法,所有Spring版本已经推荐使用构造方法来注入了

2.5 @Resource:另一种注入关键字

@Autowired和@Resource的区别:

  • 出身不同:@Autowired 来自于Spring,而@Resource来自于JDK的注解
  • 使用时设置的参数不同:@Resource支持更多的参数设置,例如name设置,根据名称获取Bean
  • @Autowired可用于Setter注入、构造函数注入、属性注入,而@Resource只能用于Setter和属性注入,不用用于构造函数注入

2.6 同一个类型多个@Bean报错

解决方案有以下两种:

  • 使用@Resource(name=“user1”)定义
  • 使用@Qualifier注解定义名称
@Controller
public class UserController5 {
    // 注⼊
    @Autowired
    @Qualifier(value = "user2")
    private User user;
    public User getUser() {
        return user;
    }
}

3. 总结

  1. 将对象存储到Spring中:
  1. 使用类注解:@Controller、@Service、@Repository、@Configuration、@Component【它们之间的关系】
  2. 使用方法注解:@Bean【注意事项:必须配合类注解一起使用】
  1. Bean的命名规则:首字母和第二个字母都不是大写,首字母小写来获取Bean,如果首字母和第二个字母都是大写,那么直接使用Bean名来获取Bean
  2. 从Spring中获取对象
  1. 属性注入
  2. Setter注入
  3. 构造方法注入(推荐)
  1. 注入的关键字有
  1. @Autowired
  2. @Resource
  1. @Autowired 和 @Resource 区别:出身不同;使用是设置参数不同@Resource支持更多的参数设置
  2. 解决同一个类型多个Bean的报错
  3. 使用@Resource(name = “”)
  4. 使用@Qualifier(“”)
相关文章
|
1天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
2天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
3天前
|
安全 Java 数据安全/隐私保护
使用Spring Security进行Java身份验证与授权
【4月更文挑战第16天】Spring Security是Java应用的安全框架,提供认证和授权解决方案。通过添加相关依赖到`pom.xml`,然后配置`SecurityConfig`,如设置用户认证信息和URL访问规则,可以实现应用的安全保护。认证流程包括请求拦截、身份验证、响应生成和访问控制。授权则涉及访问决策管理器,如基于角色的投票。Spring Security为开发者构建安全应用提供了全面且灵活的工具,涵盖OAuth2、CSRF保护等功能。
|
4天前
|
Java 大数据 云计算
Spring框架:Java后台开发的核心
【4月更文挑战第15天】Spring框架在Java后台开发中占据核心位置,因其控制反转(IoC)、面向切面编程(AOP)、事务管理等特性提升效率和质量。Spring提供数据访问集成、RESTful Web服务和WebSocket支持。优势包括高效开发、灵活扩展、强大生态圈和广泛应用。应用于企业级应用、微服务架构及云计算大数据场景。掌握Spring对Java开发者至关重要。
|
7天前
|
Java 应用服务中间件 Maven
使用IDEA搭建SpringMVC环境,Maven导入了依赖,但是运行报错 java.lang.ClassNotFoundException
使用IDEA搭建SpringMVC环境,Maven导入了依赖,但是运行报错 java.lang.ClassNotFoundException
8 1
|
16天前
|
存储 安全 Java
Spring Security应用讲解(Java案列演示)
Spring Security应用讲解(Java案列演示)
|
16天前
|
前端开发 安全 Java
使用Java Web框架:Spring MVC的全面指南
【4月更文挑战第3天】Spring MVC是Spring框架的一部分,用于构建高效、模块化的Web应用。它基于MVC模式,支持多种视图技术。核心概念包括DispatcherServlet(前端控制器)、HandlerMapping(请求映射)、Controller(处理请求)、ViewResolver(视图解析)和ModelAndView(模型和视图容器)。开发流程涉及配置DispatcherServlet、定义Controller、创建View、处理数据、绑定模型和异常处理。
使用Java Web框架:Spring MVC的全面指南
|
17天前
|
XML Java 程序员
作为Java程序员还不知道Spring中Bean创建过程和作用?
作为Java程序员还不知道Spring中Bean创建过程和作用?
12 0
|
存储 Java 数据库连接
|
存储 SQL Java
JAVA中对存储过程的调用方法(引)
一:Java如何实现对存储过程的调用:   A:不带输出参数的   ---------------不带输出参数的----------------------------------create procedure getsum@n int =0asdeclare @sum intdeclare @i...
717 0