spring 存储对象 + 获取对象


前言

本篇在spring中如何使用五大类注释与方法注释将对象加入IOC容器中,了解如何使用注释来获取容器中的Bean对象,如有错误,请在评论区指正,让我们一起交流,共同进步!


文章目录

  • 前言
    • 1.通过注释将类加入IoC容器中
      • Maven项目创建,前提准备:
      • 添加注释 - 储存Bean对象
        • 1.类注释存储spring
        • java中的标准分层 - 写程序时根据这些分层
        • 2.方法注释存储Bean对象
    • 2. 获取Bean对象 / 对象装配
      • 属性注入
      • 构造方法注入
      • Setter注入
  • 总结

本文开始

1.通过注释将类加入IoC容器中

Maven项目创建,前提准备:

1.查看是否添加依赖成功

spring 存储对象 + 获取对象_第1张图片

2.配置扫描路径:自定义
位置处于自己创建的.xml文件中,路径内容只需要修改自己创建的路径即可;
配置完路径:会扫描路径下的类,有注释的加入容器中;

在这里插入图片描述

添加注释 - 储存Bean对象

1.类注释存储spring

类注释的目的:看到类注释,就能了解当前类的用途;
a)@Controller:控制器存储,校验参数合法性;
b)@Service:服务存储,业务组装(方法组装),看调用什么方法,不进行业务的实现;- 告诉你办理什么业务;
c)@Repository:仓库存储(数据持久层),进行实际业务的处理 ; - 实际去办一个个业务;
d)@Component:组件存储,工具类层,通用的工具;
e)@Configuration:配置存储,配置层,对项目进行设置;

使用: - 在所创建的类上,添加对应注释即可;

spring 存储对象 + 获取对象_第2张图片

【注】

  • Bean的命名规则:(获取加注解的默认id)对于第一个字母大写,第二个字母小写默认id使用小写 - 符合规则前两个字母小写;StudentUser => studentUser
    不满足首字母大写 && 第二个字母小写,使用原来id - 非默认情况,id为原类名不变;THead => THead

Bean的命名规则源码:

spring 存储对象 + 获取对象_第3张图片

  • 存储Bean,可以使用注解存储,也可以使用xml,存储Bean,二者也可以混用;(类不在同一个包里,可以使用Bean的方式存储)

java中的标准分层 - 写程序时根据这些分层

spring 存储对象 + 获取对象_第4张图片

2.方法注释存储Bean对象

【注】
1.@Bean注释,加在方法上的;
2.@Bean注释,必须配合五大类注释一起使用;

为什么需要与五大类注释配合使用呢?
方法太多,寻找一个方法,可能会扫描包下的所有方法,相比较来说类比较少,通过类找方法会快很多;

@Bean与五大类配合使用代码示例:
推荐使用@Component

spring 存储对象 + 获取对象_第5张图片

3.获取@Bean命名方式:@Bean的默认命名 == 方法名(id == 方法名)

但是这样命名有弊端,如果方法名为getxxx(), setxxx(), 这样调用这个对象是不恰当的,所以就需要给方法重新命名;再获取Bean对象就是根据重命名来获取;

重命名@Bean方式:给@Bean添加属性,设置名称;
a)@Bean(“abc”) : 没写属性,直接命名
b)@Bean(name = “bb”) : 写属性name并设置命名
c)@Bean(value = “cc”) :写属性value并命名

【注】
① 命名可以指定多个命名 : @Bean(name = {“aa”, “bb”})
② 对@Bean重命名后,就不能使用原来的方法名来获取对象;
③ 对于类注释,不支持起多个命名;(相当于不能给一个类取多个命名)
④ 对于@Bean名称,如果多个@Bean使用相同的名称,程序不报错,在同一个类中,除第一个@Bean之后的对象不会被存放到容器中,再有相同名称的Bean存储时,容器自动忽略不存储;

如果使用@Bean重命名,命名名称一样:就需要根据加载顺序来确定,通过@Order() 来声明一个类的加载时机,@Order() 中括号中的值越大,就先加载通过那个类;
@Order(100) > @Order(1) ;

spring 存储对象 + 获取对象_第6张图片

2. 获取Bean对象 / 对象装配

获取对象 / 对象注入:取出一个对象放到某个类中;

获取对象的注释:@Autowired 或者 @Resource

@Resource注入 作用类似 @Autowired 二者区别:
1.@Resource 来自 jdk; @Autowired 来自Spring框架;
2.支持参数个数不同:@Resource 支持多参数设置;@Autowired 只支持一个参数设置;
3.使用方式不同:@Resource 不支持构造方法注入;@Autowired 支持构造方法注入;
4.idea兼容性支持不同:@Resource 不存在报错情况;@Autowired 在专业版情况下可能报错;(解决报错方法:@Autowired(required = false) 给括号中设置false值,表明此时对象不存在也可以)

属性注入

属性注入属于:通过注释从容器中获取对象,注入到设置的变量中,在之后的方法中就能使用;

优点:属性注入,使用简单;
缺点:无法注入 final 修饰的对象;
通用性 - 只适用于 IoC容器;
【注】被final修饰的变量需要直接复制 或者 在构造方法中进行赋值;

spring 存储对象 + 获取对象_第7张图片

问题:同一类型Bean存储到容器多个,获取Bean时出现错误;

spring 存储对象 + 获取对象_第8张图片

解决方式:
a) 将属性的名字 和 Bean的名字对应上;

spring 存储对象 + 获取对象_第9张图片

b) 使用@Autowried + @Qualifier()进行筛选

spring 存储对象 + 获取对象_第10张图片

c) 使用@Resource 设置name名称指定获取某个对象;

在这里插入图片描述

构造方法注入

构造方法注入使用:在构造方法上添加@Autowired, 从容器中获取UserRepository对象注入到对应属性中;

优点:可以注入一个final修饰的对象;
注入的对象不会被修改,构造方法 只会加载一次;
构造方法注入可以保证 对象完全初始化;
构造方法通用性更好;
缺点
写法复杂;
使用构造方法注入,无法解决循环依赖的问题;

@Service
public class User4 {
    private UserRepository userRepository;
//在构造方法上添加@Autowired
    @Autowired
    public User4(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

Setter注入

setter注入使用:在setter方法上加上@Autowired, 在执行对应类时,会从容器中拿到对象,并注入到setter中的参数;

优点:符合单一设计原则 - Setter只有set一个属性
缺点:无法注入final修饰的变量;
setter注入的对象可以被修改;(setter本身可能被多次调用修改)

@Service
public class User3 {
    private UserRepository userRepository;
    //@Autowired注释setter就会从容器中获取对应对象,再注入到对应参数UserRepository属性中;
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

你可能感兴趣的:(spring,spring,java,后端,对象存取)