ToB企服应用市场:ToB评测及商务社交产业平台

标题: Spring 存与取的优化 [打印本页]

作者: 愛在花開的季節    时间: 2022-6-24 22:45
标题: Spring 存与取的优化
文章目录



一、前言

通过之前的Spring初识这一节,从初始者的角度实现Spring的存与取,但是所需要的步骤是比较多的,比较臃肿,冗余
指路——>初识 Spring 容器

因此需要学习更加简单的Bean对象的存与取。在Spring中想要更加简单的存储和读取对象的核心就是使用注解。在之后的学习中,注解将会给写代码带来极大的便利。
二、存储Bean对象

2.1 前置工作

想要将 Bean对象更加简单的存储到 Spring 中,前置工作就是在 Spring 的配置文件(就是名字是自己起的 xml 配置文件)中设置组件 Component 的根路径
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>
复制代码
代码如上(建议使用时直接复制粘贴)
在之前的较为复杂的存储 Bean 对象时,就是在该配置文件中进行 Bean 对象的声明,现在不需要写的那么复杂,只需要配置上需要进行扫描的根路径即可,base-package 中的内容就是回头我们需要扫描的路径(每个人写的都可以不一样)。
如果想要将某类对象,或者方法的返回值存储到 Spring容器中,只需要添加上相应的注解,并且将其放在扫描路径下,Spring就可以自动的将对象进行存储。
至于为什么需要指定扫描路径,那是因为一个规模较大的项目中将会有太多太多的包、类型、方法,如果统统进行扫描,效率将会非常的低下

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

2.2 类注解

2.2.1 @Controller

@Controller,发音 [kənˈtrəʊlə®],控制器存储
使用方法:
步骤一:需要被存储的对象
  1. @Controllerpublic class ArtController {    public void func() {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>System.out.println("Hello Controller~");    }}
复制代码
需要注意的事:该类必须要放在扫描路径底下;必须要加上注解 @Controller
步骤二:用之前的方式读取到上面的 ArtController 对象验证出存储的成功
  1. public class Start {    public static void main(String[] args) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>//1.获取 Spring 上下文<?xml version="1.0" encoding="UTF-8"?>
  9. <beans xmlns="http://www.springframework.org/schema/beans"
  10.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  11.        xmlns:content="http://www.springframework.org/schema/context"
  12.        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">
  13.    
  14.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  15. </beans>ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");<?xml version="1.0" encoding="UTF-8"?>
  16. <beans xmlns="http://www.springframework.org/schema/beans"
  17.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  18.        xmlns:content="http://www.springframework.org/schema/context"
  19.        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">
  20.    
  21.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  22. </beans>//2.获取 Bean 对象<?xml version="1.0" encoding="UTF-8"?>
  23. <beans xmlns="http://www.springframework.org/schema/beans"
  24.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  25.        xmlns:content="http://www.springframework.org/schema/context"
  26.        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">
  27.    
  28.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  29. </beans>ArtController artController = context.getBean("artController", ArtController.class);<?xml version="1.0" encoding="UTF-8"?>
  30. <beans xmlns="http://www.springframework.org/schema/beans"
  31.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  32.        xmlns:content="http://www.springframework.org/schema/context"
  33.        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">
  34.    
  35.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  36. </beans>//3.使用 Bean 对象<?xml version="1.0" encoding="UTF-8"?>
  37. <beans xmlns="http://www.springframework.org/schema/beans"
  38.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  39.        xmlns:content="http://www.springframework.org/schema/context"
  40.        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">
  41.    
  42.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  43. </beans>artController.func();;    }}
复制代码
需要注意的事:在这里的 beanName 是类名 ArtController 的第一个字母小写得来的(一般情况下)
结果:

2.2.2 @Service

@Service,发音 [ˈsɜːvɪs],服务存储
使用方法:
步骤一:需要被存储的对象
  1. @Servicepublic class ArtService {    public void func2() {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>System.out.println("Hello Service~~");    }}
复制代码
需要注意的事:该类必须要放在扫描路径底下;必须要加上注解 @Service
步骤二:用之前的方式读取到上面的 ArtService 对象验证出存储的成功
  1. ArtService artService = context.getBean("artService", ArtService.class);
  2. artService.func2();
