前言
上期我们讲解了Spring的创建与使用,发现将Bean 注册到容器这一步中,如果Bean对象过多,在注册到容器时,我们有几个Bean对象就需要几行注册,在实际开发中这是非常麻烦的,我们需要有更简单的方法去实现这一过程,这便是本篇文章的主题——Spring简单 读和取。
一、存储Bean对象[读]🍭
在Spring中我们可以使用注解存储和读取Bean对象,而其中我们有两种注解类型可以实现这个功能。
- 类注解:@Controller(控制器存储)、@Service(服务存储) 、@Repository(仓库存储)、@Component(组件存储)、@Configuration(配置存储)。
- 方法注解:@Bean。
1、配置扫描路径🍉
但是在使用注解去进行存储和读取Bean对象之前,我们还需要进行配置扫描路径。在spring-config.xml中添加如下配置:
"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.demo.component">content:component-scan> beans>
2、类注解🍉
Ⅰ、@Controller(控制器存储)🍓
ArticleController类:
package com.demo.component; import org.springframework.stereotype.Controller; @Controller// 将对象存储到 Spring 中 public class ArticleController { public String sayHi(){ return "Hello word"; } }
还是使用上篇讲的方法 去读取Bean对象:
import com.demo.component.ArticleController; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.ClassPathResource; public class App { public static void main(String[] args) { //1、获取spring对象 ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml"); //2、从Spring中取出Bean对象 ArticleController articleController=(ArticleController) context.getBean("articleController"); //3、使用Bean(可选) System.out.println(articleController.sayHi());//输出Hello word } }
Ⅱ、@Service(服务存储)🍓
ArticleController类:
package com.demo.component; import org.springframework.stereotype.Service; @Service// 将对象存储到 Spring 中 public class ArticleController { public String sayHi(){ return "Hello word"; } }
还是使用上篇讲的方法 去读取Bean对象:
import com.demo.component.ArticleController; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.ClassPathResource; public class App { public static void main(String[] args) { //1、获取spring对象 ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml"); //2、从Spring中取出Bean对象 ArticleController articleController=(ArticleController) context.getBean("articleController"); //3、使用Bean(可选) System.out.println(articleController.sayHi());//输出Hello word } }
Ⅲ、@Repository(仓库存储)🍓
ArticleController类:
package com.demo.component; import org.springframework.stereotype.Repository; @Repository// 将对象存储到 Spring 中 public class ArticleController { public String sayHi(){ return "Hello word"; } }
还是使用上篇讲的方法 去读取Bean对象:
import com.demo.component.ArticleController; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.ClassPathResource; public class App { public static void main(String[] args) { //1、获取spring对象 ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml"); //2、从Spring中取出Bean对象 ArticleController articleController=(ArticleController) context.getBean("articleController"); //3、使用Bean(可选) System.out.println(articleController.sayHi());//输出Hello word } }
Ⅳ、@Component(组件存储)🍓
ArticleController类:
package com.demo.component; import org.springframework.stereotype.Component; @Component// 将对象存储到 Spring 中 public class ArticleController { public String sayHi(){ return "Hello word"; } }
还是使用上篇讲的方法 去读取Bean对象:
import com.demo.component.ArticleController; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.ClassPathResource; public class App { public static void main(String[] args) { //1、获取spring对象 ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml"); //2、从Spring中取出Bean对象 ArticleController articleController=(ArticleController) context.getBean("articleController"); //3、使用Bean(可选) System.out.println(articleController.sayHi());//输出Hello word } }
Ⅴ、@Configuration(配置存储)🍓
package com.demo.component; import org.springframework.context.annotation.Configuration; @Configuration// 将对象存储到 Spring 中 public class ArticleController { public String sayHi(){ return "Hello word"; } }
还是使用上篇讲的方法 去读取Bean对象:
import com.demo.component.ArticleController; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.ClassPathResource; public class App { public static void main(String[] args) { //1、获取spring对象 ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml"); //2、从Spring中取出Bean对象 ArticleController articleController=(ArticleController) context.getBean("articleController"); //3、使用Bean(可选) System.out.println(articleController.sayHi());//输出Hello word } }
大家一路看下来,可能会吐槽一下:为什么全都是一样的代码啊?这有什么区别啊😂!
为什么有这么多类注解?🍓 Spring框架有很多类注解是为了让开发者以更简洁、方便的方式来定义各种不同类型的Bean(如控制器、服务、存储库等),并且能够更容易地使用Spring的各种功能(如事务管理、缓存、安全性等)。虽然Spring框架中的注解很多,但大多数都有特定的功能和用途,使得开发者可以根据需求选择合适的注解来使用,也可以让程序员看到类注解之后,就能直接了解当前类的用途,比如:
- @Controller(控制器):业务逻辑层,用来控制用户的行为,它用来检查用户参数的有效性。
- @Servie(服务): 服务层,调用持久化类实现相应的功能。[不直接和数据库交互的,它类似于控制中心]
- @Repository (仓库):持久层,是直接和数据库进行交互的。通常每一个表都会对应一个 @Repository。
- @Configuration(配置):配置层,是用来配置当前项目的一些信息。
- @Component (组件) : 公共工具类,提供某些公共方法。
程序的工程分层,调用流程如下:
五大类注解的联系🍓
直接看@Controller 、@Service 、@Repository 、@Configuration 等注解的源码:
@Service
@Repository
我们可以发现这些注解里面都有⼀个注解 @Component,说明它们是属于 @Component 的,是@Component的“子类”(其他源码也都类似,大家可以自行去查看查看他们的源码,理解更深刻哦!)。
3、Bean 的命名规则🍉
连续按两下 Shift 进行搜索或者通过下图方式去打开搜索框
在Classes中搜索 BeanName,打开我红色框选择的类
划到最下面:
我们就找到了Bean对象的命名方法,它使用的是 JDK Introspector 中的 decapitalize 方法,源码如下:
public static String decapitalize(String name) { if (name == null || name.length() == 0) { return name; } // 如果第⼀个字⺟和第⼆个字⺟都为⼤写的情况,是把 bean 的⾸字⺟也⼤写存储了 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); }
看源码,可以发现获取Bean时 ,Bean的命名只有两种:
- 首字母和第二个字母都非大写,首字母小写来获取 Bean,
- 首字母和第二个字母都是大写,那么直接使用原 Bean 名来获取
类名为:ArticleController
正确命名方法:
错误命名方法:
类名为:AController
正确命名方法:
错误命名方法:
【Spring】——Spring简单 读和取(二)https://developer.aliyun.com/article/1393151