Spring如何更简易的存储(注解)和读取Bean对象?

目录

1.存储Bean对象

1.1 添加注解的前提 (添加配置)

1.2 使用Spring注解存储Bean对象

 1.2.1实例:@Controller(控制器存储)的使用

Bean对象:

启动类MainApp

执行结果

一些由于命名引发的问题(适用于五大类注解)

1.3 设置多种注解的原因 

1.4 五大类注解之间的关系

1.5 Bean方法的命名规则

2. 获取

2.1 通过@Autowired进行属性注入

2.1.1 内容 

2.1.2 缺点

2.2 setter注入

2.2.1 内容

​编辑 2.2.2 缺点

2.2.3 优点

 2.3 构造方法注入

2.3.1 内容 

2.3.2 优点

2.4 方法注入的两个关键字(@Autowired和@Resourse)

2.5 同⼀类型多个 @Bean 报错

 


Spring如何更简易的存储(注解)和读取Bean对象?_第1张图片

1.存储Bean对象

1.1 添加注解的前提 (添加配置)

配置:将哪个路径下的所有包注入到Spring容器中。

Spring如何更简易的存储(注解)和读取Bean对象?_第2张图片



    
    

1.2 使用Spring注解存储Bean对象

 介绍:可以使用Spring的@Component、@Service等注解将一个类标记为Spring的Bean,并由Spring容器管理。这样,对象的创建和销毁都由Spring容器控制,可以简化代码(不用去一个个写bean id="***"class="**")。

在Spring框架中,有几个重要的类级别注解可以用于描述Spring Bean。以下是其中一些常见的类注解

1. `@Component`:组件。

2. `@Controller`:MVC控制器类

3. `@Service`:服务类。

4. `@Repository`:数据访问对象(DAO)类。

5. `@Configuration`:Java配置类,其中包含了一组Bean定义。

方法注解: @Bean

 1.2.1实例:@Controller(控制器存储)的使用

Bean对象:

Spring如何更简易的存储(注解)和读取Bean对象?_第3张图片

package com.demo.component;
import org.springframework.stereotype.Controller;
@Controller
//有这个注解,在resourse资源里面就不用再设置bean id=" " class=" " ,在从Spring里面获取bean对象
//context.getBean("这里的内容就是类的名字首字母小写",类名.class);
public class ArticleController {
    public String sayHello(){
        return "Hello,Controller";
    }
}
启动类MainApp

Spring如何更简易的存储(注解)和读取Bean对象?_第4张图片

import com.demo.component.ArticleController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        // 加载Spring配置文件即创建Spring上下文;
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");


        ArticleController articleController = context.getBean("articleController", ArticleController.class);
        System.out.println(articleController.sayHello());

    }
}
执行结果

Spring如何更简易的存储(注解)和读取Bean对象?_第5张图片

这样,我们就通过注解达到简化代码的目的!


一些由于命名引发的问题(适用于五大类注解)

默认规则都是首字母小写

1.如果类名首字母也是小写的,要如何从Spring中获取Bean?如名为 bController没问题

和首字母大写的情况一样;类名首字母小写。bController

原类名

2.如果首字母和第二个字母都是大写,如 BController,【️】如何获取Bean对象?

正确方式:使用原类名!!!BController

如果还是默认规则context.getBean("bController",BController.class)的结果:报错

当不管时

Spring如何更简易的存储(注解)和读取Bean对象?_第6张图片

1.3 设置多种注解的原因 

五大类注解用途

1.@ Controller (控制器):归属于业务逻辑层,用来控制用户的行为,它用来检查用户参数的有效性。
2.@ Service (服务):归属于服务层,调用持久化类实现相应的功能。【不直接和数据库交互的,它类似于控制中心】

3.@ Repository (仓库):归属于持久层,是直接和数据库进行交互的。通常每一个表都会对应一个@ Repository .

4.@ Configuration (配置):归属于配置层,是用来配置当前项目的一些信息。5.Component(组件):归属于公共工具类,
Spring如何更简易的存储(注解)和读取Bean对象?_第7张图片

1.4 五大类注解之间的关系

@component是其他四个类的父类 

1.5 Bean方法的命名规则

Spring如何更简易的存储(注解)和读取Bean对象?_第8张图片

1.@Bean方法类注解必须搭配类注解使用;

2.Bean name 默认情况下是方法名;

3.不同类之间可以有相同的方法名,比如第一个类中人名”张三“,已经被加载过来,后续第二个类人名”李四“,使用  context.getBean("student",Student.class)打印出来的就只有张三,为了获取到李四,我们可以在@Bean注解后面添加如下代码,就可以通过context.getBean("s1",Student.class)来获取到!