复制代码
需要注意的事:在这里的 beanName 是类名 ArtService 的第一个字母小写得来的(一般情况下)
结果:

2.2.3 @Repository

@Repository,发音 [rɪˈpɒzətri],仓库存储
使用方法:
步骤一:需要被存储的对象
  1. @Repositorypublic class ArtRepository {    public void func3() {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>System.out.println("hello Repository!");    }}
复制代码
需要注意的事:该类必须要放在扫描路径底下;必须要加上注解 @Repository
步骤二:用之前的方式读取到上面的 ArtRepository 对象验证出存储的成功
  1. ArtRepository artRepository = context.getBean("artRepository", ArtRepository.class);
  2. artRepository.func3();
复制代码
需要注意的事:在这里的 beanName 是类名 ArtRepository的第一个字母小写得来的(一般情况下)
结果:

2.2.4 @Component

@Component,发音 [kəmˈpəʊnənt],组件存储
使用方法:
步骤一:需要被存储的对象
  1. @Componentpublic class ArtComponent {    public void func4() {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>System.out.println("hello Component!!");    }}
复制代码
需要注意的事:该类必须要放在扫描路径底下;必须要加上注解 @Component
步骤二:用之前的方式读取到上面的 ArtComponent 对象验证出存储的成功
  1. ArtComponent artComponent = context.getBean("artComponent", ArtComponent.class);
  2. artComponent.func4();
复制代码
需要注意的事:在这里的 beanName 是类名 ArtComponent 的第一个字母小写得来的(一般情况下)
结果:

2.2.5 @Configuration

@Configuration,发音 [kənˌfɪɡəˈreɪʃn],配置存储
使用方法:
步骤一:需要被存储的对象
  1. @Configurationpublic class ArtConfiguration {    public void func5() {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>System.out.println("Hello Configuration!~");    }}
复制代码
需要注意的事:该类必须要放在扫描路径底下;必须要加上注解 @Configuration
步骤二:用之前的方式读取到上面的 ArtConfiguration 对象验证出存储的成功
  1. ArtConfiguration artConfiguration = context.getBean("artConfiguration",                         <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>ArtConfiguration.class);artConfiguration.func5();
复制代码
需要注意的事:在这里的 beanName 是类名 ArtConfiguration 的第一个字母小写得来的(一般情况下)
结果:

2.2.6 五大注解的区别和关系

写到这,可能就会有疑问了,上面五种注解有什么区别,用法、作用不是一模一样嘛,直接都使用其中的一个不就行了,为啥要五种
事实上,虽然用法一样,但是上面的五种类注解指向了五种不同的类的用途,让别人一看见这个注解就知道这个类实现的都是些什么功能,就相当于车牌号,我们可以通过看车牌就可以知道车辆的归属地(京XXX——北京来的,浙XXX——浙江来的)
区别


关系
通过 Ctrl + 左键 点击对应的注释,发现 Controller、Repository、Service和 Configuration注解,都实现了 Component 注解的功能,它们都算是 Component 的 “子类”

2.2.7 Bean 的命名

通过上面的例子,我们发现 beanName 是类的第一个字母小写,但如果类的名字第一个和第二个字母都是大写,再用相同的方法,就会报错,说没有这样的 beanName
查看原码:
  1. public static String decapitalize(String name) {    if (name == null || name.length() == 0) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>return name;    }    //长度大于1 且 第一个字母和第二个字母是大写    if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&<?xml version="1.0" encoding="UTF-8"?>
  9. <beans xmlns="http://www.springframework.org/schema/beans"
  10.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  11.        xmlns:content="http://www.springframework.org/schema/context"
  12.        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">
  13.    
  14.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  15. </beans>Character.isUpperCase(name.charAt(0))){<?xml version="1.0" encoding="UTF-8"?>
  16. <beans xmlns="http://www.springframework.org/schema/beans"
  17.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  18.        xmlns:content="http://www.springframework.org/schema/context"
  19.        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">
  20.    
  21.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  22. </beans>return name;    }    char chars[] = name.toCharArray();    chars[0] = Character.toLowerCase(chars[0]);//将首字母小写    return new String(chars);}
复制代码
通过查看原码,发现如果第一个字母和第二个字母都为大写,beanName 就是原来的类名,否则就将 beanName 就将首字母小写
2.3 方法注解

