Spring【五大类注解的存储和读取Bean方法注解】(下)

简介: Spring【五大类注解的存储和读取Bean方法注解】(下)

🍉1.3.3 getBean() 命名


我们会在前面的存储和获取对象时发现,为什么在getBean方法获取Bean对象时要将Bean对象的属性名输入为小驼峰型?

ab784bbf15424b14bcb65944158626bc.png


我们在源码就可以看出这三种情况,我就不过多解释了,大家应该都能读懂


8b26b31889364b04a26eb01bd98ea4fe.png

🍎二.方法注解的存储


🍒2.1 方法注解的存储


🍉2.1.1 @Bean注解的使用


我们先创建一个班级类


@Component
public class User {
    private String name;
    private int Id;
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", Id=" + Id +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return Id;
    }
    public void setId(int id) {
        Id = id;
    }
}

之后在创建一个方法类我们要注意在定义方法Bean时也要定义五大类注解其一因为⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中才能获取到

@Component
public class UserBean {
    @Bean
    public User user1(){
        User user = new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}


public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserConfiguration configuration = context.getBean("userConfiguration",UserConfiguration.class);
        User user = (User) context.getBean("user1");
        System.out.println(user.toString());
    }
}

c682890ea7dd4c2892e7e5f1678924e5.png


🍉2.1.2 @Bean的的重命名


可以通过设置 name 属性给 Bean 对象进⾏重命名操作,如下图所示:


95c91b7cfdba4e3fa4fb423da6451162.png

这个重命名的 name 其实是⼀个数组,⼀个 bean 可以有多个名字:


@Bean(name = {"u1", "us1"})
public User user1() {
   User user = new User();
   user.setId(1);
   user.setName("Java");
   return user;
}

在Bean name重名的时候时区分大小写的



a97c4a0fb2bf4284873beead187625a3.png

eb499e64dd2a4053a62d9dfa604c30e6.png

我们会发现会找不到bena name抛出错误


38b2392241884e739ab0e431296f5622.png


🍒2.2 方法注解的获取(对象注⼊@Autowired 或 @Resource)


获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊

对象装配(对象注⼊)的实现⽅法以下 3 种:


  1. 属性注⼊
  2. Setter 注⼊
  3. 构造⽅法注⼊


🍉2.2.1 属性注⼊


属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。

Service 类的实现代码如下:


public class Test {
    public static void main(String[] args) {
          UserConterller2 conterller2 = context.getBean(UserConterller2.class);
                  conterller2.sayHi();
    }
}
@Component
public class UserConterller2 {
   //对象注入方式1: 属性注入
   @Autowired
    private UserService userService;
    public void sayHi(){
        userService.sayHi("属性注入");
    }

ed08a0a4fbbb49e7b2e1931618e45861.png

🍉2.2.2 Setter注入


与上同理

1ca644d0916f43279168976928eeb0b7.png


🍉2.2.2 构造方法注入


3f32174b7245454fa302575b8f9351da.png

🍉2.2.3 同⼀类型多个 @Bean 报错


当出现以下多个 Bean,返回同⼀对象类型时程序会报错,如下代码所示:

@Component
public class Users {
   @Bean
   public User user1() {
     User user = new User();
     user.setId(1);
     user.setName("Java");
     return user;
   }
     @Bean
     public User user2() {
     User user = new User();
     user.setId(2);
     user.setName("MySQL");
     return user;
    }
}
@Controller
public class UserController4 {
   // 注⼊
   @Resource
   private User user;
   public User getUser() {
     return user;
   }
}

以上程序的执⾏结果如下:


cf6d73445fe743ef887a5f155d8cc6ad.png

报错的原因是,⾮唯⼀的 Bean 对象


解决同⼀个类型,多个 bean 的解决⽅案有以下两个:

● 使⽤ @Resource(name=“user1”) 定义

● 使⽤ @Qualifier 注解定义名称

同⼀类型多个 Bean 报错处理


🍎三.总结

🍒3.1小结


将对象存储到 Spring 中:

a. 使⽤类注解:@Controller、@Service、@Repository、@Configuration、@Component【它们之间的关系】

b. 使⽤⽅法注解:@Bean【注意事项:必须配合类注解⼀起使⽤】

Bean 的命名规则:⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean,如果⾸字⺟和第⼆个字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。

从 Spring 中获取对象:

a. 属性注⼊

b. Setter 注⼊

c. 构造函数注⼊(推荐)

注⼊的关键字有:

a. @Autowired

b. @Resource

@Autowired 和 @Resource 区别:出身不同; 使⽤时设置参数不同 @Resource ⽀持更多的参数,⽐如 name。

解决同⼀类型多个 Bean 的报错:

a. 使⽤ @Resource(name="")

b. 使⽤ @Qualifier("")


🍒3.2 三种注⼊优缺点分析


●属性注⼊的优点是简洁,使⽤⽅便;缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)


●构造⽅法注⼊是 Spring 推荐的注⼊⽅式,它的缺点是如果有多个注⼊会显得⽐较臃肿,但出现这种情况你应该考虑⼀下当前类是否符合程序的单⼀职责的设计模式了,它的优点是通⽤性,官方推荐,在使⽤之前⼀定能把保证注⼊的类不为空


●Setter ⽅式是 Spring 前期版本推荐的注⼊⽅式,但通⽤性不如构造⽅法,所有 Spring 现版本已经推荐使⽤构造⽅法注⼊的⽅式来进⾏类注⼊了


🍒3.3 @Autowired 和 @Resource 的区别


●出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解


●使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如name ,type设置,根据名称获取 Bean


●注入方法数不同: @Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注⼊和属性注⼊,不能⽤于构造函数注⼊

相关文章
|
23小时前
|
XML Java 数据格式
Spring框架学习 -- Bean的生命周期和作用域
Spring框架学习 -- Bean的生命周期和作用域
13 2
|
23小时前
|
存储 XML Java
Spring框架学习 -- 读取和存储Bean对象
Spring框架学习 -- 读取和存储Bean对象
11 0
Spring框架学习 -- 读取和存储Bean对象
|
1天前
|
Java Python Spring
小唐开始学 Spring Boot——(2)Spring Boot核心配置与注解
小唐开始学 Spring Boot——(2)Spring Boot核心配置与注解
|
7天前
|
Java
Springboot 使用自定义注解结合AOP方式校验接口参数
Springboot 使用自定义注解结合AOP方式校验接口参数
Springboot 使用自定义注解结合AOP方式校验接口参数
|
9天前
|
XML 前端开发 Java
【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)
【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)
12 0
|
9天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
65 0
|
9天前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
143 0
|
9天前
|
存储 JSON Java
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
50 2
|
9天前
|
前端开发 搜索推荐 Java
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
|
9天前
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置