• Spring 更简单的读取和存储Bean【注解篇,属性注入,set注入,构造方法注入】


    更加简单的存取Bean对象:

    一. 五大类注解和一个方法注解

            @Controllor:控制器,验证用户请求数据的正确性;【安保】

            @Service:服务层,编排和调度具体的执行方法;【服务台】

            @Repository:持久层,数据访问层,与数据库做交互;【执行者,数据访问】

            @Component:组件,存放工具类;【工具】

            @Configuration:配置项【基础配置】

            @Bean【唯一的方法注解】

    二.spring-config中配置扫描路径

    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. <content:component-scan base-package="com.bit.service"></content:component-scan>
    7. </beans>

     其中,在com.bit.service中的类添加了五大类注解,可以被添加到Spring容器中,其他没在配置文件中扫描的路径,无法被添加到Spring容器

    三、方法注解@Bean存取对象

    默认情况下,原类名的首字母小写【小驼峰】或原类名【开头两个及以上的字母均为大写】

    3.1存对象 

    1. @Component
    2. public class UserBeans {
    3. @Bean
    4. public Student student1(){
    5. Student student = new Student();
    6. student.setAge(18);
    7. student.setId(210210210);
    8. student.setName("zhangsan");
    9. return student;
    10. }
    11. @Bean
    12. public Teacher teacher1(){
    13. Teacher teacher = new Teacher();
    14. teacher.setAge(25);
    15. teacher.setId(22222222);
    16. teacher.setName("老师");
    17. return teacher;
    18. }
    19. }

    存对象:在上述student1()和teacher1()方法中,都加了@Bean注解,该注解的作用是将被其修饰的方法的返回值存放到 Spring 中 

     3.2取对象

    1. public static void main(String[] args) {
    2. ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    3. Teacher teacher = context.getBean("teacher1",Teacher.class);
    4. teacher.sayHi();
    5. }

    取对象:将@Bean修饰的方法名和类型传给上下文对象进行获取 

    注意:方法注解

    1.  ①方法名就是->实体名 ②类要有五大类注解,配合使用 ③必须要有返回值

    2. 重命名,可以起多个名字

    3. 当重命名之后,原方法名就不能获取到对象了 

    4. 允许同样的对象在Spring中存储多个  

    5. 存在不同方法中方法名相同且都被Bean修饰,可以通过@Order(int) 改变注入顺序,越小优先级越高 

    6. 可不可以和包下同时使用------>可以

    四、更简单的读取Bean【不能在启动类使用 static的优先级高于Spring】

    1.属性注入  先判断类型读取,当有多个就根据起的变量名字进行读取【在属性上@Autowired】

    缺点:①没办法实现final修饰的的变量注入②只适用于IoC中(兼容性不好)③违背单一设计原则概率更大

     【UserService代码(伪代码)】

    1. @Service
    2. public class UserService {
    3. public Teacher getUserById(int id){
    4. //......
    5. Teacher teacher =new Teacher();
    6. teacher.setId(22);
    7. System.out.println("UserService->getUserId");
    8. return teacher;
    9. }
    10. }

      【StudentController代码】

    1. @Controller //将当前类存储到Spring中
    2. public class StudentController {
    3. @Autowired
    4. private UserService userService;
    5. public void sayHi(){
    6. System.out.println("Student Hi~");
    7. }
    8. public Teacher getById(int id){
    9. return userService.getUserById(id);
    10. }
    11. }

     【启动类】

    1. public static void main(String[] args) {
    2. ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    3. // Teacher teacher = context.getBean("teacher1",Teacher.class);
    4. // teacher.sayHi();
    5. StudentController studentController = context.getBean(StudentController.class);
    6. studentController.getById(59);
    7. }

    其中体现是属性注入 的语句是:在属性上直接添加了@Autowired注解,直接从Spring容器中获取

    2.Setter注入【普通的set方法】【在set方法上加@Autowired】

    利用@Autowired给方法,可以给方法的参数中的对象进行注入

    优点:每次只传递一个对象,符合单一设计原则

    缺点:①没办法实现final修饰的的变量注入②使用Setter注入的对象可能会被修改

    1. @Controller //将当前类存储到Spring中
    2. public class StudentController {
    3. private UserService userService;
    4. //set注入
    5. @Autowired
    6. public void setUserService(UserService userService) {
    7. this.userService = userService;
    8. }
    9. public void sayHi(){
    10. System.out.println("Student Hi~");
    11. }
    12. public Teacher getById(int id){
    13. return userService.getUserById(id);
    14. }
    15. }

    区别于属性注入在于在set方法上加上@Autowired 

    3.构造方法注入(Spring官方推荐)【构造方法上加@Autowired】

    如果仅有一个构造方法,可以不加@Autowired

    优点:1.可以注入final的对象2.注入对象不会被改变(构造方法只执行一次)3.可以保证注入对象完全被初始化4.通用性更好 

    1. @Controller //将当前类存储到Spring中
    2. public class StudentController {
    3. //构造方法注入
    4. private UserService userService;
    5. @Autowired
    6. public StudentController(UserService userService) {
    7. this.userService = userService;
    8. }
    9. public void sayHi(){
    10. System.out.println("Student Hi~");
    11. }
    12. public Teacher getById(int id){
    13. return userService.getUserById(id);
    14. }
    15. }

    在构造方法上加入@Autowired 

    问题:为什么构造方法可以注入一个不可变的对象,而属性注入和Setter不行?

    答:在 Java 中规定被 final 对象必须满足一下两个条件的其中一个

    ①创建时直接赋值②构造方法赋值

  • 相关阅读:
    大厂linux运维面试题库(二)
    官宣出自己的博客啦
    【项目】云备份系统基础功能实现
    openmp 通用核心 学习 2 数据环境—任务-内存模型
    音视频技术在手机上的应用与挑战
    后端思维之数据库性能优化方案
    Opencv项目实战:09 物体尺寸测量
    Python编程实验五:文件的读写操作
    [附源码]JAVA毕业设计婚纱影楼服务管理(系统+LW)
    JavaScript常用函数
  • 原文地址:https://blog.csdn.net/qq_62270879/article/details/133277437