2.3.1 @Bean

方法注解是放在某个方法上,将方法返回的值存储到 Spring 容器中。
并且需要配合类注解进行使用,因为扫描路径下的类中也许会有很多很多的方法,如果只扫描有类注解的类中的方法,会提高效率
使用方法:
步骤一:需要被存储的方法返回值对象
  1. @Componentpublic class ArtComponent {    @Bean    public Article func() {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>Article article = new Article();<?xml version="1.0" encoding="UTF-8"?>
  9. <beans xmlns="http://www.springframework.org/schema/beans"
  10.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  11.        xmlns:content="http://www.springframework.org/schema/context"
  12.        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">
  13.    
  14.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  15. </beans>article.setId(1);<?xml version="1.0" encoding="UTF-8"?>
  16. <beans xmlns="http://www.springframework.org/schema/beans"
  17.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  18.        xmlns:content="http://www.springframework.org/schema/context"
  19.        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">
  20.    
  21.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  22. </beans>article.setName("人与自然");<?xml version="1.0" encoding="UTF-8"?>
  23. <beans xmlns="http://www.springframework.org/schema/beans"
  24.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  25.        xmlns:content="http://www.springframework.org/schema/context"
  26.        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">
  27.    
  28.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  29. </beans>article.setContent("内容介绍");<?xml version="1.0" encoding="UTF-8"?>
  30. <beans xmlns="http://www.springframework.org/schema/beans"
  31.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  32.        xmlns:content="http://www.springframework.org/schema/context"
  33.        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">
  34.    
  35.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  36. </beans>return article;    }}
复制代码
步骤二:获取到存储的Bean对象
  1. public class Start {    public static void main(String[] args) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");<?xml version="1.0" encoding="UTF-8"?>
  9. <beans xmlns="http://www.springframework.org/schema/beans"
  10.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  11.        xmlns:content="http://www.springframework.org/schema/context"
  12.        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">
  13.    
  14.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  15. </beans>Article article = context.getBean("addArticle",Article.class);<?xml version="1.0" encoding="UTF-8"?>
  16. <beans xmlns="http://www.springframework.org/schema/beans"
  17.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  18.        xmlns:content="http://www.springframework.org/schema/context"
  19.        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">
  20.    
  21.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  22. </beans>System.out.println(article);    }}
复制代码
结果:

2.3.2 Bean 的重命名

在此之前使用方法注解的 beanName 是方法名,但是有些方法名带有一定的功能属性,比如上面的 addArticle ,这样的名字显得有点不合适,因此可以给 Bean 对象进行重命名操作
  1. @Bean(name = "article") //重命名了一个名字,name = 可以省略
  2. @Bean(name = {"article","article2"}) //重命名多个名字,name = 可以省略
复制代码
注意

三、获取Bean对象

获取对象,就是将对象取出来放到某个类中,也叫对象注入,就是在前一节讲到的DI
在此之前,获取对象的方式是先获取 Spring 上下文,再获取 Bean 对象,最后再使用 Bean 对象。
如果依赖关系非常多的时候,A依赖于B,B依赖于C,C依赖于D,用上面的方法进行获取对象将会变得非常的麻烦,需要用更加简洁的方式进行对象的注入
对象的方法

下面将模拟将 Service 类注入到 Controller 类中,三种方式的使用方法
3.1 属性注入

