Spring 存储Bean的相关注解

文章介绍了Spring中如何使用注解简化Bean对象的存储和获取,包括@Controller,@Service,@Repository,@Component,@Configuration等类注解的用途,以及@Bean方法注解的使用。同时,文章讨论了对象装配的三种方式:属性注入、构造方法注入和setter注入,分析了各自的优缺点。此外,提到了@Resource和@Autowired的区别,以及处理同类型多个Bean注入的方法。
摘要由CSDN通过智能技术生成

一. 前言

二. 更加简单的存储和使用Bean对象

  1. 类注解
  2. 方法注解

三. 获取Bean对象(对象装配)

  1. 属性注入
  2. Setter注入
  3. 构造方法注入(官方推荐)


一.前言

创建 Spring 项目

创建项目 ---> 存储Bean对象 ---> 取出Bean对象

 然后,配置xml,添加Spring 依赖

 每次,这样存储Bean对象,比较麻烦,所以,引入注解,来帮我们减轻负担

二 . 添加存储对象的注解
        1. 类注解
  • Controller  控制层 (前端参数检验合法性)
  • Service  服务层 (数据的组装和接口的调用)
  • Repository  数据持久层 (负责与数据库进行交互)
  • Component  组件 (工具类)
  • Configuration 配置层 (系统运行前,提前加载资源)

添加注解演示

@Controller
public class UserController {
    public void say(){
        System.out.println("hello Controller");
    }
}

取Bean对象

public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //bean id为类名改写为小驼峰方式
        UserController userController = context.getBean("userController",UserController.class);
        userController.say();
    }
}

其他 四种添加注解方式相同

这里强调一下 类注解Bean对象的命名规则

1. 命名的id 首字母大写,则采用小驼峰的格式,变成小写模式

2. 命名的id 前两个字母都是大写,则不改变格式,直接用原id

规则很简单,原因就是idea 的源码

既然,使用方法相同,为什么要用五个类注解,一个不就好了吗? 一劳永逸

        存在必有价值,所以,到底是为什么呢?

        让程序员看到注解,就知道当前类的用途


这里给大家举个例子

        就好比我们看一本书时,每一章的标题,让我们可以大概知道这一章节给读者描述了发生了什么

        2.方法注解

                @Bean注解加到方法上,将方法的返回值添加到容器中

                注意: @Bean注解必须结合五大类注解来使用,并且方法必须有返回值

代码示例

@Controller
public class Student {

    @Bean("lover")
    public StudentDemo lover(){
        StudentDemo student = new StudentDemo();
        student.setName("恩恩");
        return student;
    }
}
 public static void main(String[] args) {

        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        StudentDemo student = (StudentDemo) context.getBean("lover");
        System.out.println(student.getName());
    }

运行结果

 

三 . 获取Bean对象(对象注入)

 

对象装配(对象注⼊)的实现⽅法以下 3 种:
  •  属性注⼊
  •  构造⽅法注⼊
  •  Setter 注⼊
1. 属性注入
        属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。

@RestController
public class UserController {
    // 属性对象
    @Autowired
    private UserService userService;
 
    public UserInfo add(String username) {
        return userService.add(username);
    }
}

优点:

  • 属性注入最大的优点就是实现简单、使用简单

缺点:

  1. 功能性问题:无法注入一个不可变的对象(final 修饰的对象);
  2. 通用性问题:只能适应于 IoC 容器;
  3. 设计原则问题:更容易违背单一设计原则。
2. 构造方法注入

        构造⽅法注⼊是在类的构造⽅法中实现注入

        如果当前类中只存在一个构造方法的话,那么@Autowired可以省略,多个构造方法时

        则不可以省略

@RestController
public class UserController {
    // 构造方法注入
    private UserService userService;
 
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
 

优点:

  • 通常 Setter 只注入 set 一个属性,更符合单一设计原则

缺点: 

  1.  无法注入final修饰的变量
  2.  Setter 注入的对象可以被修改

3. Setter 注入
@RestController
public class UserController {
    // Setter 注入
    private UserService userService;
 
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

优点:

  • 1. 可以注入被final 修饰的变量
  • 2. 注入的对象不会被修改
  • 3.构造方法注入可以保证注入对象完全初始化
  • 4.构造方法注入通透性比较好

缺点:

  • 1.用法比较复杂
  • 2.无法解决循环依赖问题

  

4. @Resource 另一种注入关键词

@Autowired与@Resource区别

  • 出身不同:@Resource来自于jdk,@Autowired时Spring框架提供的
  • 用法不同:@Autowried可以用于属性注入,构造方法注入,Setter注入,@Resource不支持构造方法注入
  • 参数不同:@Resource支持更多的参数设置,比如name,type,而@Autowried只支持required参数
     

同⼀类型多个 Bean 报错处理
  1. 精确的描述bean的名称(将注入的名称写对)
  2. 使用 @Rsource 设置 name 方式来重命名注入对象
  3. 使用@Autowired + @Qualifier来筛选bean对象

1 . 使用@Rsource ( name =  xxx)

@Controller
class UserController {
 // 注⼊
      @Resource(name = "user1")
      private User user;
   public User getUser() {
       return user;
 }
}

2. 使用 @Qualifier

@Controller
public class UserController {
     // 注⼊
     @Autowired
     @Qualifier(value = "user2")
     private User user;
     public User getUser() {
         return user;
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值