高效使用Spring
文章目录
在初识Spring时,要使用Spring来存储对象,获取对象,步骤比较繁琐:
先创建Spring项目,再把类注册到Spring中,再获取对象并使用,总共三步,三步中又有很多小步。那其实我们是有方法可以更高效使用Spring的,具体点是更高效的注册类到Spring中,以及更高效的从Spring中获取对象。
1. 使用注解
为了更高效的存储对象,我们需要更改之前的存储方式,之前的方式是在spring-config.xml文件中添加一个节点标签,就把该类注册到Spring中了。每注册一个新的类就要在配置文件中添加一个节点标签,现在不需要修改配置文件了。使用注解可以高效的注册类到Spring中:
要将Bean存储到Spring中,Spring中的注解有两大类:
1️⃣类注解:@Controller @Service @Repository(仓库) @Component(组件) @Configuration(添加到类上)
2️⃣方法注解:@Bean(添加到方法上)
🔑比如使用类注解@Contoller添加到一个类上,该类就可以注册到Spring中了,但是仅仅有一个注解是不够的,还需要修改一下配置文件:
<?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="bit.com"></content:component-scan>
</beans>
🍎content标签中的base-package属性代表了该包下的根路径下的类和子包中的类都会被扫描,如果扫描到某个类是加了注解的,那就会将该类注册到Spring中。同理,如果某类加了注解,但是没有在该包下,是不能被注册到Spring中的。
要想注册一个类到Spring中,该类必须添加注解,并且在配置文件的base-package包中。
🍎那如果一个类并没有在配置文件的包中,而又需要注册到Spring中,其实还是可以用最初的方法,在配置文件中添加一个bean标签来添加Bean对象的:
☯️添加了注解并修改了配置文件后,如果需要从Spring中获取对象,该如何操作呢?
import bit.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//获取Spring上下文对象
ApplicationContext context = new
ClassPathXmlApplicationContext("spring-config.xml");
//获取对象
Hello hello = context.getBean("hello",Hello.class);
//使用对象
hello.sayHi();
}
}
♉️获取上下文对象和之前一样,获取对象不同了,之前在配置文件中存放节点标签的时候有id的,可以根据id来获取对象,但现在没有标签了,那也无关紧要,默认的id是类名的小驼峰形式。也就是说如果类名是HelloWorld,那么id就默认是helloWorld。如果类名是Hello,那id默认是hello。
五大类注解含义
@Controller @Service @Repository(仓库) @Component(组件) @Configuration
==以上五大注解的功能都是一样的,==那既然功能都是一样的,为啥要设五个呢,一个注解不就可以了?
- 其实这是方便程序员辨别所注解的类的用途的,五大注解各有各的含义:
- Controller:控制器:这是与前端直接交互的一层,验证前端传递的参数(url是否正确)
- Service:服务层:服务的编排和汇总:有多个服务需要去做,先调哪个服务,后调哪个服务。
- Repository:仓库:这是操作数据库的一层,代表该类是与数据库打交道的
- Component:组件:比如当前项目需要一个类来实现加密,一般就可以认为是组件,相当于工具
- Configuration:配置:当前项目需要的一些配置
所以之所以分为五大注解,是为了程序员更容易看到这个类知道这个类是做啥工作的。
五大类注解之间的关系
五大注解之间的关系:
🍎通过观察源码发现:Controller,Service,Repository,Configuration这几个注解从逻辑上来讲,他们是Component的子类。而且这四个类注解的源码也大致相似。这五大类注解都是将对象存到Spring中。
使用类注解存储Bean的命名规则
🔑一开始在spring-config.xml配置文件中使用的是bean标签中的id属性定义的bean的名称,后来使用了base-package后跟一个包名,来扫描这个包下需要添加到Spring中的对象,这时候bean的名称就默认是类名的首字母小写。那下面我们通过源码来具体分析一下bean名称的具体命名规则
✅如果类名的第一个和第二个字母都是大写,则Bean的名称就是类名,否则的话就将类名的第一个字母转为小写即为Bean名称。
✅通过分析源码发现,Introspector是jdk中的一个类,说明是Spring调用了Jdk中的方法
方法注解
类注解是使用在类上的,而方法注解是使用在方法上的。方法注解是@Bean。
1️⃣User类:
package bit.controller;
public class User {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2️⃣UserController类:
package bit.controller;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
@Bean
public User user1(){
User user = new User();
user.setAge(18);
user.setId(1