属性注入是三种注入方式中最简单的注入方式,使用注解 @Autowired 实现
步骤一:创建 Service 类
  1. @Servicepublic class ArtService {    public Article func(int id) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>//伪代码 通过数据库查询用户信息<?xml version="1.0" encoding="UTF-8"?>
  9. <beans xmlns="http://www.springframework.org/schema/beans"
  10.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  11.        xmlns:content="http://www.springframework.org/schema/context"
  12.        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">
  13.    
  14.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  15. </beans>//。。。<?xml version="1.0" encoding="UTF-8"?>
  16. <beans xmlns="http://www.springframework.org/schema/beans"
  17.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  18.        xmlns:content="http://www.springframework.org/schema/context"
  19.        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">
  20.    
  21.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  22. </beans>Article article = new Article();<?xml version="1.0" encoding="UTF-8"?>
  23. <beans xmlns="http://www.springframework.org/schema/beans"
  24.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  25.        xmlns:content="http://www.springframework.org/schema/context"
  26.        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">
  27.    
  28.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  29. </beans>article.setId(id);<?xml version="1.0" encoding="UTF-8"?>
  30. <beans xmlns="http://www.springframework.org/schema/beans"
  31.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  32.        xmlns:content="http://www.springframework.org/schema/context"
  33.        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">
  34.    
  35.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  36. </beans>article.setName("三国演义");<?xml version="1.0" encoding="UTF-8"?>
  37. <beans xmlns="http://www.springframework.org/schema/beans"
  38.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  39.        xmlns:content="http://www.springframework.org/schema/context"
  40.        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">
  41.    
  42.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  43. </beans>article.setContent("三国内容简介");<?xml version="1.0" encoding="UTF-8"?>
  44. <beans xmlns="http://www.springframework.org/schema/beans"
  45.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  46.        xmlns:content="http://www.springframework.org/schema/context"
  47.        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">
  48.    
  49.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  50. </beans>return article;    }}
复制代码
步骤二:创建 Controller 类,依赖于 Service 类
  1. @Controllerpublic class ArtController {    //属性注入    @Autowired    private ArtService artService;    public Article findArticle(int id) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>return artService.func(id);    } }
复制代码
步骤三:获取 Controller 类
  1. public class Start {    public static void main(String[] args) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");<?xml version="1.0" encoding="UTF-8"?>
  9. <beans xmlns="http://www.springframework.org/schema/beans"
  10.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  11.        xmlns:content="http://www.springframework.org/schema/context"
  12.        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">
  13.    
  14.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  15. </beans>ArtController artController = context.getBean("artController",ArtController.class);<?xml version="1.0" encoding="UTF-8"?>
  16. <beans xmlns="http://www.springframework.org/schema/beans"
  17.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  18.        xmlns:content="http://www.springframework.org/schema/context"
  19.        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">
  20.    
  21.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  22. </beans>System.out.println(artController.findArticle(1));    }}
复制代码
结果:

补充
在注入 Service 类时,会先进行类型的查询,如果在 Spring 中查询到同类型的对象就直接返回,否则使用类名称进行查询,都没有结果,说明注入失败
3.2 构造方法注入

需要在构造方法上加 @Autowired
  1. @Controllerpublic class ArtController {    //构造方法注入    private ArtService artService;    @Autowired    public ArtController(ArtService artService) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>this.artService = artService;    }    public Article findArticle(int id) {<?xml version="1.0" encoding="UTF-8"?>
  9. <beans xmlns="http://www.springframework.org/schema/beans"
  10.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  11.        xmlns:content="http://www.springframework.org/schema/context"
  12.        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">
  13.    
  14.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  15. </beans>return artService.func(id);    } }
复制代码
补充
当类中只有一个构造方法时,@Autowired 可以省略,在有多个构造函数的时候,不可以省略
3.3 Setter 注入

设置 set 方法的时候需要加上@Autowired注解
  1. @Controllerpublic class ArtController {    //Setter 注入    private ArtService artService;    @Autowired    public void setArtService(ArtService artService) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>this.artService = artService;    }<?xml version="1.0" encoding="UTF-8"?>
  9. <beans xmlns="http://www.springframework.org/schema/beans"
  10.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  11.        xmlns:content="http://www.springframework.org/schema/context"
  12.        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">
  13.    
  14.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  15. </beans>public Article findArticle(int id) {<?xml version="1.0" encoding="UTF-8"?>
  16. <beans xmlns="http://www.springframework.org/schema/beans"
  17.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  18.        xmlns:content="http://www.springframework.org/schema/context"
  19.        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">
  20.    
  21.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  22. </beans>return artService.func(id);    } }
复制代码
补充
@Autowired 注释不可以被省略
3.4 三种注入方式的优缺点分析

     3.5 @Resource 注解

在注入时,除了 @Autowired 关键字外,还可以使用 @Resource 注解进行注入,拿属性注入举例
  1. @Resource
  2. private ArtService artService;