但是当我们删除了“张三”对应的那个类,通过context.getBean("student",Student.class)来获取李四观察到获取不到?!

使用@Bean注解给对象进行重命名之后,此时就不能原方法名进行获取!

就相当于新车买回来是没牌的但是交警也会让你上路,但是发了新牌后,你把它取下来,那就!

Spring如何更简易的存储(注解)和读取Bean对象?_第9张图片

2. 获取

2.1 通过@Autowired进行属性注入

2.1.1 内容 

这里不再使用new的方法,而是Spring框架赋值

Spring如何更简易的存储(注解)和读取Bean对象?_第10张图片

2.1.2 缺点

  • 无法注入不可变的对象(final修饰的对象);
  • 只适用于loC容器;
  • 更容易违背单一性设计原则;

2.2 setter注入

2.2.1 内容

假设有一个类A,需要依赖类B的实例,那么可以在类A的属性上添加@Autowired注解,并定义对应的setter方法:

public class A {
    private B b;

    @Autowired
    public void setB(B b) {
        this.b = b;
    }
}

Spring如何更简易的存储(注解)和读取Bean对象?_第11张图片 2.2.2 缺点

  • 无法注入不可变对象(final修饰的)
  • 容易被修改(set注入的方法setStudentService仍是普通方法,也会被重复调用会造成被修改的风险)
  • Spring如何更简易的存储(注解)和读取Bean对象?_第12张图片

2.2.3 优点

相对于属性注入的方法更加单一 ,每一个setter都只针对一个对象。

 2.3 构造方法注入

从Spring 4.x后就受到推荐。

2.3.1 内容 

规则:

当一个类中只有一个构造方法,可以省略@Autowired;

当一个类中有多个构造方法,必须加上@Autowired;

Spring如何更简易的存储(注解)和读取Bean对象?_第13张图片

2.3.2 优点

  •  可以注入不可变对象Spring如何更简易的存储(注解)和读取Bean对象?_第14张图片
  • 注入的对象不会被修改1.加上了final修饰符,2. 构造方法随着类加载只执行一次(不会像set一样)
  • 注入的对象会完全初始化;
  • 通用性更好

2.4 方法注入的两个关键字(@Autowired和@Resourse)

相同点:都是用来实现依赖注入的。
不同点:
1.   功能支持不同:@ Autowired 支持属性注入、 setter 注入、构造方法注入;@ Resource 支持属性、 setter 注入,但不支持构造方法注入
2.出身不同:@ Autowired 来自 Spring 框架;而@ Resource 来自于 JDK .
3.参数支持不同:@ Resource 支持更多的参数设置;而@ Autowired 只支持 required 参数。
 

2.5 同⼀类型多个 @Bean 报错

解决同⼀个类型,多个 bean 的解决⽅案有以下两个:
  • 使⽤ @Resource(name="user1") 定义。
  • 使⽤ @Qualifier 注解定义名称。

在Spring中,如果你在同一个配置类中定义了多个相同类型的@Bean方法,会导致冲突,并引发错误。这是因为Spring无法确定应该使用哪个Bean。

解决这个问题的方法有两种:

1. 使用@Bean注解的name属性:
   你可以给每个@Bean方法添加唯一的name属性,以区分它们。示例如下:

   @Configuration
   public class MyConfig {
    
       @Bean(name = "bean1")
       public MyBean myBean1() {
           return new MyBean();
       }
    
       @Bean(name = "bean2")
       public MyBean myBean2() {
           return new MyBean();
       }
   
   }

   在其他地方需要使用特定的Bean时,可以通过指定名称来获取:
 

   @Autowired
   @Qualifier("bean1")
   private MyBean myBean;

2. 使用不同的配置类或分离配置:
   如果你希望有多个相同类型的Bean存在于应用程序中,可以将它们定义在不同的配置类中,或者将它们分离到不同的包下。这样每个配置类都负责定义自己特定的Bean,避免了冲突。

   示例:
 

 @Configuration
   public class AppConfig1 {
    
       @Bean
       public MyBean myBean1() {
           return new MyBean();
       }
    
   }

   @Configuration
   public class AppConfig2 {

       @Bean
       public MyBean myBean2() {
           return new MyBean();
       }

   }

   在其他地方需要使用特定的Bean时,可以按照需要选择相应的配置类进行引入。

你可能感兴趣的:(JavaEE,Java,spring,数据库,java)