复制代码
3.5.1 @Resource 和@Autowired 的区别

     3.5.2 对象被多个 Spring注入多个

  1. @Componentpublic class ArtComponent {    @Bean(name = "article1")    public Article func1() {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>Article article = new Article();<?xml version="1.0" encoding="UTF-8"?>
  9. <beans xmlns="http://www.springframework.org/schema/beans"
  10.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  11.        xmlns:content="http://www.springframework.org/schema/context"
  12.        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">
  13.    
  14.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  15. </beans>article.setId(1);<?xml version="1.0" encoding="UTF-8"?>
  16. <beans xmlns="http://www.springframework.org/schema/beans"
  17.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  18.        xmlns:content="http://www.springframework.org/schema/context"
  19.        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">
  20.    
  21.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  22. </beans>article.setName("水浒传");<?xml version="1.0" encoding="UTF-8"?>
  23. <beans xmlns="http://www.springframework.org/schema/beans"
  24.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  25.        xmlns:content="http://www.springframework.org/schema/context"
  26.        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">
  27.    
  28.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  29. </beans>article.setContent("水浒传内容");<?xml version="1.0" encoding="UTF-8"?>
  30. <beans xmlns="http://www.springframework.org/schema/beans"
  31.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  32.        xmlns:content="http://www.springframework.org/schema/context"
  33.        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">
  34.    
  35.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  36. </beans>return article;    }    @Bean(name = "article2")    public Article func2() {<?xml version="1.0" encoding="UTF-8"?>
  37. <beans xmlns="http://www.springframework.org/schema/beans"
  38.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  39.        xmlns:content="http://www.springframework.org/schema/context"
  40.        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">
  41.    
  42.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  43. </beans>Article article = new Article();<?xml version="1.0" encoding="UTF-8"?>
  44. <beans xmlns="http://www.springframework.org/schema/beans"
  45.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  46.        xmlns:content="http://www.springframework.org/schema/context"
  47.        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">
  48.    
  49.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  50. </beans>article.setId(1);<?xml version="1.0" encoding="UTF-8"?>
  51. <beans xmlns="http://www.springframework.org/schema/beans"
  52.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  53.        xmlns:content="http://www.springframework.org/schema/context"
  54.        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">
  55.    
  56.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  57. </beans>article.setName("红楼梦");<?xml version="1.0" encoding="UTF-8"?>
  58. <beans xmlns="http://www.springframework.org/schema/beans"
  59.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  60.        xmlns:content="http://www.springframework.org/schema/context"
  61.        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">
  62.    
  63.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  64. </beans>article.setContent("红楼梦内容");<?xml version="1.0" encoding="UTF-8"?>
  65. <beans xmlns="http://www.springframework.org/schema/beans"
  66.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  67.        xmlns:content="http://www.springframework.org/schema/context"
  68.        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">
  69.    
  70.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  71. </beans>return article;    }}
复制代码
可以看见有两个 Article 类被存储在了 Spring 中,如果直接使用 @Autowired 或者 @Resource 就会报错,不晓得究竟想要注入哪个对象
  1. public class Start {    public static void main(String[] args) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");<?xml version="1.0" encoding="UTF-8"?>
  9. <beans xmlns="http://www.springframework.org/schema/beans"
  10.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  11.        xmlns:content="http://www.springframework.org/schema/context"
  12.        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">
  13.    
  14.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  15. </beans>ArtController artController = context.getBean("artController",ArtController.class);<?xml version="1.0" encoding="UTF-8"?>
  16. <beans xmlns="http://www.springframework.org/schema/beans"
  17.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  18.        xmlns:content="http://www.springframework.org/schema/context"
  19.        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">
  20.    
  21.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  22. </beans>artController.findArticle();    }}
复制代码
获取到 ArtController 类,对其进行使用
方法一:使用@Resource
@Resource 注解是可以设置很多参数,可以进行 beanName 的设置,name = 不可以省略
  1. public class ArtController {    @Resource(name = "article1")    private Article article;    public void findArticle() {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>System.out.println(article);    } }
复制代码
方法二:@Autowired + @Qualifier
如果一定要使用 @Autowired 注解,就需要配合 @Qualifier 一起使用,value = 可以省略
  1. @Controllerpublic class ArtController {    @Autowired    @Qualifier(value = "article2")    private Article article;    public void findArticle() {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:content="http://www.springframework.org/schema/context"
  5.        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">
  6.    
  7.     <content:component-scan base-package="com.bit.beans"></content:component-scan>
  8. </beans>System.out.println(article);    } }
复制代码
完~~~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4